# HG changeset patch # User tatsuki # Date 1425606290 -32400 # Node ID e26462a38ce0b8785391dc4c0ea7f881c4a1f746 # Parent f26535302c9617e2934e500fea10837dcae0f1eb add push pop diff -r f26535302c96 -r e26462a38ce0 .database.swp Binary file .database.swp has changed diff -r f26535302c96 -r e26462a38ce0 .gradle/1.10/taskArtifacts/cache.properties.lock Binary file .gradle/1.10/taskArtifacts/cache.properties.lock has changed diff -r f26535302c96 -r e26462a38ce0 .gradle/1.10/taskArtifacts/fileHashes.bin Binary file .gradle/1.10/taskArtifacts/fileHashes.bin has changed diff -r f26535302c96 -r e26462a38ce0 .gradle/1.10/taskArtifacts/fileSnapshots.bin Binary file .gradle/1.10/taskArtifacts/fileSnapshots.bin has changed diff -r f26535302c96 -r e26462a38ce0 .gradle/1.10/taskArtifacts/outputFileStates.bin Binary file .gradle/1.10/taskArtifacts/outputFileStates.bin has changed diff -r f26535302c96 -r e26462a38ce0 .gradle/1.10/taskArtifacts/taskArtifacts.bin Binary file .gradle/1.10/taskArtifacts/taskArtifacts.bin has changed diff -r f26535302c96 -r e26462a38ce0 .gradle/1.9/taskArtifacts/cache.properties.lock Binary file .gradle/1.9/taskArtifacts/cache.properties.lock has changed diff -r f26535302c96 -r e26462a38ce0 .gradle/1.9/taskArtifacts/fileHashes.bin Binary file .gradle/1.9/taskArtifacts/fileHashes.bin has changed diff -r f26535302c96 -r e26462a38ce0 .gradle/1.9/taskArtifacts/fileSnapshots.bin Binary file .gradle/1.9/taskArtifacts/fileSnapshots.bin has changed diff -r f26535302c96 -r e26462a38ce0 .gradle/1.9/taskArtifacts/outputFileStates.bin Binary file .gradle/1.9/taskArtifacts/outputFileStates.bin has changed diff -r f26535302c96 -r e26462a38ce0 .gradle/1.9/taskArtifacts/taskArtifacts.bin Binary file .gradle/1.9/taskArtifacts/taskArtifacts.bin has changed diff -r f26535302c96 -r e26462a38ce0 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 Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java Fri Mar 06 10:44:50 2015 +0900 @@ -3,6 +3,7 @@ import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; +import fj.Ord; import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; @@ -20,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.tatsuki.jungle.store.index.Index; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public class DefaultJungle implements Jungle @@ -45,7 +45,7 @@ e1.success(); } - public DefaultJungle(Journal journal,String uuid,TreeEditor editor) + public DefaultJungle(Journal journal,String uuid,TreeEditor editor) { this.journal = new NullJournal(); this.trees = new ConcurrentHashMap(); @@ -80,8 +80,8 @@ }; DefaultTreeNode root = new DefaultTreeNode(); - TreeMap>> indexList = new Index().getIndex(); - TreeMap parentIndex = new ParentIndex().getParentIndex(); + TreeMap>> indexList = TreeMap.empty(Ord.stringOrd); + TreeMap parentIndex = new ParentIndex().getParentIndex(); ChangeSet set = new DefaultChangeSet(root,null,list,uuid,name,0,indexList,parentIndex); DefaultTreeContext tc = new DefaultTreeContext(root,set); JungleTree newTree = new DefaultJungleTree(tc,uuid,journal.getWriter(),editor); diff -r f26535302c96 -r e26462a38ce0 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 Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java Fri Mar 06 10:44:50 2015 +0900 @@ -1,5 +1,6 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; @@ -15,7 +16,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.GetOldTreeError; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; @@ -57,7 +57,7 @@ public InterfaceTraverser getTraverser(boolean useIndex) { AtomicReservableReference.Reservation reservation = repository.getReservation(); IndexManager indexManager = new IndexManager(reservation); - Index index = getIndex(); + TreeMap>> index = getIndex(); ParentIndex parentIndex = getParentIndex(); return new InterfaceTraverser(getRootNode(), index, parentIndex, indexManager, useIndex); } @@ -70,7 +70,7 @@ } @Override - public Index getIndex() { + public TreeMap>> getIndex() { TreeContext tc = repository.get(); ChangeSet cs = tc.getChangeSet(); return cs.getIndex(); diff -r f26535302c96 -r e26462a38ce0 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 Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java Fri Mar 06 10:44:50 2015 +0900 @@ -2,12 +2,12 @@ +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.impl.TreeNode; 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.tatsuki.jungle.store.index.Index; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public interface JungleTree @@ -17,7 +17,7 @@ public TreeNode getRootNode(); public long revision(); public Either getOldTree(long revision); - public Index getIndex(); + public TreeMap>> getIndex(); public ParentIndex getParentIndex(); public InterfaceTraverser getTraverser(boolean useIndex); public Either getNodeOfPath(NodePath path); diff -r f26535302c96 -r e26462a38ce0 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java Fri Mar 06 10:44:50 2015 +0900 @@ -16,4 +16,5 @@ public Either deleteAttribute(NodePath path,String key); public Either edit(NodePath path,NodeEditor editor); public Either success(); + public Either replaceNewRootNode(); } diff -r f26535302c96 -r e26462a38ce0 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 Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/ChangeSet.java Fri Mar 06 10:44:50 2015 +0900 @@ -2,10 +2,10 @@ +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; 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.tatsuki.jungle.store.index.Index; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public interface ChangeSet @@ -17,8 +17,7 @@ public String uuid(); public String getTreeName(); public long revision(); - - public Index getIndex(); + public TreeMap>> getIndex(); public Iterable getOperations(); public ParentIndex getParentIndex(); } diff -r f26535302c96 -r e26462a38ce0 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java Fri Mar 06 10:44:50 2015 +0900 @@ -5,5 +5,6 @@ APPEND_CHILD, DELETE_CHILD, PUT_ATTRIBUTE, - DELETE_ATTRIBUTE; + DELETE_ATTRIBUTE, + REPLACE_ROOT; } \ No newline at end of file diff -r f26535302c96 -r e26462a38ce0 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Fri Mar 06 10:44:50 2015 +0900 @@ -79,4 +79,5 @@ LoggingNode logNode = editor.wrap(newRoot,newWrap.getOperationLog()); return DefaultEither.newB(logNode); } + } \ No newline at end of file diff -r f26535302c96 -r e26462a38ce0 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java Fri Mar 06 10:44:50 2015 +0900 @@ -1,5 +1,8 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + public interface TreeNode{ public TreeNodeChildren getChildren(); @@ -8,4 +11,5 @@ public TreeNode createNewNode(); + public Either appendRootNode(); } diff -r f26535302c96 -r e26462a38ce0 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java Fri Mar 06 10:44:50 2015 +0900 @@ -12,4 +12,5 @@ public Either addNewChildAt(int pos,TreeNode newChild); public Either replaceNode(int pos,TreeNode replacement); public List getChildrenAsRawList(); + public Either addExistTreeNodeToChildren(TreeNode node, int pos); } \ No newline at end of file diff -r f26535302c96 -r e26462a38ce0 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java Fri Mar 06 10:44:50 2015 +0900 @@ -1,10 +1,19 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.ReplaceRootNodeOperation; +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; public class LoggingNode { + + private final TreeNode wrap; + private final OperationLog log; + public LoggingNode(TreeNode _wrap) { this(_wrap,new DefaultOperationLog()); @@ -16,9 +25,6 @@ log = _log; } - private final TreeNode wrap; - private final OperationLog log; - public LoggingAttributes getAttributes() { return new LoggingAttributes(wrap,log); @@ -35,9 +41,26 @@ return log; } - public TreeNode getWrap() - { - return wrap; - } + + public Either replaceNewRootNode() { + NodeOperation replaceRootNode = new ReplaceRootNodeOperation(); + return edit(replaceRootNode); + } + public Either edit(NodeOperation op){ + Either either = op.invoke(wrap); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TreeNode newWrap = either.b(); + OperationLog newLog = log.add(op); + LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog); + return DefaultEither.newB(newLoggingNode); + } + + public TreeNode getWrap() + { + return wrap; + } } diff -r f26535302c96 -r e26462a38ce0 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 Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultChangeSet.java Fri Mar 06 10:44:50 2015 +0900 @@ -5,7 +5,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; 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.tatsuki.jungle.store.index.Index; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public class DefaultChangeSet implements ChangeSet @@ -76,8 +75,8 @@ } @Override - public Index getIndex() { - return new Index(indexList); + public TreeMap>> getIndex() { + return indexList; } diff -r f26535302c96 -r e26462a38ce0 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 Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java Fri Mar 06 10:44:50 2015 +0900 @@ -2,10 +2,10 @@ import java.nio.ByteBuffer; - 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; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; @@ -15,6 +15,7 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.AppendChildAt; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.replaceRootNodeAt; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; @@ -73,6 +74,13 @@ return DefaultEither.newB(newEditor); } + @Override + public Either replaceNewRootNode() + { + replaceRootNodeAt appendChildAt = new replaceRootNodeAt(); + return _edit(new DefaultNodePath(),appendChildAt); + } + @Override public Either addNewChildAt(NodePath _path, int _pos) { diff -r f26535302c96 -r e26462a38ce0 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 Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java Fri Mar 06 10:44:50 2015 +0900 @@ -3,6 +3,7 @@ import java.util.Iterator; +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result; @@ -16,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.tatsuki.jungle.store.index.Index; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; @@ -62,10 +62,9 @@ IndexManager indexManager = new IndexManager(repository.getReservation()); InterfaceTraverser traverser = new InterfaceTraverser(_newRoot, indexManager, true); traverser.createIndex(); - Index index = traverser.getIndex(); + TreeMap>> index = traverser.getIndex(); ParentIndex parentIndex = traverser.getParentIndex(); - DefaultChangeSet newCs = new DefaultChangeSet(_newRoot, cs, list, uuid, _treeName, nextRevision, index.getIndex(), - parentIndex.getParentIndex()); + DefaultChangeSet newCs = new DefaultChangeSet(_newRoot, cs, list, uuid, _treeName, nextRevision, index, parentIndex.getParentIndex()); DefaultTreeContext newContext = new DefaultTreeContext(_newRoot, newCs); @SuppressWarnings("rawtypes") diff -r f26535302c96 -r e26462a38ce0 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java Fri Mar 06 10:44:50 2015 +0900 @@ -6,6 +6,9 @@ import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; public class DefaultTreeNode implements TreeNode { @@ -49,5 +52,12 @@ return new DefaultTreeNode(children,attrs); } + @Override + public Either appendRootNode() { + TreeNodeChildren newRootChildren = new DefaultTreeNodeChildren(NIL_LIST, NIL_MAP); + Either either = newRootChildren.addExistTreeNodeToChildren(this, 0); + return either; + } + } diff -r f26535302c96 -r e26462a38ce0 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 Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java Fri Mar 06 10:44:50 2015 +0900 @@ -130,4 +130,18 @@ return DefaultEither.newB(newNode); } + + @Override + public Either addExistTreeNodeToChildren(TreeNode node, int pos) { + + if(!boundaryCheck(pos) || pos < 0){ + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + P2,List> split = children.splitAt(pos); + List newChildren = split._1().snoc(node).append(split._2()); + TreeNode newNode = new DefaultTreeNode(newChildren,attrs); + return DefaultEither.newB(newNode); + } + } diff -r f26535302c96 -r e26462a38ce0 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java Fri Mar 06 10:44:50 2015 +0900 @@ -21,10 +21,12 @@ List list = List.nil(); return list.cons(_root).iterator(); } + @Override public int size(){ return 1; } + @Override public Either at(int _pos){ if(_pos != 0){ @@ -38,6 +40,7 @@ Children chs = wrapper; Either>> ret = _traverse(chs,_evaluator,-1); + if(ret.isA()){ return DefaultEither.newA(ret.a()); } diff -r f26535302c96 -r e26462a38ce0 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 Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java Fri Mar 06 10:44:50 2015 +0900 @@ -1,12 +1,15 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; +import java.util.Iterator; -import java.util.Iterator; -import fj.data.List; +import fj.Ord; +import fj.P2; +import fj.data.Option; +import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIterator; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.Query; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexCreater; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; @@ -14,18 +17,18 @@ public class InterfaceTraverser { TreeNode node; - Index index; + TreeMap>> index; ParentIndex parentIndex; boolean parentUpdateFlag; IndexManager indexManager; boolean useIndex; public InterfaceTraverser(TreeNode root, IndexManager indexManager, boolean indexFlag) { - this(root, new Index(), new ParentIndex(), indexManager, indexFlag); + this(root, TreeMap.empty(Ord.stringOrd), new ParentIndex(), indexManager, indexFlag); } - public InterfaceTraverser(TreeNode root, Index index, ParentIndex parentIndex, IndexManager indexManager, - boolean useIndex) { + public InterfaceTraverser(TreeNode root, TreeMap>> index, + ParentIndex parentIndex, IndexManager indexManager, boolean useIndex) { this.node = root; this.index = index; this.indexManager = indexManager; @@ -37,7 +40,7 @@ this.useIndex = useIndex; } - public Index getIndex() { + public TreeMap>> getIndex() { return index; } @@ -50,16 +53,15 @@ return parentIndex; } - public void setIndex(Index index) { + public void setIndex(TreeMap>> index) { this.index = index; } public void createIndex() { - - long t1 = System.currentTimeMillis(); + // long t1 = System.currentTimeMillis(); IndexCreater creater = new IndexCreater(node); - long t2 = System.currentTimeMillis(); - System.out.println("createIndex time = " + (t2 - t1)); + // long t2 = System.currentTimeMillis(); + // System.out.println("createIndex time = " + (t2 - t1)); index = creater.getIndex(); parentIndex = creater.getParentIndex(); } @@ -73,67 +75,68 @@ * @param searchValue * @return */ - public Iterator findInSubTree(final Query query, TreeNode subTree, String key, String searchValue) { - /* - * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 - * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す - */ - Iterator nodeIterator = index.get(key, searchValue); - if (nodeIterator.hasNext() && useIndex) { - - // ここでNode以下にあるか調べる - List filteredList = List.nil(); - - for (;nodeIterator.hasNext();) { - TreeNode targetNode = nodeIterator.next(); - TreeNode parent = targetNode; - while (parent != null) { - parent = parentIndex.get(parent); - if (parent.equals(subTree)) - filteredList = filteredList.cons(targetNode); - } - } - - return filteredList.iterator(); - - } else { - final PathNodeIterator itNode = new PathNodeIterator(subTree); - return new Iterator() { - - private TreeNode matchNode = nextmatch(itNode); - - private TreeNode nextmatch(PathNodeIterator itNode) { - - for (; itNode.hasNext();) { - TreeNode targetNode = itNode.next(); - if (query.condition(targetNode)) - return targetNode; - } - return null; - } - - @Override - public boolean hasNext() { - if (matchNode == null) { - return false; - } - return true; - } - - @Override - public TreeNode next() { - TreeNode currentNode = matchNode; - matchNode = nextmatch(itNode); - return currentNode; - } - - @Override - public void remove() { - } - - }; - } - } + // public Iterator findInSubTree(final Query query, TreeNode + // subTree, String key, String searchValue) { + // /* + // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 + // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す + // */ + // Iterator nodeIterator = index.get(key, searchValue); + // if (nodeIterator.hasNext() && useIndex) { + // + // // ここでNode以下にあるか調べる + // List filteredList = List.nil(); + // + // for (;nodeIterator.hasNext();) { + // TreeNode targetNode = nodeIterator.next(); + // TreeNode parent = targetNode; + // while (parent != null) { + // parent = parentIndex.get(parent); + // if (parent.equals(subTree)) + // filteredList = filteredList.cons(targetNode); + // } + // } + // + // return filteredList.iterator(); + // + // } else { + // final PathNodeIterator itNode = new PathNodeIterator(subTree); + // return new Iterator() { + // + // private TreeNode matchNode = nextmatch(itNode); + // + // private TreeNode nextmatch(PathNodeIterator itNode) { + // + // for (; itNode.hasNext();) { + // TreeNode targetNode = itNode.next(); + // if (query.condition(targetNode)) + // return targetNode; + // } + // return null; + // } + // + // @Override + // public boolean hasNext() { + // if (matchNode == null) { + // return false; + // } + // return true; + // } + // + // @Override + // public TreeNode next() { + // TreeNode currentNode = matchNode; + // matchNode = nextmatch(itNode); + // return currentNode; + // } + // + // @Override + // public void remove() { + // } + // + // }; + // } + // } /** * subTree以下のNodeに対してKeyに対応する値をindexを使って探索する @@ -144,70 +147,71 @@ * @param searchValue * @return */ - public Iterator findInSubTreeAllValue(final Query query, TreeNode subTree, String key) { - /* - * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得 - * そのKeyを保有するNodeとNodeのPathを取得する - * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 - * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す - */ - Iterator NodeIterator = index.getAll(key); - if (NodeIterator != null && useIndex) { - List filteredList = List.nil(); - for (; NodeIterator.hasNext();) { - TreeNode targetNode = NodeIterator.next(); - TreeNode parent = targetNode; - while (parent != null) { - parent = parentIndex.get(parent); - if (parent.equals(subTree)) - filteredList = filteredList.cons(targetNode); - } - } - return filteredList.iterator(); - - } else { - - final PathNodeIterator itNode = new PathNodeIterator(subTree); - return new Iterator() { - - private TreeNode matchPair = nextmatch(itNode); - - private TreeNode nextmatch(PathNodeIterator itNode) { - - for (; itNode.hasNext();) { - TreeNode targetNode = itNode.next(); - if (query.condition(targetNode)) - return targetNode; - } - return null; - } - - @Override - public boolean hasNext() { - if (matchPair == null) { - return false; - } - return true; - } - - @Override - public TreeNode next() { - TreeNode currentNode = matchPair; - matchPair = nextmatch(itNode); - return currentNode; - } - - @Override - public void remove() { - } - - }; - } - } + // public Iterator findInSubTreeAllValue(final Query query, TreeNode + // subTree, String key) { + // /* + // * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得 + // * そのKeyを保有するNodeとNodeのPathを取得する + // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 + // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す + // */ + // Iterator NodeIterator = index.getAll(key); + // if (NodeIterator != null && useIndex) { + // List filteredList = List.nil(); + // for (; NodeIterator.hasNext();) { + // TreeNode targetNode = NodeIterator.next(); + // TreeNode parent = targetNode; + // while (parent != null) { + // parent = parentIndex.get(parent); + // if (parent.equals(subTree)) + // filteredList = filteredList.cons(targetNode); + // } + // } + // return filteredList.iterator(); + // + // } else { + // + // final PathNodeIterator itNode = new PathNodeIterator(subTree); + // return new Iterator() { + // + // private TreeNode matchPair = nextmatch(itNode); + // + // private TreeNode nextmatch(PathNodeIterator itNode) { + // + // for (; itNode.hasNext();) { + // TreeNode targetNode = itNode.next(); + // if (query.condition(targetNode)) + // return targetNode; + // } + // return null; + // } + // + // @Override + // public boolean hasNext() { + // if (matchPair == null) { + // return false; + // } + // return true; + // } + // + // @Override + // public TreeNode next() { + // TreeNode currentNode = matchPair; + // matchPair = nextmatch(itNode); + // return currentNode; + // } + // + // @Override + // public void remove() { + // } + // + // }; + // } + // } public Iterator find(final Query query, final String key, String searchValue) { - Iterator nodeIterator = index.get(key, searchValue); + Iterator nodeIterator = get(key, searchValue); if (nodeIterator.hasNext() && useIndex) { return nodeIterator; } else { @@ -224,10 +228,12 @@ String value = targetNode.getAttributes().getString(key); if (useIndex) { if (value != null) - index = index.set(key, value, targetNode); + ; + // index = index.set(key, value, targetNode); } - if (parentUpdateFlag); - // parentIndex = parentIndex.set(targetNode); + if (parentUpdateFlag) + ; + // parentIndex = parentIndex.set(targetNode); if (query.condition(targetNode)) return targetNode; } @@ -259,59 +265,87 @@ } } - public Iterator findAll(final Query query, final String key) { - - Iterator nodeList = index.getAll(key); - if (nodeList != null && useIndex) { - - return nodeList; - - } else { - - final PathNodeIterator itNode = new PathNodeIterator(node); - return new Iterator() { - - private TreeNode matchNode = nextmatch(itNode); - - private TreeNode nextmatch(PathNodeIterator itNode) { + // public Iterator findAll(final Query query, final String key) { + // + // Iterator nodeList = index.getAll(key); + // if (nodeList != null && useIndex) { + // + // return nodeList; + // + // } else { + // + // final PathNodeIterator itNode = new PathNodeIterator(node); + // return new Iterator() { + // + // private TreeNode matchNode = nextmatch(itNode); + // + // private TreeNode nextmatch(PathNodeIterator itNode) { + // + // for (; itNode.hasNext();) { + // TreeNode targetNode = itNode.next(); + // String value = targetNode.getAttributes().getString(key); + // if (useIndex) { + // if (value != null) + // index = index.set(key, value, targetNode); + // } + // if (parentUpdateFlag); + // // parentIndex = parentIndex.set(targetNode); + // if (query.condition(targetNode)) + // return targetNode; + // } + // if (useIndex || parentUpdateFlag) + // commit(); + // return null; + // } + // + // @Override + // public boolean hasNext() { + // if (matchNode == null) { + // return false; + // } + // return true; + // } + // + // @Override + // public TreeNode next() { + // TreeNode currentPair = matchNode; + // matchNode = nextmatch(itNode); + // return currentPair; + // } + // + // @Override + // public void remove() { + // } + // + // }; + // } + // } + + public Iterator get(String key, String value) { - for (; itNode.hasNext();) { - TreeNode targetNode = itNode.next(); - String value = targetNode.getAttributes().getString(key); - if (useIndex) { - if (value != null) - index = index.set(key, value, targetNode); - } - if (parentUpdateFlag); - // parentIndex = parentIndex.set(targetNode); - if (query.condition(targetNode)) - return targetNode; - } - if (useIndex || parentUpdateFlag) - commit(); - return null; - } + Option>> indexOp = index.get(key); + if (indexOp.isNone()) + return new NulIterator(); + + TreeMap> index = indexOp.some(); + Option> nodeMapOp = index.get(value); + + if (nodeMapOp.isNone()) + return new NulIterator(); - @Override - public boolean hasNext() { - if (matchNode == null) { - return false; - } - return true; - } + Iterator> mapIterator = nodeMapOp.some().iterator(); + return new Iterator() { - @Override - public TreeNode next() { - TreeNode currentPair = matchNode; - matchNode = nextmatch(itNode); - return currentPair; - } + @Override + public boolean hasNext() { + return mapIterator.hasNext(); + } - @Override - public void remove() { - } + @Override + public TreeNode next() { + return mapIterator.next()._1(); + } - }; - } + }; } } diff -r f26535302c96 -r e26462a38ce0 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/Index.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/Index.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/Index.java Fri Mar 06 10:44:50 2015 +0900 @@ -1,155 +1,155 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; - -import java.util.Iterator; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.TreeMapOrd; -import fj.Ord; -import fj.P2; -import fj.data.Option; -import fj.data.TreeMap; - -public class Index { - - TreeMap>> indexList; - - public Index() { - indexList = TreeMap.empty(Ord.stringOrd); - } - - public Index(TreeMap>> indexList) { - this.indexList = indexList; - } - - public Index set(String key, String value, TreeNode node) { - - Option>> indexOp = indexList.get(key); - if (indexOp.isNone()) { - TreeMap> index = TreeMap.empty(Ord.stringOrd); - TreeMap nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd); - nodeMap = nodeMap.set(node, node); - TreeMap> newIndex = index.set(value, nodeMap); - indexList = indexList.set(key, newIndex); - return this; - } - - TreeMap> index = indexOp.some(); - Option> nodeMapOp = index.get(value); - - TreeMap newNodeMap; - if (nodeMapOp.isSome()) { - TreeMap nodeMap = nodeMapOp.some(); - newNodeMap = nodeMap.set(node, node); - } else { - TreeMap nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd); - newNodeMap = nodeMap.set(node, node); - } - TreeMap> newIndex = index.set(value, newNodeMap); - indexList = indexList.set(key, newIndex); - - return this; - } - - // public Index delete(String key, String value, TreeNode node) { - // Option>> indexOp = indexList.get(key); - // if (indexOp.isNone()) - // return this; - // - // TreeMap> index = indexOp.some(); - // TreeMap> newIndex = index; - // Option> nodeListOp = index.get(value); - // if (nodeListOp.isSome()) { - // List nodeList = nodeListOp.some(); - // List newNodeList = List.nil(); - // for (TreeNode indexingNode : nodeList) { - // if (indexingNode.equals(node)) - // newNodeList = newNodeList.cons(indexingNode); - // } - // - // newIndex = index.set(value, newNodeList); - // } else { - // return this; - // } - // TreeMap>> newIndexList = - // indexList.set(key, newIndex); - // return new Index(newIndexList); - // } - - public Iterator get(String key, String value) { - - Option>> indexOp = indexList.get(key); - if (indexOp.isNone()) - return new NulIterator(); - - TreeMap> index = indexOp.some(); - Option> nodeMapOp = index.get(value); - - if (nodeMapOp.isNone()) - return new NulIterator(); - - Iterator> mapIterator = nodeMapOp.some().iterator(); - return new Iterator() { - - @Override - public boolean hasNext() { - return mapIterator.hasNext(); - } - - @Override - public TreeNode next() { - return mapIterator.next()._1(); - } - - }; - } - - public Iterator getAll(String key) { - - Option>> indexOp = indexList.get(key); - if (indexOp.isNone()) - return null; - - final TreeMap> index = indexOp.some(); - if (!index.isEmpty()) - return new NulIterator(); - - return new Iterator() { - - Iterator>> treeMapIterator = index.iterator(); - Iterator> nodeIterator = new NulIterator>(); - TreeNode node; - - @Override - public boolean hasNext() { - - if (nodeIterator.hasNext()) { - node = nodeIterator.next()._1(); - return true; - } - - for (; treeMapIterator.hasNext();) { - TreeMap nodeMap = treeMapIterator.next()._2(); - nodeIterator = nodeMap.iterator(); - if (nodeIterator.hasNext()) { - node = nodeIterator.next()._1(); - return true; - } - } - return false; - } - - @Override - public TreeNode next() { - return node; - } - - }; - - } - - public TreeMap>> getIndex() { - return indexList; - } - -} +//package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; +// +//import java.util.Iterator; +// +//import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator; +//import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +//import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.TreeMapOrd; +//import fj.Ord; +//import fj.P2; +//import fj.data.Option; +//import fj.data.TreeMap; +// +//public class Index { +// +// TreeMap>> indexList; +// +// public Index() { +// indexList = TreeMap.empty(Ord.stringOrd); +// } +// +// public Index(TreeMap>> indexList) { +// this.indexList = indexList; +// } +// +// public Index set(String key, String value, TreeNode node) { +// +// Option>> indexOp = indexList.get(key); +// if (indexOp.isNone()) { +// TreeMap> index = TreeMap.empty(Ord.stringOrd); +// TreeMap nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd); +// nodeMap = nodeMap.set(node, node); +// TreeMap> newIndex = index.set(value, nodeMap); +// indexList = indexList.set(key, newIndex); +// return this; +// } +// +// TreeMap> index = indexOp.some(); +// Option> nodeMapOp = index.get(value); +// +// TreeMap newNodeMap; +// if (nodeMapOp.isSome()) { +// TreeMap nodeMap = nodeMapOp.some(); +// newNodeMap = nodeMap.set(node, node); +// } else { +// TreeMap nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd); +// newNodeMap = nodeMap.set(node, node); +// } +// TreeMap> newIndex = index.set(value, newNodeMap); +// indexList = indexList.set(key, newIndex); +// +// return this; +// } +// +// // public Index delete(String key, String value, TreeNode node) { +// // Option>> indexOp = indexList.get(key); +// // if (indexOp.isNone()) +// // return this; +// // +// // TreeMap> index = indexOp.some(); +// // TreeMap> newIndex = index; +// // Option> nodeListOp = index.get(value); +// // if (nodeListOp.isSome()) { +// // List nodeList = nodeListOp.some(); +// // List newNodeList = List.nil(); +// // for (TreeNode indexingNode : nodeList) { +// // if (indexingNode.equals(node)) +// // newNodeList = newNodeList.cons(indexingNode); +// // } +// // +// // newIndex = index.set(value, newNodeList); +// // } else { +// // return this; +// // } +// // TreeMap>> newIndexList = +// // indexList.set(key, newIndex); +// // return new Index(newIndexList); +// // } +// +// public Iterator get(String key, String value) { +// +// Option>> indexOp = indexList.get(key); +// if (indexOp.isNone()) +// return new NulIterator(); +// +// TreeMap> index = indexOp.some(); +// Option> nodeMapOp = index.get(value); +// +// if (nodeMapOp.isNone()) +// return new NulIterator(); +// +// Iterator> mapIterator = nodeMapOp.some().iterator(); +// return new Iterator() { +// +// @Override +// public boolean hasNext() { +// return mapIterator.hasNext(); +// } +// +// @Override +// public TreeNode next() { +// return mapIterator.next()._1(); +// } +// +// }; +// } +// +// public Iterator getAll(String key) { +// +// Option>> indexOp = indexList.get(key); +// if (indexOp.isNone()) +// return null; +// +// final TreeMap> index = indexOp.some(); +// if (!index.isEmpty()) +// return new NulIterator(); +// +// return new Iterator() { +// +// Iterator>> treeMapIterator = index.iterator(); +// Iterator> nodeIterator = new NulIterator>(); +// TreeNode node; +// +// @Override +// public boolean hasNext() { +// +// if (nodeIterator.hasNext()) { +// node = nodeIterator.next()._1(); +// return true; +// } +// +// for (; treeMapIterator.hasNext();) { +// TreeMap nodeMap = treeMapIterator.next()._2(); +// nodeIterator = nodeMap.iterator(); +// if (nodeIterator.hasNext()) { +// node = nodeIterator.next()._1(); +// return true; +// } +// } +// return false; +// } +// +// @Override +// public TreeNode next() { +// return node; +// } +// +// }; +// +// } +// +// public TreeMap>> getIndex() { +// return indexList; +// } +// +//} diff -r f26535302c96 -r e26462a38ce0 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java Fri Mar 06 10:44:50 2015 +0900 @@ -2,9 +2,13 @@ import java.util.Stack; +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.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.TreeMapOrd; public class IndexCreater { @@ -15,7 +19,7 @@ private Stack nodeStack = new Stack(); private Stack searchStack = new Stack(); ParentIndex parentIndex = new ParentIndex(); - Index index = new Index(); + TreeMap>> indexList = TreeMap.empty(Ord.stringOrd); public IndexCreater(TreeNode rootNode) { this.root = rootNode; @@ -26,7 +30,7 @@ for (String key : keys) { String value = targetNode.getAttributes().getString(key); if (value != null) - index = index.set(key, value, targetNode); + indexList = set(key, value, targetNode); } if (node.getChildren().size() > 0) { nodeStack.push(node); @@ -39,7 +43,7 @@ } else if (node == root) { node = null; // no more node children = null; - return ; + return; } else if (children != null && children.size() > childNumber) { childNumber = searchStack.pop(); TreeNode parent = nodeStack.pop(); @@ -55,7 +59,7 @@ if (node == root) { node = null; // no more node children = null; - return ; + return; } node = nodeStack.pop(); children = node.getChildren(); @@ -72,8 +76,37 @@ } } - public Index getIndex() { - return index; + public TreeMap>> set(String key, String value, TreeNode node) { + + Option>> indexOp = indexList.get(key); + if (indexOp.isNone()) { + TreeMap> index = TreeMap.empty(Ord.stringOrd); + TreeMap nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd); + nodeMap = nodeMap.set(node, node); + TreeMap> newIndex = index.set(value, nodeMap); + indexList = indexList.set(key, newIndex); + return indexList; + } + + TreeMap> index = indexOp.some(); + Option> nodeMapOp = index.get(value); + + TreeMap newNodeMap; + if (nodeMapOp.isSome()) { + TreeMap nodeMap = nodeMapOp.some(); + newNodeMap = nodeMap.set(node, node); + } else { + TreeMap nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd); + newNodeMap = nodeMap.set(node, node); + } + TreeMap> newIndex = index.set(value, newNodeMap); + indexList = indexList.set(key, newIndex); + + return indexList; + } + + public TreeMap>> getIndex() { + return indexList; } public ParentIndex getParentIndex() { diff -r f26535302c96 -r e26462a38ce0 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 Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexManager.java Fri Mar 06 10:44:50 2015 +0900 @@ -2,6 +2,7 @@ +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; @@ -18,7 +19,7 @@ this.reservation = reservation; } - public void commit(Index index, ParentIndex parentIndex){ + public void commit(TreeMap>> index, ParentIndex parentIndex){ TreeContext tc = reservation.get(); ChangeSet cs = tc.getChangeSet(); TreeNode root = cs.getRoot(); @@ -27,8 +28,7 @@ String uuid = cs.uuid(); String treeName = cs.getTreeName(); long revision = cs.revision(); - index.get("KER", "value"); - DefaultChangeSet newCs = new DefaultChangeSet(root, prev, cl, uuid, treeName, revision, index.getIndex(), parentIndex.getParentIndex()); + DefaultChangeSet newCs = new DefaultChangeSet(root, prev, cl, uuid, treeName, revision, index, parentIndex.getParentIndex()); DefaultTreeContext newTs = new DefaultTreeContext(root, newCs); reservation.set(newTs); } diff -r f26535302c96 -r e26462a38ce0 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java Fri Mar 06 10:44:50 2015 +0900 @@ -5,7 +5,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.TreeMapOrd; -import fj.Ord; import fj.data.Option; import fj.data.TreeMap; diff -r f26535302c96 -r e26462a38ce0 src/test/java/DefaultJungleTreeTest.java --- a/src/test/java/DefaultJungleTreeTest.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/test/java/DefaultJungleTreeTest.java Fri Mar 06 10:44:50 2015 +0900 @@ -6,7 +6,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; 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.IndexTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; diff -r f26535302c96 -r e26462a38ce0 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 Mon Feb 16 11:36:45 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java Fri Mar 06 10:44:50 2015 +0900 @@ -11,7 +11,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; 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.IndexTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; diff -r f26535302c96 -r e26462a38ce0 src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java Fri Mar 06 10:44:50 2015 +0900 @@ -10,7 +10,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesTest; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNodeAttribute; import junit.framework.TestCase; import junit.framework.TestSuite; diff -r f26535302c96 -r e26462a38ce0 src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexFormTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexFormTest.java Mon Feb 16 11:36:45 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexFormTest.java Fri Mar 06 10:44:50 2015 +0900 @@ -5,7 +5,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; 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.TreeNodeAttributes; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;