annotate src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java @ 148:a2c374a2686b

Merge with 0854f9a9e81db5db639f02a126ebabf1d004b98e
author one
date Fri, 21 Nov 2014 12:49:28 +0900
parents 371b6ddb78f2 0854f9a9e81d
children 8a0aa8fc137c
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;
95000ff9064d Create Query
one
parents: 97
diff changeset
4
112
98e256d9fd57 treeAttribute add get String but has error
one
parents: 111
diff changeset
5 import fj.Ord;
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
6 import fj.P2;
104
f9a0e7069811 delete worning halfway
one
parents: 103
diff changeset
7 import fj.data.List;
124
75ba2f2d6ea3 searchQueryTest add index
one
parents: 122
diff changeset
8 import fj.data.Option;
97
a1e20a440ddd add BruteForceTraverser
one
parents:
diff changeset
9 import fj.data.TreeMap;
a1e20a440ddd add BruteForceTraverser
one
parents:
diff changeset
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
141
3071b1a471fd add getKeys
one
parents: 140
diff changeset
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator;
3071b1a471fd add getKeys
one
parents: 140
diff changeset
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
97
a1e20a440ddd add BruteForceTraverser
one
parents:
diff changeset
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
a1e20a440ddd add BruteForceTraverser
one
parents:
diff changeset
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
99
92d0c6e4655c refactoring to IteratorPathNode
one
parents: 98
diff changeset
15 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIterator;
110
cf17350a2415 traverse find args change Query
one
parents: 107
diff changeset
16 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.Query;
134
f46a6e0e4594 add deleteIndexEditor
one
parents: 132
diff changeset
17 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager;
97
a1e20a440ddd add BruteForceTraverser
one
parents:
diff changeset
18
100
9a7b7af838e0 add index TreeNodeEditor
one
parents: 99
diff changeset
19 public class InterfaceTraverser {
124
75ba2f2d6ea3 searchQueryTest add index
one
parents: 122
diff changeset
20
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
21 // InterfaceTraverser traverser;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
22 TreeNode node;
146
371b6ddb78f2 repair putAttributeIndex and deleteAttributeIndex
one
parents: 141
diff changeset
23 TreeMap<String, TreeMap<String, List<TreeNode>>> index;
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
24 IndexManager indexManager;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
25
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
26 public InterfaceTraverser(TreeNode _root, IndexManager indexManager) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
27 this.node = _root;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
28 this.index = TreeMap.empty(Ord.stringOrd);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
29 this.indexManager = indexManager;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
30 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
31
146
371b6ddb78f2 repair putAttributeIndex and deleteAttributeIndex
one
parents: 141
diff changeset
32 public InterfaceTraverser(TreeNode _root, TreeMap<String, TreeMap<String, List<TreeNode>>> index,
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
33 IndexManager indexManager) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
34 this.node = _root;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
35 this.index = index;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
36 this.indexManager = indexManager;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
37 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
38
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
39 public void commitIndex() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
40 indexManager.commit(index);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
41 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
42
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
43 public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
44 return index;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
45 }
127
b2c1fd513feb push index thread add read log
one
parents: 126
diff changeset
46
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
47 public void setIndex(TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
48 this.index = index;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
49 }
127
b2c1fd513feb push index thread add read log
one
parents: 126
diff changeset
50
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
51 /**
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
52 * subTree以下のNodeに対してKey,Valueのペアでindexを使って探索を行う
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
53 *
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
54 * @param query
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
55 * @param subTree
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
56 * @param key
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
57 * @param searchValue
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
58 * @return
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
59 */
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
60 public Iterator<Pair<TreeNode, NodePath>> findInSubTree(Query query, Pair<TreeNode, NodePath> subTree, String key,
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
61 String searchValue) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
62 /*
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
63 * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
64 * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
65 */
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
66
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
67 if (index.get(key).isSome()) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
68
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
69 TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = this.index.get(key).some();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
70
141
3071b1a471fd add getKeys
one
parents: 140
diff changeset
71 Option<List<Pair<TreeNode, NodePath>>> opList = innerIndex.get(searchValue);
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
72
141
3071b1a471fd add getKeys
one
parents: 140
diff changeset
73 if (opList.isNone())
3071b1a471fd add getKeys
one
parents: 140
diff changeset
74 return new NulIterator<Pair<TreeNode, NodePath>>();// 空のIteratorを返す
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
75
141
3071b1a471fd add getKeys
one
parents: 140
diff changeset
76 List<Pair<TreeNode, NodePath>> list = opList.some();
3071b1a471fd add getKeys
one
parents: 140
diff changeset
77 NodePath targetNodePath = subTree.right();
3071b1a471fd add getKeys
one
parents: 140
diff changeset
78 List<Pair<TreeNode, NodePath>> filteredList = List.nil();
3071b1a471fd add getKeys
one
parents: 140
diff changeset
79
3071b1a471fd add getKeys
one
parents: 140
diff changeset
80 for (Pair<TreeNode, NodePath> pair : list) {
3071b1a471fd add getKeys
one
parents: 140
diff changeset
81 NodePath compareNodePath = pair.right();
3071b1a471fd add getKeys
one
parents: 140
diff changeset
82 if (targetNodePath.compare(compareNodePath))
3071b1a471fd add getKeys
one
parents: 140
diff changeset
83 filteredList = filteredList.cons(pair);
3071b1a471fd add getKeys
one
parents: 140
diff changeset
84 }
3071b1a471fd add getKeys
one
parents: 140
diff changeset
85
3071b1a471fd add getKeys
one
parents: 140
diff changeset
86 return filteredList.iterator();
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
87
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
88 } else {
141
3071b1a471fd add getKeys
one
parents: 140
diff changeset
89 final PathNodeIterator itNode = new PathNodeIterator(subTree);
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
90 return new Iterator<Pair<TreeNode, NodePath>>() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
91
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
92 private Pair<TreeNode, NodePath> matchPair = nextmatch(itNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
93
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
94 private Pair<TreeNode, NodePath> nextmatch(PathNodeIterator itNode) {
127
b2c1fd513feb push index thread add read log
one
parents: 126
diff changeset
95
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
96 for (; itNode.hasNext();) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
97 Pair<TreeNode, NodePath> pathNode = itNode.next();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
98 if (query.condition(pathNode.left()))
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
99 return pathNode;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
100 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
101 return null;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
102 }
125
a0c4a4b8ad10 index test
one
parents: 124
diff changeset
103
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
104 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
105 public boolean hasNext() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
106 if (matchPair == null) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
107 return false;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
108 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
109 return true;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
110 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
111
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
112 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
113 public Pair<TreeNode, NodePath> next() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
114 Pair<TreeNode, NodePath> currentPair = matchPair;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
115 matchPair = nextmatch(itNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
116 return currentPair;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
117 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
118
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
119 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
120 public void remove() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
121 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
122
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
123 };
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
124 }
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
125 }
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
126
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
127 /**
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
128 * subTree以下のNodeに対してKeyに対応する値をindexを使って探索する
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
129 *
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
130 * @param query
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
131 * @param subTree
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
132 * @param key
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
133 * @param searchValue
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
134 * @return
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
135 */
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
136 public Iterator<Pair<TreeNode, NodePath>> findInSubTreeAllValue(Query query, Pair<TreeNode, NodePath> subTree,
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
137 String key) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
138 /*
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
139 * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
140 * そのKeyを保有するNodeとNodeのPathを取得する
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
141 * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
142 * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
143 */
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
144
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
145 if (index.get(key).isSome()) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
146
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
147 TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = this.index.get(key).some();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
148 List<String> searchValues = innerIndex.keys();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
149 List<Pair<TreeNode, NodePath>> filteredList = List.nil();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
150 NodePath targetNodePath = subTree.right();
143
afbe19c98f53 change Index form TreeMap<String,TreeMap<String<List<Pair<TreeNode,NodePath>>>> → TreeMap<String,TreeMap<String<List<NodePath>>>
one
parents: 141
diff changeset
151
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
152 for (String searchValue : searchValues) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
153 Option<List<Pair<TreeNode, NodePath>>> opList = innerIndex.get(searchValue);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
154
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
155 if (opList.isNone())
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
156 continue;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
157
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
158 List<Pair<TreeNode, NodePath>> list = opList.some();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
159 for (Pair<TreeNode, NodePath> pair : list) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
160 NodePath compareNodePath = pair.right();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
161 if (targetNodePath.compare(compareNodePath))
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
162 filteredList = filteredList.cons(pair);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
163
143
afbe19c98f53 change Index form TreeMap<String,TreeMap<String<List<Pair<TreeNode,NodePath>>>> → TreeMap<String,TreeMap<String<List<NodePath>>>
one
parents: 141
diff changeset
164 }
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
165 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
166 return filteredList.iterator();
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
167
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
168 } else {
141
3071b1a471fd add getKeys
one
parents: 140
diff changeset
169 final PathNodeIterator itNode = new PathNodeIterator(subTree);
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
170 return new Iterator<Pair<TreeNode, NodePath>>() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
171
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
172 private Pair<TreeNode, NodePath> matchPair = nextmatch(itNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
173
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
174 private Pair<TreeNode, NodePath> nextmatch(PathNodeIterator itNode) {
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
175
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
176 for (; itNode.hasNext();) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
177 Pair<TreeNode, NodePath> pathNode = itNode.next();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
178 if (query.condition(pathNode.left()))
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
179 return pathNode;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
180 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
181 return null;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
182 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
183
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
184 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
185 public boolean hasNext() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
186 if (matchPair == null) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
187 return false;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
188 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
189 return true;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
190 }
124
75ba2f2d6ea3 searchQueryTest add index
one
parents: 122
diff changeset
191
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
192 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
193 public Pair<TreeNode, NodePath> next() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
194 Pair<TreeNode, NodePath> currentPair = matchPair;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
195 matchPair = nextmatch(itNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
196 return currentPair;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
197 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
198
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
199 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
200 public void remove() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
201 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
202
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
203 };
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
204 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
205 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
206
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
207 public Iterator<Pair<TreeNode, NodePath>> find(Query query, String key, String searchValue) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
208
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
209 if (index.get(key).isSome()) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
210
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
211 TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = this.index.get(key).some();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
212 Option<List<Pair<TreeNode, NodePath>>> opList = innerIndex.get(searchValue);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
213
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
214 if (opList.isNone())
141
3071b1a471fd add getKeys
one
parents: 140
diff changeset
215 return new NulIterator<Pair<TreeNode, NodePath>>();// 空のIteratorを返す
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
216
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
217 final List<Pair<TreeNode, NodePath>> list = opList.some();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
218 return list.iterator();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
219
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
220 } else {
141
3071b1a471fd add getKeys
one
parents: 140
diff changeset
221 Pair<TreeNode, NodePath> pair = new Pair<TreeNode, NodePath>(node, new DefaultNodePath());
3071b1a471fd add getKeys
one
parents: 140
diff changeset
222 final PathNodeIterator itNode = new PathNodeIterator(pair);
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
223 return new Iterator<Pair<TreeNode, NodePath>>() {
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
224
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
225 private Pair<TreeNode, NodePath> matchPair = nextmatch(itNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
226
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
227 private Pair<TreeNode, NodePath> nextmatch(PathNodeIterator itNode) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
228
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
229 for (; itNode.hasNext();) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
230 Pair<TreeNode, NodePath> pathNode = itNode.next();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
231 String value = pathNode.left().getAttributes().getString(key);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
232 Option<TreeMap<String, List<Pair<TreeNode, NodePath>>>> innerIndexOp = index.get(key);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
233
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
234 if (value != null) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
235 if (innerIndexOp.isNone()) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
236
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
237 TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = TreeMap.empty(Ord.stringOrd);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
238 List<Pair<TreeNode, NodePath>> list = List.nil();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
239 list = list.cons(pathNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
240 innerIndex = innerIndex.set(value, list);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
241 index = index.set(key, innerIndex);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
242
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
243 } else {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
244
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
245 TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = innerIndexOp.some();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
246 Option<List<Pair<TreeNode, NodePath>>> opList = innerIndex.get(value);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
247
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
248 if (opList.isNone()) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
249
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
250 List<Pair<TreeNode, NodePath>> list = List.nil();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
251 list = list.cons(pathNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
252 innerIndex = innerIndex.set(value, list);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
253
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
254 } else {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
255
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
256 List<Pair<TreeNode, NodePath>> list = opList.some();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
257 list = list.cons(pathNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
258 innerIndex = innerIndex.set(value, list);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
259
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
260 }
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
261 index = index.set(key, innerIndex);
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
262
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
263 }
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
264 }
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
265
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
266 if (query.condition(pathNode.left()))
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
267 return pathNode;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
268 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
269 return null;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
270 }
136
0f68cd7b2838 add Node Search
one
parents: 134
diff changeset
271
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
272 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
273 public boolean hasNext() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
274 if (matchPair == null) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
275 // index = itNode.getIndex();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
276 return false;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
277 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
278 return true;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
279 }
136
0f68cd7b2838 add Node Search
one
parents: 134
diff changeset
280
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
281 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
282 public Pair<TreeNode, NodePath> next() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
283 Pair<TreeNode, NodePath> currentPair = matchPair;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
284 matchPair = nextmatch(itNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
285 return currentPair;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
286 }
136
0f68cd7b2838 add Node Search
one
parents: 134
diff changeset
287
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
288 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
289 public void remove() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
290 }
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
291
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
292 };
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
293 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
294 }
136
0f68cd7b2838 add Node Search
one
parents: 134
diff changeset
295
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
296 public Iterator<Pair<TreeNode, NodePath>> findAll(Query query, String key) {
136
0f68cd7b2838 add Node Search
one
parents: 134
diff changeset
297
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
298 if (index.get(key).isSome()) {
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
299
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
300 TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = this.index.get(key).some();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
301 List<String> searchValues = innerIndex.keys();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
302 List<Pair<TreeNode, NodePath>> valueList = List.nil();
136
0f68cd7b2838 add Node Search
one
parents: 134
diff changeset
303
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
304 for (String searchValue : searchValues) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
305 Option<List<Pair<TreeNode, NodePath>>> opList = innerIndex.get(searchValue);
124
75ba2f2d6ea3 searchQueryTest add index
one
parents: 122
diff changeset
306
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
307 if (opList.isNone())
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
308 continue;
99
92d0c6e4655c refactoring to IteratorPathNode
one
parents: 98
diff changeset
309
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
310 List<Pair<TreeNode, NodePath>> list = opList.some();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
311 valueList = valueList.append(list);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
312 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
313 return valueList.iterator();
124
75ba2f2d6ea3 searchQueryTest add index
one
parents: 122
diff changeset
314
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
315 } else {
141
3071b1a471fd add getKeys
one
parents: 140
diff changeset
316 Pair<TreeNode, NodePath> pair = new Pair<TreeNode, NodePath>(node, new DefaultNodePath());
3071b1a471fd add getKeys
one
parents: 140
diff changeset
317 final PathNodeIterator itNode = new PathNodeIterator(pair);
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
318 return new Iterator<Pair<TreeNode, NodePath>>() {
124
75ba2f2d6ea3 searchQueryTest add index
one
parents: 122
diff changeset
319
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
320 private Pair<TreeNode, NodePath> matchPair = nextmatch(itNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
321
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
322 private Pair<TreeNode, NodePath> nextmatch(PathNodeIterator itNode) {
124
75ba2f2d6ea3 searchQueryTest add index
one
parents: 122
diff changeset
323
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
324 for (; itNode.hasNext();) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
325 Pair<TreeNode, NodePath> pathNode = itNode.next();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
326 String value = pathNode.left().getAttributes().getString(key);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
327 Option<TreeMap<String, List<Pair<TreeNode, NodePath>>>> innerIndexOp = index.get(key);
124
75ba2f2d6ea3 searchQueryTest add index
one
parents: 122
diff changeset
328
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
329 if (value != null) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
330 if (innerIndexOp.isNone()) {
124
75ba2f2d6ea3 searchQueryTest add index
one
parents: 122
diff changeset
331
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
332 TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = TreeMap.empty(Ord.stringOrd);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
333 List<Pair<TreeNode, NodePath>> list = List.nil();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
334 list = list.cons(pathNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
335 innerIndex = innerIndex.set(value, list);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
336 index = index.set(key, innerIndex);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
337
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
338 } else {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
339
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
340 TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = innerIndexOp.some();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
341 Option<List<Pair<TreeNode, NodePath>>> opList = innerIndex.get(value);
124
75ba2f2d6ea3 searchQueryTest add index
one
parents: 122
diff changeset
342
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
343 if (opList.isNone()) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
344
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
345 List<Pair<TreeNode, NodePath>> list = List.nil();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
346 list = list.cons(pathNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
347 innerIndex = innerIndex.set(value, list);
99
92d0c6e4655c refactoring to IteratorPathNode
one
parents: 98
diff changeset
348
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
349 } else {
99
92d0c6e4655c refactoring to IteratorPathNode
one
parents: 98
diff changeset
350
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
351 List<Pair<TreeNode, NodePath>> list = opList.some();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
352 list = list.cons(pathNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
353 innerIndex = innerIndex.set(value, list);
101
c297f0015d9e create Update query
one
parents: 100
diff changeset
354
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
355 }
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
356 index = index.set(key, innerIndex);
99
92d0c6e4655c refactoring to IteratorPathNode
one
parents: 98
diff changeset
357
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
358 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
359 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
360
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
361 if (query.condition(pathNode.left()))
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
362 return pathNode;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
363 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
364 return null;
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
365 }
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
366
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
367 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
368 public boolean hasNext() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
369 if (matchPair == null) {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
370 // index = itNode.getIndex();
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
371 return false;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
372 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
373 return true;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
374 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
375
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
376 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
377 public Pair<TreeNode, NodePath> next() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
378 Pair<TreeNode, NodePath> currentPair = matchPair;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
379 matchPair = nextmatch(itNode);
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
380 return currentPair;
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
381 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
382
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
383 @Override
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
384 public void remove() {
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
385 }
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
386
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
387 };
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 136
diff changeset
388 }
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
389 }
97
a1e20a440ddd add BruteForceTraverser
one
parents:
diff changeset
390 }