# HG changeset patch # User one # Date 1416041287 -32400 # Node ID afbe19c98f533a0d92f48c5c13e47280c6c813b3 # Parent ef183969bf3195ce8ccb7bb56e9e22b6ddce0829 change Index form TreeMap>>> → TreeMap>> bag diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java Sat Nov 15 17:48:07 2014 +0900 @@ -14,7 +14,6 @@ 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.DefaultTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; @@ -22,7 +21,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; 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 DefaultJungle implements Jungle { @@ -82,7 +80,7 @@ }; DefaultTreeNode root = new DefaultTreeNode(); - TreeMap>>> index = TreeMap.empty(Ord.stringOrd); + TreeMap>> index = TreeMap.empty(Ord.stringOrd); ChangeSet set = new DefaultChangeSet(root,null,list,uuid,name,0,index); DefaultTreeContext tc = new DefaultTreeContext(root,set); JungleTree newTree = new DefaultJungleTree(tc,uuid,journal.getWriter(),editor); diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java Sat Nov 15 17:48:07 2014 +0900 @@ -41,7 +41,7 @@ TreeContext tc = repository.get(); DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); TreeNode root = tc.getTreeNode(); - TreeMap>>> index = getIndex(); + TreeMap>> index = getIndex(); return new DefaultJungleTreeEditor(root, txManager, editor, index); } @@ -50,7 +50,7 @@ TreeContext tc = repository.get(); DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); TreeNode root = tc.getTreeNode(); - TreeMap>>> newIndex = getIndex(); + TreeMap>> newIndex = getIndex(); return new IndexJungleTreeEditor(root, txManager, editor, newIndex); } @@ -70,14 +70,14 @@ public InterfaceTraverser getTraverser() { AtomicReservableReference.Reservation reservation = repository.getReservation(); IndexManager indexManager = new IndexManager(reservation); - TreeMap>>> index = getIndex(); + TreeMap>> index = getIndex(); if (index != null) return new InterfaceTraverser(getRootNode(), index, indexManager); return new InterfaceTraverser(getRootNode(), indexManager); } @Override - public TreeMap>>> getIndex() { + public TreeMap>> getIndex() { TreeContext tc = repository.get(); ChangeSet cs = tc.getChangeSet(); return cs.getIndex(); diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java Sat Nov 15 17:48:07 2014 +0900 @@ -10,7 +10,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; 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 interface JungleTree { @@ -18,7 +17,7 @@ public InterfaceTraverser getTraverser(); public JungleTreeEditor getLocalTreeEditor(); public TreeNode getRootNode(); - public TreeMap>>> getIndex(); + public TreeMap>> getIndex(); public IndexJungleTreeEditor getIndexTreeEditor(); public Iterable getLog(); public long revision(); diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/ChangeSet.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/ChangeSet.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/ChangeSet.java Sat Nov 15 17:48:07 2014 +0900 @@ -21,6 +21,6 @@ public String getTreeName(); public long revision(); - public TreeMap>>> getIndex(); + public TreeMap>> getIndex(); public Iterable getOperations(); } diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultChangeSet.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultChangeSet.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultChangeSet.java Sat Nov 15 17:48:07 2014 +0900 @@ -17,9 +17,9 @@ private final String uuid; private final String treeName; private final long revision; - private final TreeMap>>> index; + private final TreeMap>> index; - public DefaultChangeSet(TreeNode _node,ChangeSet _prev,ChangeList _log,String _uuid, String _treeName, long _revision, TreeMap>>> index) + public DefaultChangeSet(TreeNode _node,ChangeSet _prev,ChangeList _log,String _uuid, String _treeName, long _revision, TreeMap>> index) { this.root = _node; this.previous = _prev; @@ -74,7 +74,7 @@ } @Override - public TreeMap>>> getIndex() { + public TreeMap>> getIndex() { return index; } diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java Sat Nov 15 17:48:07 2014 +0900 @@ -32,20 +32,20 @@ private final TreeNode root; private final TreeEditor editor; private final TreeOperationLog log; - private final TreeMap>>> index; + private final TreeMap>> index; // public DefaultJungleTreeEditor(TreeNode root) // { // this(root,txManager,_editor,new DefaultTreeOperationLog()); // } - public DefaultJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor, TreeMap>>> index) + public DefaultJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor, TreeMap>> index) { this(_root,_txManager,_editor,new DefaultTreeOperationLog(),index); } - public DefaultJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log, TreeMap>>> index) + public DefaultJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log, TreeMap>> index) { this.root = newNode; this.txManager = _txManager; diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java Sat Nov 15 17:48:07 2014 +0900 @@ -17,7 +17,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; 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 DefaultTransactionManager implements TransactionManager { @@ -36,7 +35,7 @@ } @Override - public Either commit(TreeNode _newRoot,final TreeOperationLog _log, TreeMap>>> index) + public Either commit(TreeNode _newRoot,final TreeOperationLog _log, TreeMap>> index) { ChangeSet cs = tip.getChangeSet(); long currentRevision = cs.revision(); diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java Sat Nov 15 17:48:07 2014 +0900 @@ -52,6 +52,7 @@ public List getChildrenAsRawList(){ return children; } + @Override public Either addNewChildAt(int _pos) { @@ -111,8 +112,7 @@ @Override public Either at(int _pos) { - System.out.println(children.length()); - if(children.length() < _pos + 1){ + if(!boundaryCheck(_pos)){ return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); } diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/IndexJungleTreeEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/IndexJungleTreeEditor.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/IndexJungleTreeEditor.java Sat Nov 15 17:48:07 2014 +0900 @@ -24,7 +24,6 @@ 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.IterableConverter; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.AddNewChildrenIndexEditor; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.DefaultIndexEditor; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.DeleteChildIndexEditor; @@ -38,28 +37,28 @@ private final TreeNode root; private final TreeEditor editor; private final TreeOperationLog log; - private TreeMap>>> index; + private TreeMap>> index; // public DefaultJungleTreeEditor(TreeNode root) // { // this(root,txManager,_editor,new DefaultTreeOperationLog()); // } - public TreeMap>>> getIndex() { + public TreeMap>> getIndex() { return index; } public void setIndex( - TreeMap>>> index) { + TreeMap>> index) { this.index = index; } - public IndexJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor, TreeMap>>> index) + public IndexJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor, TreeMap>> index) { this(_root,_txManager,_editor,new DefaultTreeOperationLog(), index); } - public IndexJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log, TreeMap>>> index) + public IndexJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log, TreeMap>> index) { this.root = newNode; this.txManager = _txManager; diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java Sat Nov 15 17:48:07 2014 +0900 @@ -7,11 +7,10 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; 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 interface TransactionManager { - public Either commit(TreeNode _newRoot,TreeOperationLog _log, TreeMap>>> index); + public Either commit(TreeNode _newRoot,TreeOperationLog _log, TreeMap>> index); public String getUUID(); public long getRevision(); } diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java Sat Nov 15 17:48:07 2014 +0900 @@ -11,6 +11,8 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator; 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.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIterator; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.Query; @@ -20,7 +22,7 @@ // InterfaceTraverser traverser; TreeNode node; - TreeMap>>> index; + TreeMap>> index; IndexManager indexManager; public InterfaceTraverser(TreeNode _root, IndexManager indexManager) { @@ -29,7 +31,7 @@ this.indexManager = indexManager; } - public InterfaceTraverser(TreeNode _root, TreeMap>>> index, + public InterfaceTraverser(TreeNode _root, TreeMap>> index, IndexManager indexManager) { this.node = _root; this.index = index; @@ -40,11 +42,11 @@ indexManager.commit(index); } - public TreeMap>>> getIndex() { + public TreeMap>> getIndex() { return index; } - public void setIndex(TreeMap>>> index) { + public void setIndex(TreeMap>> index) { this.index = index; } @@ -66,26 +68,42 @@ if (index.get(key).isSome()) { - TreeMap>> innerIndex = this.index.get(key).some(); + TreeMap> innerIndex = this.index.get(key).some(); - Option>> opList = innerIndex.get(searchValue); + Option> opList = innerIndex.get(searchValue); if (opList.isNone()) return new NulIterator>();// 空のIteratorを返す - List> list = opList.some(); + List list = opList.some(); NodePath targetNodePath = subTree.right(); - List> filteredList = List.nil(); + + return new Iterator>() { - for (Pair pair : list) { - NodePath compareNodePath = pair.right(); - if (targetNodePath.compare(compareNodePath)) - filteredList = filteredList.cons(pair); - } + NodePath path; + List comparePathList = list; + @Override + public boolean hasNext() { + for (NodePath comparePath : comparePathList) { + this.path = comparePath; + comparePathList = comparePathList.tail(); + if (targetNodePath.compare(path)) + return true; + } + return false; + } - return filteredList.iterator(); + @Override + public Pair next() { + TreeNode targetNode = getTarget(node, path); + Pair targetPair = new Pair(targetNode, path); + return targetPair; + } + + }; } else { + final PathNodeIterator itNode = new PathNodeIterator(subTree); return new Iterator>() { @@ -144,26 +162,50 @@ if (index.get(key).isSome()) { - TreeMap>> innerIndex = this.index.get(key).some(); - List searchValues = innerIndex.keys(); - List> filteredList = List.nil(); + TreeMap> innerIndex = this.index.get(key).some(); + Iterator>> searchValueIterator = innerIndex.iterator(); + Iterator>> searchValueIterator2 = innerIndex.iterator(); + + System.out.println("start-----------------------------------------------------------------"); + for (;searchValueIterator2.hasNext();) { + String a = searchValueIterator2.next()._1(); + System.out.println(a); + } NodePath targetNodePath = subTree.right(); + return new Iterator>() { - for (String searchValue : searchValues) { - Option>> opList = innerIndex.get(searchValue); + List pathList = List.nil(); + NodePath path; - if (opList.isNone()) - continue; + @Override + public boolean hasNext() { + if (!pathList.isEmpty()) { + path = pathList.head(); + pathList = pathList.tail(); + if (targetNodePath.compare(path)) + return true; + return this.hasNext(); + } - List> list = opList.some(); - for (Pair pair : list) { - NodePath compareNodePath = pair.right(); - if (targetNodePath.compare(compareNodePath)) - filteredList = filteredList.cons(pair); + if (searchValueIterator.hasNext()) { + pathList = searchValueIterator.next()._2(); + path = pathList.head(); + pathList = pathList.tail(); + + if (targetNodePath.compare(path)) + return true; + return this.hasNext(); + } + return false; + } + @Override + public Pair next() { + TreeNode targetNode = getTarget(node, path); + Pair targetPair = new Pair(targetNode, path); + return targetPair; } - } - return filteredList.iterator(); + }; } else { final PathNodeIterator itNode = new PathNodeIterator(subTree); @@ -208,14 +250,36 @@ if (index.get(key).isSome()) { - TreeMap>> innerIndex = this.index.get(key).some(); - Option>> opList = innerIndex.get(searchValue); + TreeMap> innerIndex = this.index.get(key).some(); + Option> opList = innerIndex.get(searchValue); if (opList.isNone()) return new NulIterator>();// 空のIteratorを返す - final List> list = opList.some(); - return list.iterator(); + final List list = opList.some(); + return new Iterator>() { + + List pathList = list; + NodePath targetPath; + + @Override + public boolean hasNext() { + if (!pathList.isEmpty()) { + targetPath = pathList.head(); + pathList = pathList.tail(); + return true; + } + + return false; + } + + @Override + public Pair next() { + TreeNode targetNode = getTarget(node, targetPath); + Pair targetPair = new Pair(targetNode, targetPath); + return targetPair; + } + }; } else { Pair pair = new Pair(node, new DefaultNodePath()); @@ -229,32 +293,32 @@ for (; itNode.hasNext();) { Pair pathNode = itNode.next(); String value = pathNode.left().getAttributes().getString(key); - Option>>> innerIndexOp = index.get(key); + Option>> innerIndexOp = index.get(key); if (value != null) { if (innerIndexOp.isNone()) { - TreeMap>> innerIndex = TreeMap.empty(Ord.stringOrd); - List> list = List.nil(); - list = list.cons(pathNode); + TreeMap> innerIndex = TreeMap.empty(Ord.stringOrd); + List list = List.nil(); + list = list.cons(pathNode.right()); innerIndex = innerIndex.set(value, list); index = index.set(key, innerIndex); } else { - TreeMap>> innerIndex = innerIndexOp.some(); - Option>> opList = innerIndex.get(value); + TreeMap> innerIndex = innerIndexOp.some(); + Option> opList = innerIndex.get(value); if (opList.isNone()) { - List> list = List.nil(); - list = list.cons(pathNode); + List list = List.nil(); + list = list.cons(pathNode.right()); innerIndex = innerIndex.set(value, list); } else { - List> list = opList.some(); - list = list.cons(pathNode); + List list = opList.some(); + list = list.cons(pathNode.right()); innerIndex = innerIndex.set(value, list); } @@ -297,20 +361,38 @@ if (index.get(key).isSome()) { - TreeMap>> innerIndex = this.index.get(key).some(); - List searchValues = innerIndex.keys(); - List> valueList = List.nil(); + TreeMap> innerIndex = this.index.get(key).some(); + Iterator>> searchValueIterator = innerIndex.iterator(); + + return new Iterator>() { + + List pathList = List.nil(); + NodePath targetPath; - for (String searchValue : searchValues) { - Option>> opList = innerIndex.get(searchValue); + @Override + public boolean hasNext() { + if (!pathList.isEmpty()) { + targetPath = pathList.head(); + pathList = pathList.tail(); + return true; + } - if (opList.isNone()) - continue; + if (searchValueIterator.hasNext()) { + pathList = searchValueIterator.next()._2(); + targetPath = pathList.head(); + pathList = pathList.tail(); + return true; + } + return false; + } - List> list = opList.some(); - valueList = valueList.append(list); - } - return valueList.iterator(); + @Override + public Pair next() { + TreeNode targetNode = getTarget(node, targetPath); + Pair targetPair = new Pair(targetNode, targetPath); + return targetPair; + } + }; } else { Pair pair = new Pair(node, new DefaultNodePath()); @@ -324,32 +406,32 @@ for (; itNode.hasNext();) { Pair pathNode = itNode.next(); String value = pathNode.left().getAttributes().getString(key); - Option>>> innerIndexOp = index.get(key); + Option>> innerIndexOp = index.get(key); if (value != null) { if (innerIndexOp.isNone()) { - TreeMap>> innerIndex = TreeMap.empty(Ord.stringOrd); - List> list = List.nil(); - list = list.cons(pathNode); + TreeMap> innerIndex = TreeMap.empty(Ord.stringOrd); + List list = List.nil(); + list = list.cons(pathNode.right()); innerIndex = innerIndex.set(value, list); index = index.set(key, innerIndex); } else { - TreeMap>> innerIndex = innerIndexOp.some(); - Option>> opList = innerIndex.get(value); + TreeMap> innerIndex = innerIndexOp.some(); + Option> opList = innerIndex.get(value); if (opList.isNone()) { - List> list = List.nil(); - list = list.cons(pathNode); + List list = List.nil(); + list = list.cons(pathNode.right()); innerIndex = innerIndex.set(value, list); } else { - List> list = opList.some(); - list = list.cons(pathNode); + List list = opList.some(); + list = list.cons(pathNode.right()); innerIndex = innerIndex.set(value, list); } @@ -387,4 +469,22 @@ }; } } + + public TreeNode getTarget(TreeNode node, NodePath path) { + Pair removeHeadPath = path.pop(); + + if (removeHeadPath.left() == -1) + return getTarget(node, removeHeadPath.right()); + + Either either = node.getChildren().at(removeHeadPath.left()); + if (either.isA()) + return node; + + TreeNode child = either.b(); + if (removeHeadPath.right().size() == 0) + return child; + + TreeNode target = getTarget(child, removeHeadPath.right()); + return target; + } } diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/AddNewChildrenIndexEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/AddNewChildrenIndexEditor.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/AddNewChildrenIndexEditor.java Sat Nov 15 17:48:07 2014 +0900 @@ -1,14 +1,9 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; -import java.util.Iterator; -import fj.F; import fj.Ord; -import fj.P2; 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.DefaultNodePath; @@ -35,28 +30,28 @@ TransactionManager txManager, TreeEditor editor, TreeOperationLog log, - TreeMap>>> index) { + TreeMap>> index) { - TreeMap>>> newIndex = editIndex(index); + TreeMap>> newIndex = editIndex(index); IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root, txManager, editor, newIndex); return DefaultEither.newB(newEditor); } - public TreeMap>>> editIndex( - TreeMap>>> index) { + public TreeMap>> editIndex( + TreeMap>> index) { if (!index.isEmpty()) { List keyList = index.keys(); - TreeMap>>> newIndex = TreeMap.empty(Ord.stringOrd); - TreeMap>> newInnerIndex = TreeMap.empty(Ord.stringOrd); + TreeMap>> newIndex = TreeMap.empty(Ord.stringOrd); + TreeMap> newInnerIndex = TreeMap.empty(Ord.stringOrd); for (String indexKey : keyList) { - TreeMap>> innerIndex = index.get(indexKey).some(); + TreeMap> innerIndex = index.get(indexKey).some(); List innerIndexKeyList = innerIndex.keys(); for (String innerIndexKey : innerIndexKeyList) { - List> pairList = innerIndex.get(innerIndexKey).some(); - List> list = checkPath(pairList); + 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); @@ -70,18 +65,18 @@ } } - public List> checkPath(List> pairList){ + public List checkPath(List pairList){ - List> list = List.nil(); - for (Pair pair : pairList) { + List list = List.nil(); + for (NodePath path : pairList) { - NodePath path = pair.right(); + //System.out.println("oldPath = " + path.toString()); NodePath newPath = new DefaultNodePath(); if (editNodePath.size() > path.size()) { - list = list.cons(pair); + list = list.cons(path); continue; } @@ -113,8 +108,7 @@ } //System.out.println("newPath = " + newPath.toString()); - Pair newPair = new Pair(pair.left(), newPath); - list = list.cons(newPair); + list = list.cons(path); } return list; diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DefaultIndexEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DefaultIndexEditor.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DefaultIndexEditor.java Sat Nov 15 17:48:07 2014 +0900 @@ -2,7 +2,6 @@ import fj.data.List; 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; @@ -12,12 +11,11 @@ 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 DefaultIndexEditor implements IndexEditor { @Override - public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>>> index) { + public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>> index) { IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, index); Either either = DefaultEither.newB(newEditor); return either; diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteChildIndexEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteChildIndexEditor.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteChildIndexEditor.java Sat Nov 15 17:48:07 2014 +0900 @@ -35,30 +35,29 @@ TransactionManager txManager, TreeEditor editor, TreeOperationLog log, - TreeMap>>> index) { + TreeMap>> index) { - TreeMap>>> newIndex = editIndex(index); + TreeMap>> newIndex = editIndex(index); IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root, txManager, editor, newIndex); return DefaultEither.newB(newEditor); } - public TreeMap>>> editIndex( - TreeMap>>> index) { + public TreeMap>> editIndex( + TreeMap>> index) { if (!index.isEmpty()) { List keyList = index.keys(); - TreeMap>>> newIndex = TreeMap.empty(Ord.stringOrd); - TreeMap>> newInnerIndex = TreeMap.empty(Ord.stringOrd); + TreeMap>> newIndex = TreeMap.empty(Ord.stringOrd); + TreeMap> newInnerIndex = TreeMap.empty(Ord.stringOrd); for (String indexKey : keyList) { - TreeMap>> innerIndex = index.get(indexKey).some(); + TreeMap> innerIndex = index.get(indexKey).some(); List innerIndexKeyList = innerIndex.keys(); for (String innerIndexKey : innerIndexKeyList) { - List> pairList = innerIndex.get(innerIndexKey).some(); - List> list = checkPath(pairList); + 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); } } @@ -70,12 +69,11 @@ } } - public List> checkPath(List> pairList){ + public List checkPath(List pairList){ - List> list = List.nil(); - for (Pair pair : pairList) { + List list = List.nil(); + for (NodePath path : pairList) { - NodePath path = pair.right(); System.out.println("oldPath = " + path.toString()); NodePath newPath = new DefaultNodePath(); @@ -84,7 +82,7 @@ } if (editNodePath.size() > path.size()) { - list = list.cons(pair); + list = list.cons(path); continue; } @@ -115,9 +113,7 @@ } System.out.println("newPath = " + newPath.toString()); - Pair newPair = new Pair( - pair.left(), newPath); - list = list.cons(newPair); + list = list.cons(path); } return list; diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteIndexEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteIndexEditor.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteIndexEditor.java Sat Nov 15 17:48:07 2014 +0900 @@ -32,48 +32,48 @@ } @Override - public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>>> index) { + public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>> index) { NodePath newPath = path.pop().right(); TreeNode target = getTarget(node, newPath); String attribute = target.getAttributes().getString(key); - TreeMap>>> newIndex = editIndex(attribute, index); + TreeMap>> newIndex = editIndex(attribute, index); IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex); Either either = DefaultEither.newB(newEditor); return either; } - public TreeMap>>> editIndex(String attribute, TreeMap>>> index){ + public TreeMap>> editIndex(String attribute, TreeMap>> index){ - Option>>> innerIndexOp = index.get(key); + Option>> innerIndexOp = index.get(key); if (innerIndexOp.isSome()) { - TreeMap>> innerIndex = innerIndexOp.some(); - Option>> listOp = innerIndex.get(attribute); + TreeMap> innerIndex = innerIndexOp.some(); + Option> listOp = innerIndex.get(attribute); if (listOp.isSome()) { - List> list = listOp.some(); - List> newList = List.nil(); + List list = listOp.some(); + List newList = List.nil(); - for (Pair pathNode : list){ - if (!pathNode.right().toString().equalsIgnoreCase(pathString)) { - newList = newList.cons(pathNode); + for (NodePath path : list){ + if (!path.toString().equals(pathString)) { + newList = newList.cons(path); } } if (newList.isEmpty()) { - TreeMap>> newInnerIndex = innerIndex.delete(attribute); + TreeMap> newInnerIndex = innerIndex.delete(attribute); if (newInnerIndex.isEmpty()) { - TreeMap>>> newIndex = index.delete(key); + TreeMap>> newIndex = index.delete(key); return newIndex; } - TreeMap>>> newIndex = index.set(key, newInnerIndex); + TreeMap>> newIndex = index.set(key, newInnerIndex); return newIndex; } - TreeMap>> newInnerIndex = innerIndex.set(attribute,newList); - TreeMap>>> newIndex = index.set(key, newInnerIndex); + TreeMap> newInnerIndex = innerIndex.set(attribute,newList); + TreeMap>> newIndex = index.set(key, newInnerIndex); return newIndex; } else { diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexEditor.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexEditor.java Sat Nov 15 17:48:07 2014 +0900 @@ -2,7 +2,6 @@ import fj.data.List; 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; @@ -11,8 +10,7 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; 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 interface IndexEditor { - Either edit(TreeNode root,TransactionManager txManager, TreeEditor editor,TreeOperationLog log,TreeMap>>> index); + Either edit(TreeNode root,TransactionManager txManager, TreeEditor editor,TreeOperationLog log,TreeMap>> index); } diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexManager.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexManager.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexManager.java Sat Nov 15 17:48:07 2014 +0900 @@ -11,7 +11,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; public class IndexManager { @@ -21,7 +20,7 @@ this.reservation = reservation; } - public void commit(TreeMap>>> index){ + public void commit(TreeMap>> index){ TreeContext tc = reservation.get(); ChangeSet cs = tc.getChangeSet(); TreeNode root = cs.getRoot(); diff -r ef183969bf31 -r afbe19c98f53 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java Sat Nov 15 17:48:07 2014 +0900 @@ -15,7 +15,6 @@ 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; import java.nio.ByteBuffer; @@ -36,67 +35,64 @@ } @Override - public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>>> index) { - NodePath newPath = path.pop().right(); - TreeNode target = getTarget(root, newPath); - TreeMap>>> newIndex = editIndex(target, path, key, attribute,index); + 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(TreeNode target, NodePath path, String key, String attribute,TreeMap>>> index){ + public TreeMap>> editIndex(NodePath path, String key, String attribute,TreeMap>> index){ - Option>>> innerIndexOp = index.get(key); - Pair pathNode = new Pair(target,path); + Option>> innerIndexOp = index.get(key); if (attribute != null) { if (innerIndexOp.isNone()) { - TreeMap>> innerIndex = TreeMap.empty(Ord.stringOrd); - List> list = List.nil(); - list = list.cons(pathNode); + 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); + TreeMap>> newIndex = index.set(key, innerIndex); return newIndex; } else { - TreeMap>> innerIndex = innerIndexOp.some(); + TreeMap> innerIndex = innerIndexOp.some(); - Option>> opList = innerIndex.get(attribute); + Option> opList = innerIndex.get(attribute); if (opList.isNone()) { - List> list = List.nil(); - list = list.cons(pathNode); + List list = List.nil(); + list = list.cons(path); innerIndex = innerIndex.set(attribute, list); } else { - List> list = opList.some(); - list = list.cons(pathNode); + List list = opList.some(); + list = list.cons(path); innerIndex = innerIndex.set(attribute, list); } - TreeMap>>> newIndex = index.set(key, innerIndex); + TreeMap>> newIndex = index.set(key, innerIndex); return newIndex; } } 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; - } +// 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 ef183969bf31 -r afbe19c98f53 src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java Sat Nov 15 17:48:07 2014 +0900 @@ -28,18 +28,37 @@ for (int num = 0; num < 10; num++) { JungleTreeEditor addChildEditor = editor.addNewChildAt(path, num).b(); - JungleTreeEditor putAttributeEditor = addChildEditor.putAttribute(path.add(num), "test", ByteBuffer.wrap("tatsuki".getBytes())).b(); + JungleTreeEditor putAttributeEditor = addChildEditor.putAttribute(path.add(num), "test", + ByteBuffer.wrap("tatsuki".getBytes())).b(); Either successEither = putAttributeEditor.success(); Assert.assertFalse(successEither.isA()); editor = successEither.b(); } - System.out.println(tree.revision()); - TreeNode root = tree.getRootNode(); - Assert.assertTrue(root.getChildren().at(9).isB()); + + JungleTreeEditor newEditor = tree.getTreeEditor(); + JungleTreeEditor newPutEditor = newEditor.putAttribute(path.add(9), "test", ByteBuffer.wrap("kanagawa".getBytes())).b(); + newPutEditor.success(); - JungleTree oldTree = tree.getOldTree(9).b(); - System.out.println(oldTree.revision()); - TreeNode oldRoot = oldTree.getRootNode(); - Assert.assertTrue(oldRoot.getChildren().at(9).isA()); + TreeNode root = tree.getRootNode(); + Either childNodeEither = root.getChildren().at(9); + Assert.assertTrue(childNodeEither.isB()); + TreeNode child = childNodeEither.b(); + Assert.assertEquals(child.getAttributes().getString("test"),"kanagawa"); + long t1 = System.currentTimeMillis(); + JungleTree oldTree1 = tree.getOldTree(10).b(); + long t2 = System.currentTimeMillis(); + System.out.println("time = " + (t2 - t1)); + TreeNode oldRoot1 = oldTree1.getRootNode(); + Either oldChildNodeEither = oldRoot1.getChildren().at(9); + Assert.assertTrue(oldChildNodeEither.isB()); + TreeNode oldChildNode = oldChildNodeEither.b(); + Assert.assertEquals(oldChildNode.getAttributes().getString("test"),"tatsuki"); + + + JungleTree oldTree2 = tree.getOldTree(9).b(); + TreeNode oldRoot2 = oldTree2.getRootNode(); + Assert.assertTrue(oldRoot2.getChildren().at(9).isA()); + + } } diff -r ef183969bf31 -r afbe19c98f53 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 15 17:48:07 2014 +0900 @@ -0,0 +1,17 @@ +package jp.ac.u_ryukyu.ie.cr.tatsuki.functionaljava; + +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 ef183969bf31 -r afbe19c98f53 src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/AddChildrenIndexTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/AddChildrenIndexTest.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/AddChildrenIndexTest.java Sat Nov 15 17:48:07 2014 +0900 @@ -29,7 +29,7 @@ public class AddChildrenIndexTest { @Test - public void DeleteChildrenTest(){ + public void AddChildrenTest(){ Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTreeEditor(new DefaultTraverser())); jungle.createNewTree("tree"); JungleTree tree = jungle.getTreeByName("tree"); @@ -58,8 +58,10 @@ either.b().success(); InterfaceTraverser newIfTraverser = tree.getTraverser(); - TreeMap>>> newIndex = newIfTraverser.getIndex(); - Assert.assertEquals(newIndex.get(key).some().get("<-1,0,1>").some().head().right().toString(),"<-1,0,2>"); + TreeMap>> newIndex = newIfTraverser.getIndex(); + NodePath targetPath = newIndex.get(key).some().get("<-1,0,2>").some().head(); + TreeNode targetNode = getTarget(tree.getRootNode(), targetPath); + Assert.assertEquals(targetNode.getAttributes().getString(key) ,"<-1,0,1>"); } public static String key = "KEY"; @@ -101,4 +103,21 @@ editor = either.b(); either = editor.success(); } + public TreeNode getTarget(TreeNode node, NodePath path) { + Pair removeHeadPath = path.pop(); + + if (removeHeadPath.left() == -1) + return getTarget(node, removeHeadPath.right()); + + Either either = node.getChildren().at(removeHeadPath.left()); + if (either.isA()) + return node; + + TreeNode child = either.b(); + if (removeHeadPath.right().size() == 0) + return child; + + TreeNode target = getTarget(child, removeHeadPath.right()); + return target; + } } diff -r ef183969bf31 -r afbe19c98f53 src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/AttributeIndexTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/AttributeIndexTest.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/AttributeIndexTest.java Sat Nov 15 17:48:07 2014 +0900 @@ -27,7 +27,7 @@ DefaultJungle jungle = new DefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser())); JungleTree tree = jungle.createNewTree("fuga"); IndexJungleTreeEditor editor = tree.getIndexTreeEditor(); - TreeMap>>> emptyIndex = editor.getIndex(); + TreeMap>> emptyIndex = editor.getIndex(); Assert.assertTrue(emptyIndex.isEmpty()); NodePath path = new DefaultNodePath(); Either either = editor.addNewChildAt(path, 0); @@ -40,9 +40,11 @@ editor3.success(); IndexJungleTreeEditor IndexEditor = tree.getIndexTreeEditor(); - TreeMap>>> index = IndexEditor.getIndex(); + TreeMap>> index = IndexEditor.getIndex(); - Assert.assertEquals(index.get("key").some().get("test").some().head().left().getAttributes().getString("key"),"test"); + NodePath targetPath = index.get("key").some().get("test").some().head(); + TreeNode targetNode = getTarget(tree.getRootNode(), targetPath); + Assert.assertEquals(targetNode.getAttributes().getString("key"),"test"); JungleTreeEditor editor4 = tree.getIndexTreeEditor(); Either either3 = editor4.deleteAttribute(path.add(0), "key"); @@ -51,7 +53,26 @@ editor5.success(); IndexJungleTreeEditor IndexEditor2 = tree.getIndexTreeEditor(); - TreeMap>>> deleteIndex = IndexEditor2.getIndex(); + TreeMap>> deleteIndex = IndexEditor2.getIndex(); Assert.assertTrue(deleteIndex.isEmpty()); } + + + public TreeNode getTarget(TreeNode node, NodePath path) { + Pair removeHeadPath = path.pop(); + + if (removeHeadPath.left() == -1) + return getTarget(node, removeHeadPath.right()); + + Either either = node.getChildren().at(removeHeadPath.left()); + if (either.isA()) + return node; + + TreeNode child = either.b(); + if (removeHeadPath.right().size() == 0) + return child; + + TreeNode target = getTarget(child, removeHeadPath.right()); + return target; + } } diff -r ef183969bf31 -r afbe19c98f53 src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/DeleteChildrenIndexTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/DeleteChildrenIndexTest.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/DeleteChildrenIndexTest.java Sat Nov 15 17:48:07 2014 +0900 @@ -4,10 +4,8 @@ import java.util.Iterator; import org.junit.Test; -import org.junit.experimental.theories.suppliers.TestedOn; import fj.data.List; -import fj.data.Option; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; @@ -28,81 +26,100 @@ public class DeleteChildrenIndexTest { - @Test - public void DeleteChildrenTest(){ - Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTreeEditor(new DefaultTraverser())); - jungle.createNewTree("tree"); - JungleTree tree = jungle.getTreeByName("tree"); - createTree(tree); - tree.getRootNode(); - InterfaceTraverser ifTraverser = tree.getTraverser(); + @Test + public void DeleteChildrenTest() { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + createTree(tree); + tree.getRootNode(); + InterfaceTraverser ifTraverser = tree.getTraverser(); + + Iterator> pairIterator = ifTraverser.find((TreeNode node) -> { + ByteBuffer attribute = node.getAttributes().get(key); + if (attribute != null) { + byte[] byteAttribute = attribute.array(); + String str = new String(byteAttribute); + System.out.println("attribute = " + str); + return str.equals("<-1,0,1>"); + } + return false; + }, key, "<-1,0,1>"); + + for (; pairIterator.hasNext(); pairIterator.next()) { - Iterator> pairIterator = ifTraverser.find((TreeNode node) -> { - ByteBuffer attribute = node.getAttributes().get(key); - if (attribute != null) { - byte[] byteAttribute = attribute.array(); - String str = new String(byteAttribute); - System.out.println("attribute = " + str); - return str.equals("<-1,0,1>"); - } - return false; - }, key, "<-1,0,1>"); + } + // check index + ifTraverser.commitIndex(); + TreeMap>> index = ifTraverser.getIndex(); + Assert.assertTrue(index.get(key).some().get("<-1,0,0>").isSome()); + + IndexJungleTreeEditor editor = tree.getIndexTreeEditor(); + Either either = editor.deleteChildAt(new DefaultNodePath().add(0), 0); + either.b().success(); + + InterfaceTraverser newIfTraverser = tree.getTraverser(); + TreeMap>> newIndex = newIfTraverser.getIndex(); + NodePath targetPath = newIndex.get(key).some().get("<-1,0,1>").some().head(); + TreeNode targetNode = getTarget(tree.getRootNode(), targetPath); + Assert.assertEquals(targetNode.getAttributes().getString(key), "<-1,0,2>"); + + } + + public static String key = "KEY"; + public static DefaultTreeNode factory = new DefaultTreeNode(); + + public void createTree(JungleTree tree) { + NodePath root = new DefaultNodePath(); + createChildren(tree, root, 0); - for (;pairIterator.hasNext();pairIterator.next()) { - - } - //check index - ifTraverser.commitIndex(); - TreeMap>>> index = ifTraverser.getIndex(); - Assert.assertTrue(index.get(key).some().get("<-1,0,0>").isSome()); - - IndexJungleTreeEditor editor = tree.getIndexTreeEditor(); - Either either = editor.deleteChildAt(new DefaultNodePath().add(0), 0); - either.b().success(); - - InterfaceTraverser newIfTraverser = tree.getTraverser(); - TreeMap>>> newIndex = newIfTraverser.getIndex(); - Assert.assertEquals(newIndex.get(key).some().get("<-1,0,1>").some().head().right().toString(),"<-1,0,0>"); - - } - public static String key = "KEY"; - public static DefaultTreeNode factory = new DefaultTreeNode(); + for (int x = 0; x < 3; x++) { + createChildren(tree, root.add(0), x); + for (int y = 0; y < 3; y++) { + createChildren(tree, root.add(0).add(x), y); + } + } - public void createTree(JungleTree tree) { - NodePath root = new DefaultNodePath(); - createChildren(tree, root, 0); + } - for (int x = 0; x < 3; x++) { - createChildren(tree, root.add(0), x); - for (int y = 0; y < 3; y++) { - createChildren(tree, root.add(0).add(x), y); - } - } - - } + public void createChildren(JungleTree tree, NodePath root, int num) { + JungleTreeEditor editor = tree.getTreeEditor();// Treeのeditorを作成 + Either either = editor.addNewChildAt(root, num); // 新しく入れるところへのパス + if (either.isA()) { + Assert.fail(); + } + editor = either.b(); + either = editor.success(); + if (either.isA()) { + Assert.fail(); + } + NodePath childPath = root.add(num); + editor = tree.getTreeEditor(); + NodePath attribute = root.add(num); + System.out.println(attribute.toString()); + either = editor.putAttribute(childPath, key, ByteBuffer.wrap(attribute.toString().getBytes())); + if (either.isA()) { + Assert.fail(); + } + editor = either.b(); + either = editor.success(); + } - public void createChildren(JungleTree tree, NodePath root, int num) { - JungleTreeEditor editor = tree.getTreeEditor();// Treeのeditorを作成 - Either either = editor - .addNewChildAt(root, num); // 新しく入れるところへのパス - if (either.isA()) { - Assert.fail(); - } - editor = either.b(); - either = editor.success(); - if (either.isA()) { - Assert.fail(); - } - NodePath childPath = root.add(num); - editor = tree.getTreeEditor(); - NodePath attribute = root.add(num); - System.out.println(attribute.toString()); - either = editor.putAttribute(childPath, key, - ByteBuffer.wrap(attribute.toString().getBytes())); - if (either.isA()) { - Assert.fail(); - } - editor = either.b(); - either = editor.success(); - } + public TreeNode getTarget(TreeNode node, NodePath path) { + Pair removeHeadPath = path.pop(); + + if (removeHeadPath.left() == -1) + return getTarget(node, removeHeadPath.right()); + + Either either = node.getChildren().at(removeHeadPath.left()); + if (either.isA()) + return node; + + TreeNode child = either.b(); + if (removeHeadPath.right().size() == 0) + return child; + + TreeNode target = getTarget(child, removeHeadPath.right()); + return target; + } } diff -r ef183969bf31 -r afbe19c98f53 src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexCommitTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexCommitTest.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexCommitTest.java Sat Nov 15 17:48:07 2014 +0900 @@ -1,6 +1,6 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.index; -import java.util.Iterator; + import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; @@ -14,7 +14,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; import junit.framework.Assert; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; @@ -51,10 +50,12 @@ }, key, "<-1,0,1>"); //check index - TreeMap>>> index = ifTraverser.getIndex(); - Option>>> opIndex = index.get(key); + TreeMap>> index = ifTraverser.getIndex(); + Option>> opIndex = index.get(key); + Assert.assertTrue(!opIndex.isNone()); - TreeMap>> innerIndex = opIndex.some(); + + TreeMap> innerIndex = opIndex.some(); Assert.assertTrue(!innerIndex.get("<-1,0,0>").isNone()); JungleTreeEditor editor = tree.getTreeEditor(); @@ -65,7 +66,7 @@ ifTraverser.commitIndex(); JungleTree newTree = jungle.getTreeByName("tree"); InterfaceTraverser newIfTraverser = newTree.getTraverser(); - TreeMap>>> newIndex = newIfTraverser.getIndex(); + TreeMap>> newIndex = newIfTraverser.getIndex(); Assert.assertTrue(newIndex.isEmpty()); InterfaceTraverser ifTraverser1= tree.getTraverser(); @@ -84,7 +85,7 @@ ifTraverser1.commitIndex(); JungleTree newTree2 = jungle.getTreeByName("tree"); InterfaceTraverser newIfTraverser2 = newTree2.getTraverser(); - TreeMap>>> newIndex1 = newIfTraverser2.getIndex(); + TreeMap>> newIndex1 = newIfTraverser2.getIndex(); Assert.assertFalse(newIndex1.isEmpty()); } diff -r ef183969bf31 -r afbe19c98f53 src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/query/SearchQueryTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/query/SearchQueryTest.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/query/SearchQueryTest.java Sat Nov 15 17:48:07 2014 +0900 @@ -1,11 +1,9 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.query; import java.nio.ByteBuffer; -import java.security.KeyStore.Entry.Attribute; import java.util.Iterator; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungleTree; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; @@ -19,7 +17,6 @@ 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; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIndexIterator; import org.junit.Assert; import org.junit.Test; @@ -38,7 +35,7 @@ createTree(tree); tree.getRootNode(); InterfaceTraverser ifTraverser = tree.getTraverser(); - TreeMap>>> cheackIndex = ifTraverser.getIndex(); + TreeMap>> cheackIndex = ifTraverser.getIndex(); Assert.assertTrue(cheackIndex.isEmpty()); Iterator> searchNode = ifTraverser.find( @@ -59,10 +56,10 @@ Assert.assertTrue(compare(searchNode.next().left(),"<-1,0,1>")); } - TreeMap>>> index = ifTraverser.getIndex(); - Option>>> opIndex = index.get(key); + TreeMap>> index = ifTraverser.getIndex(); + Option>> opIndex = index.get(key); Assert.assertTrue(!opIndex.isNone()); - TreeMap>> innerIndex = opIndex.some(); + TreeMap> innerIndex = opIndex.some(); Assert.assertTrue(!innerIndex.get("<-1,0,0>").isNone()); }