|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.apache.hadoop.hdfs.util.Diff<K,E>
K
- The key type.E
- The element type, which must implement Diff.Element
interface.public class Diff<K,E extends Diff.Element<K>>
The difference between the current state and a previous state of a list. Given a previous state of a set and a sequence of create, delete and modify operations such that the current state of the set can be obtained by applying the operations on the previous state, the following algorithm construct the difference between the current state and the previous state of the set.
Two lists are maintained in the algorithm: - c-list for newly created elements - d-list for the deleted elements Denote the state of an element by the following (0, 0): neither in c-list nor d-list (c, 0): in c-list but not in d-list (0, d): in d-list but not in c-list (c, d): in both c-list and d-list For each case below, ( , ) at the end shows the result state of the element. Case 1. Suppose the element i is NOT in the previous state. (0, 0) 1.1. create i in current: add it to c-list (c, 0) 1.1.1. create i in current and then create: impossible 1.1.2. create i in current and then delete: remove it from c-list (0, 0) 1.1.3. create i in current and then modify: replace it in c-list (c', 0) 1.2. delete i from current: impossible 1.3. modify i in current: impossible Case 2. Suppose the element i is ALREADY in the previous state. (0, 0) 2.1. create i in current: impossible 2.2. delete i from current: add it to d-list (0, d) 2.2.1. delete i from current and then create: add it to c-list (c, d) 2.2.2. delete i from current and then delete: impossible 2.2.2. delete i from current and then modify: impossible 2.3. modify i in current: put it in both c-list and d-list (c, d) 2.3.1. modify i in current and then create: impossible 2.3.2. modify i in current and then delete: remove it from c-list (0, d) 2.3.3. modify i in current and then modify: replace it in c-list (c', d)
Nested Class Summary | |
---|---|
static class |
Diff.Container<E>
Containing exactly one element. |
static interface |
Diff.Element<K>
An interface for the elements in a Diff . |
static class |
Diff.ListType
|
static interface |
Diff.Processor<E>
An interface for passing a method in order to process elements. |
static class |
Diff.UndoInfo<E>
Undo information for some operations such as delete(E) and modify(Element, Element) . |
Constructor Summary | |
---|---|
protected |
Diff()
|
protected |
Diff(List<E> created,
List<E> deleted)
|
Method Summary | ||
---|---|---|
Diff.Container<E> |
accessCurrent(K name)
Find an element in the current state. |
|
Diff.Container<E> |
accessPrevious(K name)
Find an element in the previous state. |
|
List<E> |
apply2Current(List<E> current)
Apply the reverse of this diff to current state in order to obtain the previous state. |
|
List<E> |
apply2Previous(List<E> previous)
Apply this diff to previous state in order to obtain current state. |
|
void |
combinePosterior(Diff<K,E> posterior,
Diff.Processor<E> deletedProcesser)
Combine this diff with a posterior diff. |
|
int |
create(E element)
Create an element in current state. |
|
Diff.UndoInfo<E> |
delete(E element)
Delete an element from current state. |
|
List<E> |
getList(Diff.ListType type)
|
|
boolean |
isEmpty()
|
|
Diff.UndoInfo<E> |
modify(E oldElement,
E newElement)
Modify an element in current state. |
|
E |
search(Diff.ListType type,
K name)
|
|
protected static
|
search(List<E> elements,
K name)
Search the element from the list. |
|
int |
searchIndex(Diff.ListType type,
K name)
|
|
String |
toString()
|
|
void |
undoCreate(E element,
int insertionPoint)
Undo the previous create(E) operation. |
|
void |
undoDelete(E element,
Diff.UndoInfo<E> undoInfo)
Undo the previous delete(E) operation. |
|
void |
undoModify(E oldElement,
E newElement,
Diff.UndoInfo<E> undoInfo)
Undo the previous modify(E, E) operation. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Constructor Detail |
---|
protected Diff()
protected Diff(List<E> created, List<E> deleted)
Method Detail |
---|
protected static <K,E extends Comparable<K>> int search(List<E> elements, K name)
Collections.binarySearch(List, Object)
.
Note that, when the list is null, -1 is the correct insertion point.public List<E> getList(Diff.ListType type)
public int searchIndex(Diff.ListType type, K name)
public E search(Diff.ListType type, K name)
public boolean isEmpty()
public int create(E element)
public void undoCreate(E element, int insertionPoint)
public Diff.UndoInfo<E> delete(E element)
public void undoDelete(E element, Diff.UndoInfo<E> undoInfo)
public Diff.UndoInfo<E> modify(E oldElement, E newElement)
public void undoModify(E oldElement, E newElement, Diff.UndoInfo<E> undoInfo)
public Diff.Container<E> accessPrevious(K name)
Diff.Container
containing the
element in the previous state. Note that the element can possibly
be null which means that the element is not found in the previous
state.public Diff.Container<E> accessCurrent(K name)
Diff.Container
containing the element in
the current state. Note that the element can possibly be null which
means that the element is not found in the current state.public List<E> apply2Previous(List<E> previous)
public List<E> apply2Current(List<E> current)
public void combinePosterior(Diff<K,E> posterior, Diff.Processor<E> deletedProcesser)
1. For (c, 0) in the posterior diff, check the element in this diff: 1.1 (c', 0) in this diff: impossible 1.2 (0, d') in this diff: put in c-list --> (c, d') 1.3 (c', d') in this diff: impossible 1.4 (0, 0) in this diff: put in c-list --> (c, 0) This is the same logic as create(E). 2. For (0, d) in the posterior diff, 2.1 (c', 0) in this diff: remove from c-list --> (0, 0) 2.2 (0, d') in this diff: impossible 2.3 (c', d') in this diff: remove from c-list --> (0, d') 2.4 (0, 0) in this diff: put in d-list --> (0, d) This is the same logic as delete(E). 3. For (c, d) in the posterior diff, 3.1 (c', 0) in this diff: replace the element in c-list --> (c, 0) 3.2 (0, d') in this diff: impossible 3.3 (c', d') in this diff: replace the element in c-list --> (c, d') 3.4 (0, 0) in this diff: put in c-list and d-list --> (c, d) This is the same logic as modify(E, E).
posterior
- The posterior diff to combine with.deletedProcesser
- process the deleted/overwritten elements in case 2.1, 2.3, 3.1 and 3.3.public String toString()
toString
in class Object
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |