Mercurial > hg > Members > shoshi > jungle > jungle-core
annotate src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/index/defaultTree/IndexTest.java @ 308:201cc75a9984
change Red Black Tree Edit Path Extends
author | tatsuki |
---|---|
date | Thu, 26 Jan 2017 15:23:25 +0900 |
parents | 0767620e6f5f |
children | 2a0cb1f0ba4e |
rev | line source |
---|---|
288 | 1 package jp.ac.u_ryukyu.ie.cr.jungle.index.defaultTree; |
282 | 2 |
3 import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; | |
4 import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; | |
5 import jp.ac.u_ryukyu.ie.cr.jungle.core.Children; | |
285 | 6 import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; |
302
0767620e6f5f
implements DifferentialInterfaceTraverser and this tests
tatsuki
parents:
288
diff
changeset
|
7 import jp.ac.u_ryukyu.ie.cr.jungle.query.traverser.nodeiterator.DefaultNodeIterator; |
282 | 8 import jp.ac.u_ryukyu.ie.cr.jungle.store.index.Index; |
9 import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.DefaultNodePath; | |
10 import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.NodePath; | |
11 import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.JungleTreeEditor; | |
12 import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode; | |
13 import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNodeAttributes; | |
14 import jp.ac.u_ryukyu.ie.cr.jungle.tree.JungleTree; | |
15 import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; | |
16 import jp.ac.u_ryukyu.ie.cr.jungle.util.Error.Error; | |
17 import org.junit.Assert; | |
18 import org.junit.Test; | |
19 | |
20 import java.nio.ByteBuffer; | |
21 import java.util.Iterator; | |
22 import java.util.LinkedList; | |
23 import java.util.List; | |
285 | 24 import java.util.Optional; |
282 | 25 |
26 import static jp.ac.u_ryukyu.ie.cr.jungle.CreateTreeMethod.createTree; | |
27 | |
28 | |
29 public class IndexTest { | |
30 | |
31 @Test | |
32 public void IndexTests() { | |
33 String key = "key"; | |
34 String indexKey = "indexKey"; | |
35 String addAttributeKey = "addAttributeKey"; | |
308 | 36 Jungle jungle = new DefaultJungle(null, "hogehoge"); |
282 | 37 jungle.createNewTree("tree"); |
38 JungleTree tree = jungle.getTreeByName("tree"); | |
39 JungleTreeEditor editor = tree.getJungleTreeEditor(); | |
40 NodePath path = new DefaultNodePath(); | |
41 createTree(editor, key, indexKey, 4, path); | |
42 TreeNode oldTreeRoot = tree.getRootNode(); | |
43 Index index = tree.getIndex(); | |
302
0767620e6f5f
implements DifferentialInterfaceTraverser and this tests
tatsuki
parents:
288
diff
changeset
|
44 DefaultNodeIterator iterator = new DefaultNodeIterator(oldTreeRoot); |
282 | 45 while (iterator.hasNext()) { |
46 TreeNode node = iterator.next(); | |
47 TreeNodeAttributes attribute = node.getAttributes(); | |
48 Iterator<String> keys = attribute.getKeys(); | |
285 | 49 while (keys.hasNext()) { //作った木にちゃんとIndexが張られているかを調べる |
282 | 50 String attributeKey = keys.next(); |
51 String value = attribute.getString(attributeKey); | |
52 Iterator<TreeNode> indexNode = index.get(attributeKey, value); | |
53 Assert.assertTrue(indexNode.hasNext()); | |
54 Assert.assertEquals(indexNode.next(),node); | |
55 } | |
56 } | |
57 | |
58 JungleTreeEditor editor2 = tree.getJungleTreeEditor(); | |
59 path = path.add(0).add(0).add(2); | |
60 Either<Error, JungleTreeEditor> either = editor2.putAttribute(path, addAttributeKey, ByteBuffer.wrap("value1".getBytes())); | |
61 Assert.assertFalse(either.isA()); | |
62 JungleTreeEditor editor3 = either.b(); | |
63 NodePath path2 = new DefaultNodePath(); | |
64 path2 = path2.add(1).add(1).add(2); | |
65 Either<Error, JungleTreeEditor> either2 = editor3.putAttribute(path2, addAttributeKey, ByteBuffer.wrap("value2".getBytes())); | |
66 Assert.assertFalse(either2.isA()); | |
67 JungleTreeEditor editor4 = either2.b(); | |
68 Either<Error, JungleTreeEditor> either3 = editor4.success(); | |
69 Assert.assertFalse(either3.isA()); | |
70 | |
71 TreeNode newTreeRoot = tree.getRootNode(); | |
72 Index newIndex = tree.getIndex(); | |
302
0767620e6f5f
implements DifferentialInterfaceTraverser and this tests
tatsuki
parents:
288
diff
changeset
|
73 iterator = new DefaultNodeIterator(newTreeRoot); |
285 | 74 while (iterator.hasNext()) { //木を編集した際に差分でIndexがアップデートされているかを調べる |
282 | 75 TreeNode node = iterator.next(); |
76 TreeNodeAttributes attribute = node.getAttributes(); | |
77 Iterator<String> keys = attribute.getKeys(); | |
78 while (keys.hasNext()) { | |
79 String attributeKey = keys.next(); | |
80 String value = attribute.getString(attributeKey); | |
81 Iterator<TreeNode> indexNode = newIndex.get(attributeKey, value); | |
82 Assert.assertTrue(indexNode.hasNext()); | |
83 Assert.assertEquals(indexNode.next(),node); | |
84 } | |
285 | 85 newIndex = newIndex.delete(node); |
282 | 86 } |
87 | |
285 | 88 |
89 TreeMap<String, TreeMap<String, jp.ac.u_ryukyu.ie.cr.jungle.data.list.List<TreeNode>>> indexList = newIndex.getIndexList(); //差分で更新した際不要な値がIndexに残っていないかを調べる | |
90 Iterator<String> indexKeys = indexList.keys(); | |
91 while(indexKeys.hasNext()){ | |
92 String indexKeys2 = indexKeys.next(); | |
93 Optional<TreeMap<String, jp.ac.u_ryukyu.ie.cr.jungle.data.list.List<TreeNode>>> treeMapIndexOp = indexList.get(indexKeys2); | |
94 Assert.assertTrue(treeMapIndexOp.isPresent()); | |
95 TreeMap<String, jp.ac.u_ryukyu.ie.cr.jungle.data.list.List<TreeNode>> treeMapIndex = treeMapIndexOp.get(); | |
96 Iterator<String> treeMapIndexKeys = treeMapIndex.keys(); | |
97 while (treeMapIndexKeys.hasNext()) { | |
98 String treeMapIndexkey = treeMapIndexKeys.next(); | |
99 Optional<jp.ac.u_ryukyu.ie.cr.jungle.data.list.List<TreeNode>> nodeListOp = treeMapIndex.get(treeMapIndexkey); | |
100 Assert.assertTrue(nodeListOp.isPresent()); | |
101 jp.ac.u_ryukyu.ie.cr.jungle.data.list.List<TreeNode> nodeList = nodeListOp.get(); | |
102 Assert.assertEquals(nodeList.length(),0); | |
103 } | |
104 } | |
105 | |
106 //編集する際に新しい木に残らないノードがIndexに混ざってないかをしらべる | |
282 | 107 List<TreeNode> deletedNodeList = new LinkedList<>(); |
108 deletedNodeList = getDeletedNodeList(deletedNodeList, oldTreeRoot, path); | |
109 deletedNodeList = getDeletedNodeList(deletedNodeList, oldTreeRoot, path2); | |
285 | 110 newIndex = tree.getIndex(); |
282 | 111 for (TreeNode deletedNode : deletedNodeList) { |
112 TreeNodeAttributes attribute = deletedNode.getAttributes(); | |
113 Iterator<String> keys = attribute.getKeys(); | |
114 while (keys.hasNext()) { | |
115 String attributeKey = keys.next(); | |
116 String value = attribute.getString(key); | |
285 | 117 Iterator<TreeNode> newIndexNode = newIndex.get(attributeKey, value); |
118 Iterator<TreeNode> oldIndexNode = index.get(attributeKey, value); | |
119 Assert.assertTrue(newIndexNode.hasNext()); | |
120 Assert.assertTrue(oldIndexNode.hasNext()); | |
121 Assert.assertNotEquals(newIndexNode.next(),oldIndexNode.next()); | |
122 Assert.assertFalse(newIndexNode.hasNext()); | |
123 Assert.assertFalse(oldIndexNode.hasNext()); | |
282 | 124 } |
125 } | |
126 } | |
127 | |
128 private List<TreeNode> getDeletedNodeList(List<TreeNode> list, TreeNode oldTreeRoot, NodePath path) { | |
129 TreeNode node = oldTreeRoot; | |
130 for (Integer i : path.pop().right()) { | |
131 Children children = node.getChildren(); | |
132 Either<Error, TreeNode> either = children.at(i); | |
133 Assert.assertFalse(either.isA()); | |
134 node = either.b(); | |
135 list.add(node); | |
136 } | |
137 return list; | |
138 } | |
139 | |
140 | |
141 } |