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