Mercurial > hg > Members > tatsuki > bench > jungle-core
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() { |