comparison src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java @ 154:b8cef4b640a3

update index for commit
author one
date Wed, 26 Nov 2014 06:23:07 +0900
parents 20af7f25ef32
children f98f2704b154 6b4aab79910d
comparison
equal deleted inserted replaced
153:20af7f25ef32 154:b8cef4b640a3
16 TreeNode node; 16 TreeNode node;
17 Index index; 17 Index index;
18 ParentIndex parentIndex; 18 ParentIndex parentIndex;
19 boolean parentUpdateFlag; 19 boolean parentUpdateFlag;
20 IndexManager indexManager; 20 IndexManager indexManager;
21 boolean indexFlag; 21 boolean useIndex;
22 22
23 public InterfaceTraverser(TreeNode _root, Index index, ParentIndex parentIndex, IndexManager indexManager, 23 public InterfaceTraverser(TreeNode root, IndexManager indexManager, boolean indexFlag) {
24 boolean indexFlag) { 24 this(root, new Index(), new ParentIndex(), indexManager, indexFlag);
25 this.node = _root; 25 }
26
27 public InterfaceTraverser(TreeNode root, Index index, ParentIndex parentIndex, IndexManager indexManager,
28 boolean useIndex) {
29 this.node = root;
26 this.index = index; 30 this.index = index;
27 this.indexManager = indexManager; 31 this.indexManager = indexManager;
28 this.parentIndex = parentIndex; 32 this.parentIndex = parentIndex;
29 if (parentIndex.isEmpty()) 33 if (parentIndex.isEmpty())
30 parentUpdateFlag = true; 34 parentUpdateFlag = true;
31 else 35 else
32 parentUpdateFlag = false; 36 parentUpdateFlag = false;
33 this.indexFlag = indexFlag; 37 this.useIndex = useIndex;
34 } 38 }
35 39
36 public Index getIndex() { 40 public Index getIndex() {
37 return index; 41 return index;
38 } 42 }
48 52
49 public void setIndex(Index index) { 53 public void setIndex(Index index) {
50 this.index = index; 54 this.index = index;
51 } 55 }
52 56
53 public Iterator<TreeNode> emptyQuery() { 57 public void createIndex() {
54 58
55 final PathNodeIterator itNode = new PathNodeIterator(node); 59 final PathNodeIterator itNode = new PathNodeIterator(node);
56 return new Iterator<TreeNode>() { 60 for (; itNode.hasNext();) {
57 61 TreeNode targetNode = itNode.next();
58 private TreeNode matchNode = nextmatch(itNode); 62 if (parentUpdateFlag)
59 63 parentIndex = parentIndex.set(targetNode);
60 private TreeNode nextmatch(PathNodeIterator itNode) { 64 List<String> keys = targetNode.getAttributes().getKeys();
61 65 for (String key : keys) {
62 for (; itNode.hasNext();) { 66 String value = targetNode.getAttributes().getString(key);
63 TreeNode targetNode = itNode.next(); 67 if (value != null)
64 List<String> keys = targetNode.getAttributes().getKeys(); 68 index = index.set(key, value, targetNode);
65 for (String key : keys) {
66 String value = targetNode.getAttributes().getString(key);
67 if (value != null)
68 index = index.set(key, value, targetNode);
69 if (parentUpdateFlag)
70 parentIndex = parentIndex.set(targetNode);
71 }
72 }
73 commit();
74 return null;
75 } 69 }
76 70 }
77 @Override
78 public boolean hasNext() {
79 if (matchNode == null) {
80 return false;
81 }
82 return true;
83 }
84
85 @Override
86 public TreeNode next() {
87 TreeNode currentPair = matchNode;
88 matchNode = nextmatch(itNode);
89 return currentPair;
90 }
91
92 @Override
93 public void remove() {
94 }
95
96 };
97
98 } 71 }
99 72
100 /** 73 /**
101 * subTree以下のNodeに対してKey,Valueのペアでindexを使って探索を行う 74 * subTree以下のNodeに対してKey,Valueのペアでindexを使って探索を行う
102 * 75 *
110 /* 83 /*
111 * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 84 * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、
112 * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す 85 * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す
113 */ 86 */
114 List<TreeNode> nodeList = index.get(key, searchValue); 87 List<TreeNode> nodeList = index.get(key, searchValue);
115 if (nodeList != null) { 88 if (nodeList != null && useIndex) {
116 89
117 if (nodeList.isEmpty()) 90 if (nodeList.isEmpty())
118 return new NulIterator<TreeNode>();// 空のIteratorを返す 91 return new NulIterator<TreeNode>();// 空のIteratorを返す
119 92
120 // ここでNode以下にあるか調べる 93 // ここでNode以下にあるか調べる
185 * そのKeyを保有するNodeとNodeのPathを取得する 158 * そのKeyを保有するNodeとNodeのPathを取得する
186 * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 159 * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、
187 * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す 160 * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す
188 */ 161 */
189 Iterator<TreeNode> NodeIterator = index.getAll(key); 162 Iterator<TreeNode> NodeIterator = index.getAll(key);
190 if (NodeIterator != null) { 163 if (NodeIterator != null && useIndex) {
191 List<TreeNode> filteredList = List.nil(); 164 List<TreeNode> filteredList = List.nil();
192 for (; NodeIterator.hasNext();) { 165 for (; NodeIterator.hasNext();) {
193 TreeNode targetNode = NodeIterator.next(); 166 TreeNode targetNode = NodeIterator.next();
194 TreeNode parent = targetNode; 167 TreeNode parent = targetNode;
195 while (parent != null) { 168 while (parent != null) {
241 } 214 }
242 215
243 public Iterator<TreeNode> find(Query query, String key, String searchValue) { 216 public Iterator<TreeNode> find(Query query, String key, String searchValue) {
244 217
245 List<TreeNode> nodeList = index.get(key, searchValue); 218 List<TreeNode> nodeList = index.get(key, searchValue);
246 if (nodeList != null) { 219 if (nodeList != null && useIndex) {
247 return nodeList.iterator(); 220 return nodeList.iterator();
248 } else { 221 } else {
249 222
250 final PathNodeIterator itNode = new PathNodeIterator(node); 223 final PathNodeIterator itNode = new PathNodeIterator(node);
251 return new Iterator<TreeNode>() { 224 return new Iterator<TreeNode>() {
255 private TreeNode nextmatch(PathNodeIterator itNode) { 228 private TreeNode nextmatch(PathNodeIterator itNode) {
256 229
257 for (; itNode.hasNext();) { 230 for (; itNode.hasNext();) {
258 TreeNode targetNode = itNode.next(); 231 TreeNode targetNode = itNode.next();
259 String value = targetNode.getAttributes().getString(key); 232 String value = targetNode.getAttributes().getString(key);
260 if (indexFlag) { 233 if (useIndex) {
261 if (value != null) 234 if (value != null)
262 index = index.set(key, value, targetNode); 235 index = index.set(key, value, targetNode);
263 } 236 }
264 if (parentUpdateFlag) 237 if (parentUpdateFlag)
265 parentIndex = parentIndex.set(targetNode); 238 parentIndex = parentIndex.set(targetNode);
266 if (query.condition(targetNode)) 239 if (query.condition(targetNode))
267 return targetNode; 240 return targetNode;
268 } 241 }
269 commit(); 242 if (useIndex || parentUpdateFlag)
243 commit();
270 return null; 244 return null;
271 } 245 }
272 246
273 @Override 247 @Override
274 public boolean hasNext() { 248 public boolean hasNext() {
294 } 268 }
295 269
296 public Iterator<TreeNode> findAll(Query query, String key) { 270 public Iterator<TreeNode> findAll(Query query, String key) {
297 271
298 Iterator<TreeNode> nodeList = index.getAll(key); 272 Iterator<TreeNode> nodeList = index.getAll(key);
299 if (nodeList != null) { 273 if (nodeList != null && useIndex) {
300 274
301 return nodeList; 275 return nodeList;
302 276
303 } else { 277 } else {
304 278
310 private TreeNode nextmatch(PathNodeIterator itNode) { 284 private TreeNode nextmatch(PathNodeIterator itNode) {
311 285
312 for (; itNode.hasNext();) { 286 for (; itNode.hasNext();) {
313 TreeNode targetNode = itNode.next(); 287 TreeNode targetNode = itNode.next();
314 String value = targetNode.getAttributes().getString(key); 288 String value = targetNode.getAttributes().getString(key);
315 if (indexFlag) { 289 if (useIndex) {
316 if (value != null) 290 if (value != null)
317 index = index.set(key, value, targetNode); 291 index = index.set(key, value, targetNode);
318 } 292 }
319 if (parentUpdateFlag) 293 if (parentUpdateFlag)
320 parentIndex = parentIndex.set(targetNode); 294 parentIndex = parentIndex.set(targetNode);
321 if (query.condition(targetNode)) 295 if (query.condition(targetNode))
322 return targetNode; 296 return targetNode;
323 } 297 }
324 commit(); 298 if (useIndex || parentUpdateFlag)
299 commit();
325 return null; 300 return null;
326 } 301 }
327 302
328 @Override 303 @Override
329 public boolean hasNext() { 304 public boolean hasNext() {