# HG changeset patch # User one # Date 1416637509 -32400 # Node ID 8a0aa8fc137cf12cc8dc153c4b62084d67aab9c8 # Parent d9fbddf77bf6c176cc1bb8c836d29bd38d9d28dc# Parent a2c374a2686b82b0ad30f520412e191b84288fa9 Merge with a2c374a2686b82b0ad30f520412e191b84288fa9 diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/App.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Attributes.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/ChangeSet.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeAttributes.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingAttributes.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultChangeSet.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeAttribute.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/IndexJungleTreeEditor.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/AddNewChildrenIndexEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/AddNewChildrenIndexEditor.java Sat Nov 22 15:25:09 2014 +0900 @@ -0,0 +1,117 @@ +package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; + + +import fj.Ord; +import fj.data.List; +import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; + +public class AddNewChildrenIndexEditor implements IndexEditor { + + NodePath editNodePath; + + public AddNewChildrenIndexEditor(int pos, NodePath path) { + this.editNodePath = path.add(pos); + } + + @Override + public Either edit( + TreeNode root, + TransactionManager txManager, + TreeEditor editor, + TreeOperationLog log, + TreeMap>> index) { + + TreeMap>> newIndex = editIndex(index); + IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root, txManager, editor, newIndex); + return DefaultEither.newB(newEditor); + } + + public TreeMap>> editIndex( + TreeMap>> index) { + + if (!index.isEmpty()) { + List keyList = index.keys(); + TreeMap>> newIndex = TreeMap.empty(Ord.stringOrd); + TreeMap> newInnerIndex = TreeMap.empty(Ord.stringOrd); + + for (String indexKey : keyList) { + TreeMap> innerIndex = index.get(indexKey).some(); + List innerIndexKeyList = innerIndex.keys(); + + for (String innerIndexKey : innerIndexKeyList) { + List pairList = innerIndex.get(innerIndexKey).some(); + List list = checkPath(pairList); + if (!list.isEmpty()){ + //System.out.println(new String(list.head().left().getAttributes().get("KEY").array())); + newInnerIndex = newInnerIndex.set(innerIndexKey, list); + } + } + newIndex = newIndex.set(indexKey, newInnerIndex); + } + return newIndex; + } else { + return index; + } + } + + public List checkPath(List pairList){ + + List list = List.nil(); + for (NodePath path : pairList) { + + + //System.out.println("oldPath = " + path.toString()); + NodePath newPath = new DefaultNodePath(); + + + if (editNodePath.size() > path.size()) { + list = list.cons(path); + continue; + } + + Pair editNodePathCopy = editNodePath.pop(); + int loopCount = 0; + + for (Integer pathInt : path) { + loopCount++; + + if (pathInt == -1) + continue; + + if (editNodePathCopy.right().size() > 0) { + editNodePathCopy = editNodePathCopy.right().pop(); + + if (loopCount == editNodePath.size() && editNodePathCopy.left() <= pathInt) { + newPath = newPath.add(pathInt + 1); + continue; + } + + if (!(editNodePathCopy.left() == pathInt)) { + newPath = path; + break; + } + } + + newPath = newPath.add(pathInt); + + } + + //System.out.println("newPath = " + newPath.toString()); + list = list.cons(path); + } + + return list; + } + +} diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DefaultIndexEditor.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteChildIndexEditor.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteIndexEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteIndexEditor.java Sat Nov 22 15:25:09 2014 +0900 @@ -0,0 +1,107 @@ +package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +import fj.data.List; +import fj.data.Option; +import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; + +public class DeleteIndexEditor implements IndexEditor { + + String key; + String pathString; + NodePath path; + TreeNode node; + + public DeleteIndexEditor(String key, NodePath path, TreeNode node) { + this.key = key; + this.pathString = path.toString(); + this.path = path; + this.node = node; + } + + @Override + public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>> index) { + NodePath newPath = path.pop().right(); + TreeNode target = getTarget(node, newPath); + TreeMap>> newIndex = index; + Iterator attributeIterator = target.getAttributes().getString(key); + for (;attributeIterator.hasNext();){ + String attribute = attributeIterator.next(); + newIndex = editIndex(attribute, newIndex); + } + IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex); + Either either = DefaultEither.newB(newEditor); + return either; + } + + public TreeMap>> editIndex(String attribute, TreeMap>> index){ + + Option>> innerIndexOp = index.get(key); + + if (innerIndexOp.isSome()) { + TreeMap> innerIndex = innerIndexOp.some(); + Option> listOp = innerIndex.get(attribute); + + if (listOp.isSome()) { + List list = listOp.some(); + List newList = List.nil(); + + for (NodePath path : list){ + if (!path.toString().equals(pathString)) { + newList = newList.cons(path); + } + } + + if (newList.isEmpty()) { + TreeMap> newInnerIndex = innerIndex.delete(attribute); + + if (newInnerIndex.isEmpty()) { + TreeMap>> newIndex = index.delete(key); + return newIndex; + } + + TreeMap>> newIndex = index.set(key, newInnerIndex); + return newIndex; + } + + TreeMap> newInnerIndex = innerIndex.set(attribute,newList); + TreeMap>> newIndex = index.set(key, newInnerIndex); + return newIndex; + + } else { + return index; + } + } else { + return index; + } + } + + public TreeNode getTarget(TreeNode node , NodePath path){ + Pair pathNode = path.pop(); + Either either = node.getChildren().at(pathNode.left()); + if (either.isA()) + return node; + + TreeNode child = either.b(); + if (pathNode.right().size() == 0) + return child; + + TreeNode target = getTarget(child,pathNode.right()); + return target; + } + + +} diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexEditor.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexManager.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java Sat Nov 22 15:25:09 2014 +0900 @@ -0,0 +1,98 @@ +package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; + + + +import fj.Ord; +import fj.data.List; +import fj.data.Option; +import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +import java.nio.ByteBuffer; + +public class PutIndexEditor implements IndexEditor { + + String key; + String attribute; + NodePath path; + TransactionManager txManager; + TreeNode root; + TreeEditor editor; + TreeOperationLog log; + + public PutIndexEditor(String key, ByteBuffer attribute,NodePath path) { + this.key = key; + this.attribute = new String(attribute.array()); + this.path = path; + } + + @Override + public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>> index) { + TreeMap>> newIndex = editIndex(path, key, attribute,index); + IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex); + Either either = DefaultEither.newB(newEditor); + return either; + } + + public TreeMap>> editIndex(NodePath path, String key, String attribute,TreeMap>> index){ + + Option>> innerIndexOp = index.get(key); + + if (attribute != null) { + if (innerIndexOp.isNone()) { + + TreeMap> innerIndex = TreeMap.empty(Ord.stringOrd); + List list = List.nil(); + list = list.cons(path); + innerIndex = innerIndex.set(attribute, list); + TreeMap>> newIndex = index.set(key, innerIndex); + return newIndex; + } else { + + TreeMap> innerIndex = innerIndexOp.some(); + + Option> opList = innerIndex.get(attribute); + + if (opList.isNone()) { + + List list = List.nil(); + list = list.cons(path); + innerIndex = innerIndex.set(attribute, list); + + } else { + + List list = opList.some(); + list = list.cons(path); + innerIndex = innerIndex.set(attribute, list); + + } + TreeMap>> newIndex = index.set(key, innerIndex); + return newIndex; + } + } + return index; + } + +// public TreeNode getTarget(TreeNode node , NodePath path){ +// Pair path = path.pop(); +// Either either = node.getChildren().at(path.left()); +// if (either.isA()) +// return node; +// +// TreeNode child = either.b(); +// if (path.right().size() == 0) +// return child; +// +// TreeNode target = getTarget(child,path.right()); +// return target; +// } + +} diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/DefaultJungleTreeTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/AttributesTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/impl/treeeditor/DefaultTreeEditorTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/DeleteAttributeAtTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/PutAttributeTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/node/DefaultAttributesTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/node/DefaultChildrenTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/node/DefaultNodeTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverse/TraverserTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/functionaljava/FjListTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/functionaljava/FjListTest.java Sat Nov 22 15:25:09 2014 +0900 @@ -0,0 +1,20 @@ +package jp.ac.u_ryukyu.ie.cr.tatsuki.functionaljava; + +import java.nio.ByteBuffer; + +import fj.F; +import fj.data.List; + +public class FjListTest { + + static public void main(String args[]){ + + List list = List.nil(); + list = list.cons("wei"); + String aaa = list.head(); + boolean t1 = list.isEmpty(); + list = list.tail(); + boolean t2 = list.isEmpty(); + System.out.println(aaa); + } +} diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/AddChildrenIndexTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/AttributeIndexTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/DeleteChildrenIndexTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexCommitTest.java diff -r d9fbddf77bf6 -r 8a0aa8fc137c src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/query/SearchQueryTest.java