annotate src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java @ 145:72f454eb04ec

add parentIndex
author one
date Fri, 21 Nov 2014 08:11:24 +0900
parents 99bda30ea72c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
1 package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
2
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
3
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
4
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
5 import fj.Ord;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
6 import fj.data.List;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
7 import fj.data.Option;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
8 import fj.data.TreeMap;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor;
145
72f454eb04ec add parentIndex
one
parents: 140
diff changeset
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.IndexTreeEditor;
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor;
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
20
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
21 import java.nio.ByteBuffer;
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
22
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
23 public class PutIndexEditor implements IndexEditor {
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
24
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
25 String key;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
26 String attribute;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
27 NodePath path;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
28 TransactionManager txManager;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
29 TreeNode root;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
30 TreeEditor editor;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
31 TreeOperationLog log;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
32
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
33 public PutIndexEditor(String key, ByteBuffer attribute,NodePath path) {
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 135
diff changeset
34 this.key = key;
7334f78a92c3 name changed find to findInSubTree
one
parents: 135
diff changeset
35 this.attribute = new String(attribute.array());
7334f78a92c3 name changed find to findInSubTree
one
parents: 135
diff changeset
36 this.path = path;
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
37 }
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
38
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
39 @Override
145
72f454eb04ec add parentIndex
one
parents: 140
diff changeset
40 public Either<Error, IndexJungleTreeEditor>edit(TreeNode root,TransactionManager txManager, IndexTreeEditor editor,TreeOperationLog log,TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index, TreeMap<TreeNode,TreeNode> parentIndex) {
130
bb53330364f1 add putIndexEditor and deleteIndexEditor
one
parents: 128
diff changeset
41 NodePath newPath = path.pop().right();
bb53330364f1 add putIndexEditor and deleteIndexEditor
one
parents: 128
diff changeset
42 TreeNode target = getTarget(root, newPath);
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
43 TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = editIndex(target, path, key, attribute,index);
145
72f454eb04ec add parentIndex
one
parents: 140
diff changeset
44 IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex, parentIndex);
130
bb53330364f1 add putIndexEditor and deleteIndexEditor
one
parents: 128
diff changeset
45 Either<Error, IndexJungleTreeEditor> either = DefaultEither.newB(newEditor);
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
46 return either;
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
47 }
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
48
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
49 public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> editIndex(TreeNode target, NodePath path, String key, String attribute,TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index){
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
50
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
51 Option<TreeMap<String, List<Pair<TreeNode, NodePath>>>> innerIndexOp = index.get(key);
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
52 Pair<TreeNode, NodePath> pathNode = new Pair<TreeNode, NodePath>(target,path);
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
53
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
54 if (attribute != null) {
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
55 if (innerIndexOp.isNone()) {
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
56
137
7334f78a92c3 name changed find to findInSubTree
one
parents: 135
diff changeset
57 TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = TreeMap.empty(Ord.stringOrd);
7334f78a92c3 name changed find to findInSubTree
one
parents: 135
diff changeset
58 List<Pair<TreeNode, NodePath>> list = List.nil();
7334f78a92c3 name changed find to findInSubTree
one
parents: 135
diff changeset
59 list = list.cons(pathNode);
7334f78a92c3 name changed find to findInSubTree
one
parents: 135
diff changeset
60 innerIndex = innerIndex.set(attribute, list);
7334f78a92c3 name changed find to findInSubTree
one
parents: 135
diff changeset
61 TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = index.set(key, innerIndex);
139
ec166c8ff079 add findAll and findInSubTreeAll
one
parents: 137
diff changeset
62 return newIndex;
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
63 } else {
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
64
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
65 TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = innerIndexOp.some();
140
99bda30ea72c temporarily stored
one
parents: 139
diff changeset
66
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
67 Option<List<Pair<TreeNode, NodePath>>> opList = innerIndex.get(attribute);
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
68
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
69 if (opList.isNone()) {
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
70
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
71 List<Pair<TreeNode, NodePath>> list = List.nil();
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
72 list = list.cons(pathNode);
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
73 innerIndex = innerIndex.set(attribute, list);
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
74
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
75 } else {
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
76
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
77 List<Pair<TreeNode, NodePath>> list = opList.some();
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
78 list = list.cons(pathNode);
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
79 innerIndex = innerIndex.set(attribute, list);
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
80
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
81 }
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
82 TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = index.set(key, innerIndex);
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
83 return newIndex;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
84 }
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
85 }
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
86 return index;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
87 }
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
88
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
89 public TreeNode getTarget(TreeNode node , NodePath path){
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
90 Pair<Integer, NodePath> pathNode = path.pop();
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
91 Either<Error, TreeNode> either = node.getChildren().at(pathNode.left());
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
92 if (either.isA())
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
93 return node;
130
bb53330364f1 add putIndexEditor and deleteIndexEditor
one
parents: 128
diff changeset
94
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
95 TreeNode child = either.b();
130
bb53330364f1 add putIndexEditor and deleteIndexEditor
one
parents: 128
diff changeset
96 if (pathNode.right().size() == 0)
bb53330364f1 add putIndexEditor and deleteIndexEditor
one
parents: 128
diff changeset
97 return child;
bb53330364f1 add putIndexEditor and deleteIndexEditor
one
parents: 128
diff changeset
98
128
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
99 TreeNode target = getTarget(child,pathNode.right());
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
100 return target;
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
101 }
9c46e5c2ffac edit PutIndexEditor
one
parents: 118
diff changeset
102
118
baa1e2e7c503 add IndexEditor
one
parents:
diff changeset
103 }