annotate src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java @ 183:066d9c5758dc

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