Mercurial > hg > Members > tatsuki > bench > jungle-core
annotate src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java @ 170:383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
author | one |
---|---|
date | Fri, 26 Dec 2014 03:58:47 +0900 |
parents | 3cd075a445bf |
children | 809f813d1083 |
rev | line source |
---|---|
97 | 1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; |
2 | |
169 | 3 import java.io.BufferedWriter; |
4 import java.io.File; | |
5 import java.io.FileWriter; | |
6 import java.io.IOException; | |
7 import java.io.PrintWriter; | |
98 | 8 import java.util.Iterator; |
9 | |
104 | 10 import fj.data.List; |
97 | 11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; |
99 | 12 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIterator; |
110 | 13 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.Query; |
151 | 14 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; |
169 | 15 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexCreater; |
134 | 16 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; |
153 | 17 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; |
97 | 18 |
100 | 19 public class InterfaceTraverser { |
124 | 20 |
139 | 21 TreeNode node; |
151 | 22 Index index; |
153 | 23 ParentIndex parentIndex; |
24 boolean parentUpdateFlag; | |
139 | 25 IndexManager indexManager; |
154 | 26 boolean useIndex; |
139 | 27 |
154 | 28 public InterfaceTraverser(TreeNode root, IndexManager indexManager, boolean indexFlag) { |
29 this(root, new Index(), new ParentIndex(), indexManager, indexFlag); | |
30 } | |
31 | |
32 public InterfaceTraverser(TreeNode root, Index index, ParentIndex parentIndex, IndexManager indexManager, | |
33 boolean useIndex) { | |
34 this.node = root; | |
139 | 35 this.index = index; |
36 this.indexManager = indexManager; | |
153 | 37 this.parentIndex = parentIndex; |
38 if (parentIndex.isEmpty()) | |
39 parentUpdateFlag = true; | |
40 else | |
41 parentUpdateFlag = false; | |
154 | 42 this.useIndex = useIndex; |
139 | 43 } |
44 | |
151 | 45 public Index getIndex() { |
139 | 46 return index; |
47 } | |
127 | 48 |
153 | 49 public void commit() { |
50 parentUpdateFlag = false; | |
51 indexManager.commit(index, parentIndex); | |
52 } | |
53 | |
54 public ParentIndex getParentIndex() { | |
55 return parentIndex; | |
56 } | |
57 | |
151 | 58 public void setIndex(Index index) { |
139 | 59 this.index = index; |
60 } | |
127 | 61 |
154 | 62 public void createIndex() { |
153 | 63 |
169 | 64 long t1 = System.currentTimeMillis(); |
65 IndexCreater creater = new IndexCreater(node); | |
66 long t2 = System.currentTimeMillis(); | |
67 System.out.println("createIndex time = " + (t2 - t1)); | |
170
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
68 // File file = new File("./time/createParentIndex"); |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
69 // try { |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
70 // PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file,true))); |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
71 // pw.println((t2 - t1)); |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
72 // pw.close(); |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
73 // } catch (IOException e) { |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
74 // // TODO Auto-generated catch block |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
75 // e.printStackTrace(); |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
76 // } |
169 | 77 index = creater.getIndex(); |
78 parentIndex = creater.getParentIndex(); | |
153 | 79 } |
80 | |
139 | 81 /** |
82 * subTree以下のNodeに対してKey,Valueのペアでindexを使って探索を行う | |
83 * | |
84 * @param query | |
85 * @param subTree | |
86 * @param key | |
87 * @param searchValue | |
88 * @return | |
89 */ | |
160 | 90 public Iterator<TreeNode> findInSubTree(final Query query, TreeNode subTree, String key, String searchValue) { |
139 | 91 /* |
92 * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 | |
93 * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す | |
94 */ | |
170
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
95 Iterator<TreeNode> nodeIterator = index.get(key, searchValue); |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
96 if (nodeIterator.hasNext() && useIndex) { |
137 | 97 |
153 | 98 // ここでNode以下にあるか調べる |
99 List<TreeNode> filteredList = List.nil(); | |
139 | 100 |
170
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
101 for (;nodeIterator.hasNext();) { |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
102 TreeNode targetNode = nodeIterator.next(); |
153 | 103 TreeNode parent = targetNode; |
104 while (parent != null) { | |
105 parent = parentIndex.get(parent); | |
106 if (parent.equals(subTree)) | |
107 filteredList = filteredList.cons(targetNode); | |
108 } | |
141 | 109 } |
110 | |
111 return filteredList.iterator(); | |
139 | 112 |
113 } else { | |
141 | 114 final PathNodeIterator itNode = new PathNodeIterator(subTree); |
153 | 115 return new Iterator<TreeNode>() { |
139 | 116 |
153 | 117 private TreeNode matchNode = nextmatch(itNode); |
139 | 118 |
153 | 119 private TreeNode nextmatch(PathNodeIterator itNode) { |
127 | 120 |
139 | 121 for (; itNode.hasNext();) { |
153 | 122 TreeNode targetNode = itNode.next(); |
123 if (query.condition(targetNode)) | |
124 return targetNode; | |
139 | 125 } |
126 return null; | |
127 } | |
125 | 128 |
139 | 129 @Override |
130 public boolean hasNext() { | |
153 | 131 if (matchNode == null) { |
139 | 132 return false; |
133 } | |
134 return true; | |
135 } | |
136 | |
137 @Override | |
153 | 138 public TreeNode next() { |
139 TreeNode currentNode = matchNode; | |
140 matchNode = nextmatch(itNode); | |
141 return currentNode; | |
139 | 142 } |
143 | |
144 @Override | |
145 public void remove() { | |
146 } | |
147 | |
148 }; | |
137 | 149 } |
139 | 150 } |
137 | 151 |
139 | 152 /** |
153 * subTree以下のNodeに対してKeyに対応する値をindexを使って探索する | |
154 * | |
155 * @param query | |
156 * @param subTree | |
157 * @param key | |
158 * @param searchValue | |
159 * @return | |
160 */ | |
160 | 161 public Iterator<TreeNode> findInSubTreeAllValue(final Query query, TreeNode subTree, String key) { |
139 | 162 /* |
163 * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得 | |
164 * そのKeyを保有するNodeとNodeのPathを取得する | |
165 * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 | |
166 * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す | |
137 | 167 */ |
153 | 168 Iterator<TreeNode> NodeIterator = index.getAll(key); |
154 | 169 if (NodeIterator != null && useIndex) { |
153 | 170 List<TreeNode> filteredList = List.nil(); |
171 for (; NodeIterator.hasNext();) { | |
172 TreeNode targetNode = NodeIterator.next(); | |
173 TreeNode parent = targetNode; | |
174 while (parent != null) { | |
175 parent = parentIndex.get(parent); | |
176 if (parent.equals(subTree)) | |
177 filteredList = filteredList.cons(targetNode); | |
143
afbe19c98f53
change Index form TreeMap<String,TreeMap<String<List<Pair<TreeNode,NodePath>>>> → TreeMap<String,TreeMap<String<List<NodePath>>>
one
parents:
141
diff
changeset
|
178 } |
139 | 179 } |
180 return filteredList.iterator(); | |
137 | 181 |
139 | 182 } else { |
153 | 183 |
141 | 184 final PathNodeIterator itNode = new PathNodeIterator(subTree); |
153 | 185 return new Iterator<TreeNode>() { |
139 | 186 |
153 | 187 private TreeNode matchPair = nextmatch(itNode); |
139 | 188 |
153 | 189 private TreeNode nextmatch(PathNodeIterator itNode) { |
137 | 190 |
139 | 191 for (; itNode.hasNext();) { |
153 | 192 TreeNode targetNode = itNode.next(); |
193 if (query.condition(targetNode)) | |
194 return targetNode; | |
139 | 195 } |
196 return null; | |
197 } | |
198 | |
199 @Override | |
200 public boolean hasNext() { | |
201 if (matchPair == null) { | |
202 return false; | |
203 } | |
204 return true; | |
205 } | |
124 | 206 |
139 | 207 @Override |
153 | 208 public TreeNode next() { |
209 TreeNode currentNode = matchPair; | |
139 | 210 matchPair = nextmatch(itNode); |
153 | 211 return currentNode; |
212 } | |
213 | |
214 @Override | |
215 public void remove() { | |
216 } | |
217 | |
218 }; | |
219 } | |
220 } | |
221 | |
160 | 222 public Iterator<TreeNode> find(final Query query, final String key, String searchValue) { |
153 | 223 |
170
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
224 Iterator<TreeNode> nodeIterator = index.get(key, searchValue); |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
225 if (nodeIterator.hasNext() && useIndex) { |
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
226 return nodeIterator; |
153 | 227 } else { |
228 | |
229 final PathNodeIterator itNode = new PathNodeIterator(node); | |
230 return new Iterator<TreeNode>() { | |
231 | |
232 private TreeNode matchNode = nextmatch(itNode); | |
233 | |
234 private TreeNode nextmatch(PathNodeIterator itNode) { | |
235 | |
236 for (; itNode.hasNext();) { | |
237 TreeNode targetNode = itNode.next(); | |
238 String value = targetNode.getAttributes().getString(key); | |
154 | 239 if (useIndex) { |
153 | 240 if (value != null) |
241 index = index.set(key, value, targetNode); | |
242 } | |
170
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
243 if (parentUpdateFlag); |
169 | 244 // parentIndex = parentIndex.set(targetNode); |
153 | 245 if (query.condition(targetNode)) |
246 return targetNode; | |
247 } | |
154 | 248 if (useIndex || parentUpdateFlag) |
249 commit(); | |
153 | 250 return null; |
251 } | |
252 | |
253 @Override | |
254 public boolean hasNext() { | |
255 if (matchNode == null) { | |
256 return false; | |
257 } | |
258 return true; | |
259 } | |
260 | |
261 @Override | |
262 public TreeNode next() { | |
263 TreeNode currentPair = matchNode; | |
264 matchNode = nextmatch(itNode); | |
139 | 265 return currentPair; |
266 } | |
267 | |
268 @Override | |
269 public void remove() { | |
270 } | |
271 | |
272 }; | |
273 } | |
274 } | |
275 | |
160 | 276 public Iterator<TreeNode> findAll(final Query query, final String key) { |
139 | 277 |
153 | 278 Iterator<TreeNode> nodeList = index.getAll(key); |
154 | 279 if (nodeList != null && useIndex) { |
139 | 280 |
153 | 281 return nodeList; |
139 | 282 |
283 } else { | |
153 | 284 |
285 final PathNodeIterator itNode = new PathNodeIterator(node); | |
286 return new Iterator<TreeNode>() { | |
137 | 287 |
153 | 288 private TreeNode matchNode = nextmatch(itNode); |
139 | 289 |
153 | 290 private TreeNode nextmatch(PathNodeIterator itNode) { |
139 | 291 |
292 for (; itNode.hasNext();) { | |
153 | 293 TreeNode targetNode = itNode.next(); |
294 String value = targetNode.getAttributes().getString(key); | |
154 | 295 if (useIndex) { |
153 | 296 if (value != null) |
297 index = index.set(key, value, targetNode); | |
137 | 298 } |
170
383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
one
parents:
169
diff
changeset
|
299 if (parentUpdateFlag); |
169 | 300 // parentIndex = parentIndex.set(targetNode); |
153 | 301 if (query.condition(targetNode)) |
302 return targetNode; | |
139 | 303 } |
154 | 304 if (useIndex || parentUpdateFlag) |
305 commit(); | |
139 | 306 return null; |
307 } | |
136 | 308 |
139 | 309 @Override |
310 public boolean hasNext() { | |
153 | 311 if (matchNode == null) { |
139 | 312 return false; |
313 } | |
314 return true; | |
315 } | |
136 | 316 |
139 | 317 @Override |
153 | 318 public TreeNode next() { |
319 TreeNode currentPair = matchNode; | |
320 matchNode = nextmatch(itNode); | |
139 | 321 return currentPair; |
322 } | |
323 | |
324 @Override | |
325 public void remove() { | |
326 } | |
327 | |
328 }; | |
137 | 329 } |
139 | 330 } |
97 | 331 } |