annotate src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java @ 188:868a746996ad

minner change
author tatsuki
date Fri, 17 Apr 2015 22:12:44 +0900
parents 209df7faa37c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
169
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
1 package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index;
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
2
184
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
3 import java.util.Optional;
169
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
4 import java.util.Stack;
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
5
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
6 import fj.data.List;
184
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
7 import jp.ac.u_ryukyu.ie.cr.tatsuki.TreeMap.TreeMap;
169
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren;
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
10
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
11 public class IndexCreater {
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
12
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
13 TreeNode root;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
14 TreeNode node;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
15 int childNumber;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
16 private TreeNodeChildren children;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
17 private Stack<TreeNode> nodeStack = new Stack<TreeNode>();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
18 private Stack<Integer> searchStack = new Stack<Integer>();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
19 ParentIndex parentIndex = new ParentIndex();
184
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
20 TreeMap<String, TreeMap<String, List<TreeNode>>> indexList = new TreeMap();
169
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
21
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
22 public IndexCreater(TreeNode rootNode) {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
23 this.root = rootNode;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
24 this.node = rootNode;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
25 while (node != null) {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
26 TreeNode targetNode = node;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
27 List<String> keys = targetNode.getAttributes().getKeys();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
28 for (String key : keys) {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
29 String value = targetNode.getAttributes().getString(key);
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
30 if (value != null)
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
31 indexList = set(key, value, targetNode);
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
32 }
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
33 if (node.getChildren().size() > 0) {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
34 nodeStack.push(node);
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
35 TreeNode parent = node;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
36 children = node.getChildren();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
37 node = children.at(0).b();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
38 parentIndex.set(parent, node);
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
39 childNumber = 1;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
40 searchStack.push(childNumber);
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
41 } else if (node == root) {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
42 node = null; // no more node
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
43 children = null;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
44 return;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
45 } else if (children != null && children.size() > childNumber) {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
46 childNumber = searchStack.pop();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
47 TreeNode parent = nodeStack.pop();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
48 nodeStack.push(parent);
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
49 node = children.at(childNumber).b();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
50 parentIndex.set(parent, node);
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
51 searchStack.push(++childNumber);
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
52 } else {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
53 node = nodeStack.pop();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
54 children = node.getChildren();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
55 childNumber = searchStack.pop();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
56 for (; children.size() == childNumber; ) {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
57 if (node == root) {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
58 node = null; // no more node
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
59 children = null;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
60 return;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
61 }
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
62 node = nodeStack.pop();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
63 children = node.getChildren();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
64 childNumber = searchStack.pop();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
65 }
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
66 if (node != null && childNumber < children.size()) {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
67 nodeStack.push(node);
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
68 TreeNode parent = node;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
69 node = children.at(childNumber).b();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
70 parentIndex.set(parent, node);
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
71 searchStack.push(++childNumber);
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
72 }
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
73 }
169
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
74 }
174
one
parents: 170
diff changeset
75 }
one
parents: 170
diff changeset
76
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
77 public TreeMap<String, TreeMap<String, List<TreeNode>>> set(String key, String value, TreeNode node) {
184
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
78 if (key == null )
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
79 System.out.println("");
186
209df7faa37c fit TreeMap
tatsuki
parents: 184
diff changeset
80 Optional<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key);
184
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
81 if (!indexOp.isPresent()) {
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
82 TreeMap<String, List<TreeNode>> index = new TreeMap();
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
83 List<TreeNode> nodeList = List.nil();
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
84 nodeList = nodeList.cons(node);
184
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
85 TreeMap<String, List<TreeNode>> newIndex = index.put(value, nodeList);
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
86 indexList = indexList.put(key, newIndex);
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
87 return indexList;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
88 }
174
one
parents: 170
diff changeset
89
184
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
90 TreeMap<String, List<TreeNode>> index = indexOp.get();
186
209df7faa37c fit TreeMap
tatsuki
parents: 184
diff changeset
91 Optional<List<TreeNode>> nodeListOp = index.get(value);
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
92
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
93 List<TreeNode> newNodeList;
184
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
94
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
95 if (nodeListOp.isPresent()) {
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
96 newNodeList = nodeListOp.get().cons(node);
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
97
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
98 } else {
184
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
99 List<TreeNode> nodeList = List.nil();
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
100 newNodeList = nodeList.cons(node);
184
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
101
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
102 }
184
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
103 TreeMap<String, List<TreeNode>> newIndex = index.put(value, newNodeList);
d2b710337eaa change TreeMap
tatsuki
parents: 183
diff changeset
104 indexList = indexList.put(key, newIndex);
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
105
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
106 return indexList;
174
one
parents: 170
diff changeset
107 }
one
parents: 170
diff changeset
108
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
109 public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
110 return indexList;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
111 }
174
one
parents: 170
diff changeset
112
183
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
113 public ParentIndex getParentIndex() {
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
114 return parentIndex;
066d9c5758dc change TreeContext
tatsuki
parents: 174
diff changeset
115 }
169
3cd075a445bf create parent index order o(n^2) → log(n)
one
parents:
diff changeset
116 }