Mercurial > hg > Members > tatsuki > bench > jungle-core
comparison src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/Index.java @ 153:20af7f25ef32
miner change
author | one |
---|---|
date | Tue, 25 Nov 2014 17:52:41 +0900 |
parents | d9fbddf77bf6 |
children | c23f70bb791f 89ed172137ab |
comparison
equal
deleted
inserted
replaced
152:8a0aa8fc137c | 153:20af7f25ef32 |
---|---|
1 package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; | 1 package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; |
2 | 2 |
3 import java.util.Iterator; | 3 import java.util.Iterator; |
4 | 4 |
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator; | |
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; | 6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; |
6 import fj.Ord; | 7 import fj.Ord; |
7 import fj.P2; | 8 import fj.P2; |
8 import fj.data.List; | 9 import fj.data.List; |
9 import fj.data.Option; | 10 import fj.data.Option; |
25 this.indexList = indexList.getIndex(); | 26 this.indexList = indexList.getIndex(); |
26 } | 27 } |
27 | 28 |
28 public Index set(String key, String value, TreeNode node) { | 29 public Index set(String key, String value, TreeNode node) { |
29 Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); | 30 Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); |
30 if (indexOp.isNone()) | 31 if (indexOp.isNone()) { |
31 return this; | 32 TreeMap<String, List<TreeNode>> index = TreeMap.empty(Ord.stringOrd); |
33 List<TreeNode> nodeList = List.nil(); | |
34 List<TreeNode> newNodeList = nodeList.cons(node); | |
35 TreeMap<String, List<TreeNode>> newIndex = index.set(value, newNodeList); | |
36 TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexList = indexList.set(key, newIndex); | |
37 | |
38 | |
39 return new Index(newIndexList); | |
40 } | |
32 | 41 |
33 TreeMap<String, List<TreeNode>> index = indexOp.some(); | 42 TreeMap<String, List<TreeNode>> index = indexOp.some(); |
34 Option<List<TreeNode>> nodeListOp = index.get(value); | 43 Option<List<TreeNode>> nodeListOp = index.get(value); |
35 | 44 |
36 List<TreeNode> newNodeList; | 45 List<TreeNode> newNodeList; |
41 List<TreeNode> nodeList = List.nil(); | 50 List<TreeNode> nodeList = List.nil(); |
42 newNodeList = nodeList.cons(node); | 51 newNodeList = nodeList.cons(node); |
43 } | 52 } |
44 TreeMap<String, List<TreeNode>> newIndex = index.set(value, newNodeList); | 53 TreeMap<String, List<TreeNode>> newIndex = index.set(value, newNodeList); |
45 TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexList = indexList.set(key, newIndex); | 54 TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexList = indexList.set(key, newIndex); |
46 return new Index(newIndexList); | |
47 } | |
48 | |
49 public Index delete(String key, String value, TreeNode node) { | |
50 Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); | |
51 if (indexOp.isNone()) | |
52 return this; | |
53 | |
54 TreeMap<String, List<TreeNode>> index = indexOp.some(); | |
55 TreeMap<String, List<TreeNode>> newIndex = index; | |
56 Option<List<TreeNode>> nodeListOp = index.get(value); | |
57 if (nodeListOp.isSome()) { | |
58 List<TreeNode> nodeList = nodeListOp.some(); | |
59 List<TreeNode> newNodeList = List.nil(); | |
60 for (TreeNode indexingNode : nodeList) { | |
61 if (indexingNode.equals(node)) | |
62 newNodeList = newNodeList.cons(indexingNode); | |
63 } | |
64 | |
65 newIndex = index.set(value, newNodeList); | |
66 } else { | |
67 return this; | |
68 } | |
69 TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexList = indexList.set(key, newIndex); | |
70 return new Index(newIndexList); | |
71 } | |
72 | |
73 public Index deleteNodeAll(TreeNode node) { | |
74 List<String> keys = node.getAttributes().getKeys(); | |
75 TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexList = indexList; | |
76 | |
77 for (String key : keys) { | |
78 Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); | |
79 if (indexOp.isNone()) | |
80 continue; | |
81 | |
82 TreeMap<String, List<TreeNode>> index = indexOp.some(); | |
83 Iterator<P2<String, List<TreeNode>>> indexIterator = index.iterator(); | |
84 | |
85 TreeMap<String, List<TreeNode>> newIndex = index; | |
86 for (; indexIterator.hasNext();) { | |
87 List<TreeNode> newNodeList = List.nil(); | |
88 P2<String, List<TreeNode>> NodeListP2 = indexIterator.next(); | |
89 String value = NodeListP2._1(); | |
90 List<TreeNode> targetNodeList = NodeListP2._2(); | |
91 for (TreeNode targetNode : targetNodeList) { | |
92 if (!node.equals(targetNode)) | |
93 newNodeList = newNodeList.cons(targetNode); | |
94 } | |
95 newIndex = newIndex.set(value, newNodeList); | |
96 } | |
97 newIndexList = indexList.set(key, newIndex); | |
98 } | |
99 | 55 |
100 return new Index(newIndexList); | 56 return new Index(newIndexList); |
101 } | 57 } |
58 | |
59 | |
60 // public Index delete(String key, String value, TreeNode node) { | |
61 // Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); | |
62 // if (indexOp.isNone()) | |
63 // return this; | |
64 // | |
65 // TreeMap<String, List<TreeNode>> index = indexOp.some(); | |
66 // TreeMap<String, List<TreeNode>> newIndex = index; | |
67 // Option<List<TreeNode>> nodeListOp = index.get(value); | |
68 // if (nodeListOp.isSome()) { | |
69 // List<TreeNode> nodeList = nodeListOp.some(); | |
70 // List<TreeNode> newNodeList = List.nil(); | |
71 // for (TreeNode indexingNode : nodeList) { | |
72 // if (indexingNode.equals(node)) | |
73 // newNodeList = newNodeList.cons(indexingNode); | |
74 // } | |
75 // | |
76 // newIndex = index.set(value, newNodeList); | |
77 // } else { | |
78 // return this; | |
79 // } | |
80 // TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexList = indexList.set(key, newIndex); | |
81 // return new Index(newIndexList); | |
82 // } | |
102 | 83 |
103 | 84 |
104 public Index putNodeAll(TreeNode node) { | |
105 List<String> keys = node.getAttributes().getKeys(); | |
106 TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexList = indexList; | |
107 | |
108 for (String key : keys) { | |
109 | |
110 String value = node.getAttributes().getString(key); | |
111 if (value == null) | |
112 continue; | |
113 | |
114 Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); | |
115 if (indexOp.isNone()) | |
116 continue; | |
117 | 85 |
118 TreeMap<String, List<TreeNode>> index = indexOp.some(); | |
119 Option<List<TreeNode>> nodeListOp = index.get(value); | |
120 TreeMap<String, List<TreeNode>> newIndex = index; | |
121 | |
122 if (nodeListOp.isNone()) { | |
123 List<TreeNode> newNodeList = List.nil(); | |
124 newNodeList = newNodeList.cons(node); | |
125 newIndex = newIndex.set(value, newNodeList); | |
126 } else { | |
127 List<TreeNode> newNodeList = nodeListOp.some(); | |
128 newNodeList = newNodeList.cons(node); | |
129 newIndex = newIndex.set(value, newNodeList); | |
130 } | |
131 | |
132 newIndexList = newIndexList.set(key, newIndex); | |
133 } | |
134 return new Index(newIndexList); | |
135 } | |
136 | |
137 public List<TreeNode> get(String key, String value) { | 86 public List<TreeNode> get(String key, String value) { |
87 | |
138 Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); | 88 Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); |
139 if (indexOp.isNone()) | 89 if (indexOp.isNone()) |
140 return List.nil(); | 90 return null; |
141 | 91 |
142 TreeMap<String, List<TreeNode>> index = indexOp.some(); | 92 TreeMap<String, List<TreeNode>> index = indexOp.some(); |
143 Option<List<TreeNode>> nodeListOp = index.get(value); | 93 Option<List<TreeNode>> nodeListOp = index.get(value); |
144 | 94 |
145 if (nodeListOp.isNone()) | 95 if (nodeListOp.isNone()) |
146 return List.nil(); | 96 return List.nil(); |
147 | 97 |
148 return nodeListOp.some(); | 98 return nodeListOp.some(); |
149 } | 99 } |
150 | 100 |
101 public Iterator<TreeNode> getAll(String key){ | |
102 | |
103 Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); | |
104 if (indexOp.isNone()) | |
105 return null; | |
106 | |
107 TreeMap<String, List<TreeNode>> index = indexOp.some(); | |
108 if (!index.isEmpty()) | |
109 return new NulIterator<TreeNode>(); | |
110 | |
111 | |
112 return new Iterator<TreeNode>(){ | |
113 | |
114 Iterator<P2<String, List<TreeNode>>> treeMapIterator = index.iterator(); | |
115 List<TreeNode> nodeList = List.nil(); | |
116 TreeNode node; | |
117 | |
118 @Override | |
119 public boolean hasNext() { | |
120 | |
121 if (nodeList.isNotEmpty()) { | |
122 node = nodeList.head(); | |
123 nodeList = nodeList.tail(); | |
124 return true; | |
125 } | |
126 | |
127 for (;treeMapIterator.hasNext();) { | |
128 nodeList = treeMapIterator.next()._2(); | |
129 node = nodeList.head(); | |
130 nodeList = nodeList.tail(); | |
131 return true; | |
132 } | |
133 return false; | |
134 } | |
135 | |
136 @Override | |
137 public TreeNode next() { | |
138 return node; | |
139 } | |
140 | |
141 }; | |
142 | |
143 } | |
151 | 144 |
152 private TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { | 145 private TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { |
153 return indexList; | 146 return indexList; |
154 } | 147 } |
155 | 148 |