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