annotate src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/IndexJungleTreeEditor.java @ 149:feb2346ace19

refactor ParentIndex
author one
date Sat, 22 Nov 2014 12:08:35 +0900
parents 371b6ddb78f2
children d9fbddf77bf6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
2
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
3 import java.nio.ByteBuffer;
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
4 import java.util.Iterator;
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
5
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
6 import fj.P2;
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
7 import fj.data.List;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
8 import fj.data.TreeMap;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.IndexTreeEditor;
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren;
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.AppendChildAt;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
23 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
24 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
25 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
26 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
27 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
28 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
29 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
30 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
31 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.TreeMapOrd;
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 127
diff changeset
32 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.DefaultIndexEditor;
9c46e5c2ffac edit PutIndexEditor
one
parents: 127
diff changeset
33 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.DeleteChildIndexEditor;
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
34 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexEditor;
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
35 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
36
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
37 public class IndexJungleTreeEditor implements JungleTreeEditor {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
38 private final TransactionManager txManager;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
39 private final TreeNode root;
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
40 private final TreeNode oldRoot;
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
41 private final IndexTreeEditor editor;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
42 private final TreeOperationLog log;
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
43 private final TreeOperationLog tmpLog;
146
371b6ddb78f2 repair putAttributeIndex and deleteAttributeIndex
one
parents: 145
diff changeset
44 private TreeMap<String, TreeMap<String, List<TreeNode>>> index;
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
45 private ParentIndex parentIndex;
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
46
146
371b6ddb78f2 repair putAttributeIndex and deleteAttributeIndex
one
parents: 145
diff changeset
47 public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() {
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
48 return index;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
49 }
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
50
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
51 public IndexJungleTreeEditor(TreeNode _root, TreeNode oldRoot, TransactionManager _txManager,
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
52 IndexTreeEditor treeEditor, TreeMap<String, TreeMap<String, List<TreeNode>>> index,
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
53 ParentIndex parentIndex) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
54 this(_root, oldRoot, _txManager, treeEditor, new DefaultTreeOperationLog(), new DefaultTreeOperationLog(), index, parentIndex);
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
55 }
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
56
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
57 public IndexJungleTreeEditor(TreeNode _root, TreeNode oldRoot, TransactionManager _txManager,
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
58 IndexTreeEditor treeEditor, TreeOperationLog log, TreeMap<String, TreeMap<String, List<TreeNode>>> index,
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
59 ParentIndex parentIndex) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
60 this(_root, oldRoot, _txManager, treeEditor, log, new DefaultTreeOperationLog(), index, parentIndex);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
61 }
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
62
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
63 public IndexJungleTreeEditor(TreeNode newNode, TreeNode oldRoot, TransactionManager _txManager,
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
64 IndexTreeEditor _editor, TreeOperationLog _log, TreeOperationLog tmpLog,
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
65 TreeMap<String, TreeMap<String, List<TreeNode>>> index, ParentIndex parentIndex) {
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
66 this.root = newNode;
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
67 this.oldRoot = oldRoot;
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
68 this.txManager = _txManager;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
69 this.editor = _editor;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
70 this.log = _log;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
71 this.index = index;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
72 this.parentIndex = parentIndex;
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
73 this.tmpLog = tmpLog;
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
74 }
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
75
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
76 public Either<Error, IndexJungleTreeEditor> _edit(final NodePath _path, NodeEditor _e, IndexEditor indexEditor) {
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
77 Either<Error, LoggingNode> either = editor.edit(root, _path, _e);
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
78 if (either.isA()) {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
79 return DefaultEither.newA(either.a());
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
80 }
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
81
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
82 LoggingNode newLogging = either.b();
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
83 OperationLog newLog = newLogging.getOperationLog();
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
84 TreeNode newNode = newLogging.getWrap();
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
85
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
86 IterableConverter.Converter<TreeOperation, NodeOperation> converter = new IterableConverter.Converter<TreeOperation, NodeOperation>() {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
87 @Override
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
88 public TreeOperation conv(NodeOperation _b) {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
89 return new DefaultTreeOperation(_path, _b);
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
90 }
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
91 };
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
92
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
93 Iterable<TreeOperation> iterable = new IterableConverter<TreeOperation, NodeOperation>(newLog, converter);
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
94 DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable, newLog.length());
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
95 TreeOperationLog newTmpLog = tmpLog.append(treeOperationLog);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
96 IndexJungleTreeEditor newIndexTreeEditor = new IndexJungleTreeEditor(newNode, oldRoot, txManager, this.editor, log,
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
97 newTmpLog, index, parentIndex);
146
371b6ddb78f2 repair putAttributeIndex and deleteAttributeIndex
one
parents: 145
diff changeset
98 return DefaultEither.newB(newIndexTreeEditor);
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
99 }
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
100
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
101 @Override
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
102 public Either<Error, JungleTreeEditor> addNewChildAt(NodePath _path, int _pos) {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
103 AppendChildAt appendChildAt = new AppendChildAt(_pos);
146
371b6ddb78f2 repair putAttributeIndex and deleteAttributeIndex
one
parents: 145
diff changeset
104 IndexEditor indexEditor = new DefaultIndexEditor(index);
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
105 Either<Error, IndexJungleTreeEditor> either = _edit(_path, appendChildAt, indexEditor);
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
106 Either<Error, JungleTreeEditor> newEither = DefaultEither.newB(either.b());
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
107 return newEither;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
108 }
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
109
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
110 @Override
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
111 public Either<Error, JungleTreeEditor> deleteChildAt(NodePath _path, int _pos) {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
112 DeleteChildAt deleteChildAt = new DeleteChildAt(_pos);
146
371b6ddb78f2 repair putAttributeIndex and deleteAttributeIndex
one
parents: 145
diff changeset
113 DeleteChildIndexEditor indexEditor = new DeleteChildIndexEditor(_pos, index);
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
114 Either<Error, IndexJungleTreeEditor> either = _edit(_path, deleteChildAt, indexEditor);
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
115 JungleTreeEditor editor = either.b();
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
116 Either<Error, JungleTreeEditor> newEither = DefaultEither.newB(editor);
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
117 return newEither;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
118 }
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
119
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
120 @Override
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
121 public Either<Error, JungleTreeEditor> putAttribute(NodePath _path, String _key, ByteBuffer _value) {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
122 PutAttribute putAttribute = new PutAttribute(_key, _value);
146
371b6ddb78f2 repair putAttributeIndex and deleteAttributeIndex
one
parents: 145
diff changeset
123 IndexEditor indexEditor = new DefaultIndexEditor(index);
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
124 Either<Error, IndexJungleTreeEditor> either = _edit(_path, putAttribute, indexEditor);
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
125 JungleTreeEditor editor = either.b();
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
126 Either<Error, JungleTreeEditor> newEither = DefaultEither.newB(editor);
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
127 return newEither;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
128 }
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
129
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
130 @Override
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
131 public Either<Error, JungleTreeEditor> deleteAttribute(NodePath _path, String _key) {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
132 DeleteAttribute deleteAttribute = new DeleteAttribute(_key);
146
371b6ddb78f2 repair putAttributeIndex and deleteAttributeIndex
one
parents: 145
diff changeset
133 IndexEditor indexEditor = new DefaultIndexEditor(index);
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
134 Either<Error, IndexJungleTreeEditor> either = _edit(_path, deleteAttribute, indexEditor);
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
135 Either<Error, JungleTreeEditor> newEither = DefaultEither.newB(either.b());
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
136 return newEither;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
137 }
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
138
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
139 @Override
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
140 public Either<Error, JungleTreeEditor> edit(NodePath _path, NodeEditor _editor) {
146
371b6ddb78f2 repair putAttributeIndex and deleteAttributeIndex
one
parents: 145
diff changeset
141 IndexEditor indexEditor = new DefaultIndexEditor(index);
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
142 Either<Error, IndexJungleTreeEditor> either = _edit(_path, _editor, indexEditor);
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
143 JungleTreeEditor editor = either.b();
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
144 Either<Error, JungleTreeEditor> newEither = DefaultEither.newB(editor);
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
145 return newEither;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
146 }
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
147
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
148 @Override
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
149 public Either<Error, JungleTreeEditor> success() {
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
150 ParentIndex newParentIndex = editParentIndex(tmpLog);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
151 TreeOperationLog newLog = log.append(tmpLog);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
152 Either<Error, TransactionManager> either = txManager.commit(root, newLog, index, newParentIndex);
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
153 if (either.isA()) {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
154 return DefaultEither.newA(either.a());
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
155 }
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
156
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
157 TransactionManager newTxManager = either.b();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
158 JungleTreeEditor newTreeEditor = new IndexJungleTreeEditor(root, root, newTxManager, editor, index, parentIndex);
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
159
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
160 return DefaultEither.newB(newTreeEditor);
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
161 }
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
162
149
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
163 private ParentIndex editParentIndex(TreeOperationLog tmpLog) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
164 TreeMap<TreeNode, TreeNode> putParentNodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
165 TreeMap<TreeNode, TreeNode> deleteParentNodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
166 for (TreeOperation log : tmpLog) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
167
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
168 NodePath targetNodePath = log.getNodePath();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
169 putParentNodeMap = getTargetNode(TreeMap.empty(TreeMapOrd.treeNodeOrd), root, targetNodePath);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
170 deleteParentNodeMap = getTargetNode(TreeMap.empty(TreeMapOrd.treeNodeOrd), oldRoot, targetNodePath);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
171 System.out.println(log.getNodePath().toString());
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
172 }
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
173
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
174 ParentIndex newParentIndex = parentIndex;
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
175 if (!deleteParentNodeMap.isEmpty())
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
176 newParentIndex = deleteParentIndex(putParentNodeMap, newParentIndex);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
177
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
178
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
179 if (!putParentNodeMap.isEmpty())
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
180 newParentIndex = putParentIndex(putParentNodeMap,newParentIndex);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
181
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
182 return newParentIndex;
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
183 }
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
184
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
185 private ParentIndex deleteParentIndex(TreeMap<TreeNode, TreeNode> deleteParentNodeMap, ParentIndex editParentIndex) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
186 Iterator<P2<TreeNode, TreeNode>> parentNodeIterator = deleteParentNodeMap.iterator();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
187 ParentIndex newParentIndex = editParentIndex;
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
188
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
189 for (; parentNodeIterator.hasNext();) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
190 TreeNode parentNode = parentNodeIterator.next()._1();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
191 TreeNodeChildren children = parentNode.getChildren();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
192 Iterator<TreeNode> childrenIterator = children.iterator();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
193
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
194 for (; childrenIterator.hasNext();) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
195 TreeNode child = childrenIterator.next();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
196 newParentIndex = newParentIndex.delete(child);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
197 }
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
198 }
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
199 return newParentIndex;
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
200 }
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
201
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
202 private ParentIndex putParentIndex(TreeMap<TreeNode, TreeNode> putParentNodeMap,ParentIndex editParentIndex) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
203 Iterator<P2<TreeNode, TreeNode>> parentNodeIterator = putParentNodeMap.iterator();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
204 ParentIndex newParentIndex = editParentIndex;
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
205
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
206 for (; parentNodeIterator.hasNext();) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
207 TreeNode parentNode = parentNodeIterator.next()._1();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
208 TreeNodeChildren children = parentNode.getChildren();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
209 Iterator<TreeNode> childrenIterator = children.iterator();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
210
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
211 for (; childrenIterator.hasNext();) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
212 TreeNode child = childrenIterator.next();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
213 newParentIndex = newParentIndex.set(child, parentNode);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
214 }
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
215 }
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
216 return newParentIndex;
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
217 }
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
218
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
219 private TreeMap<TreeNode, TreeNode> getTargetNode(TreeMap<TreeNode, TreeNode> treeNodeMap, TreeNode node,
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
220 NodePath path) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
221 if (path.size() == 0)
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
222 return treeNodeMap;
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
223
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
224 Pair<Integer, NodePath> pathNode = path.pop();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
225
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
226 if (pathNode.left() == -1) {
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
227 TreeMap<TreeNode, TreeNode> newTreeNodeMap = treeNodeMap.set(node, node);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
228 return getTargetNode(newTreeNodeMap, node, pathNode.right());
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
229 }
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
230
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
231 Either<Error, TreeNode> either = node.getChildren().at(pathNode.left());
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
232 if (either.isA())
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
233 return treeNodeMap;
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
234
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
235 TreeNode child = either.b();
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
236 TreeMap<TreeNode, TreeNode> newTreeNodeMap = treeNodeMap.set(child, child);
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
237 if (pathNode.right().size() == 0)
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
238 return newTreeNodeMap;
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
239
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
240 return getTargetNode(newTreeNodeMap, child, pathNode.right());
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
241
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
242 }
feb2346ace19 refactor ParentIndex
one
parents: 146
diff changeset
243
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
244 @Override
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
245 public String getID() {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
246 return txManager.getUUID();
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
247 }
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
248
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
249 @Override
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
250 public String getRevision() {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
251 return Long.toString(txManager.getRevision());
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
252 }
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
253
145
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
254 @Override
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
255 public TreeNode getRoot() {
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
256 return root;
72f454eb04ec add parentIndex
one
parents: 138
diff changeset
257 }
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
258
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
259 }