# HG changeset patch # User one # Date 1416525084 -32400 # Node ID 72f454eb04eca45740c0c708bb6121bb453bde2b # Parent ef183969bf3195ce8ccb7bb56e9e22b6ddce0829 add parentIndex diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -14,15 +14,18 @@ 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.IndexTreeEditor; 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; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser; 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.shoshi.jungle.util.TreeMapOrd; public class DefaultJungle implements Jungle { @@ -30,10 +33,10 @@ private ConcurrentHashMap trees; private String uuid; private TreeEditor editor; - + private Traverser traverser; public static void main(String args[]) { - DefaultJungle j = new DefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser())); + DefaultJungle j = new DefaultJungle(null,"hoge",new DefaultTraverser()); JungleTree t = j.createNewTree("fuga"); JungleTreeEditor e1 = t.getTreeEditor(); @@ -47,12 +50,13 @@ e1.success(); } - public DefaultJungle(Journal journal,String uuid,TreeEditor editor) + public DefaultJungle(Journal journal,String uuid,Traverser traverser) { this.journal = new NullJournal(); this.trees = new ConcurrentHashMap(); this.uuid = uuid; - this.editor = editor; + this.traverser = traverser; + this.editor = new DefaultTreeEditor(traverser); } @Override @@ -83,9 +87,10 @@ DefaultTreeNode root = new DefaultTreeNode(); TreeMap>>> index = TreeMap.empty(Ord.stringOrd); - ChangeSet set = new DefaultChangeSet(root,null,list,uuid,name,0,index); + TreeMap parentIndex = TreeMap.empty(TreeMapOrd.treeNodeOrd); + ChangeSet set = new DefaultChangeSet(root,null,list,uuid,name,0,index,parentIndex); DefaultTreeContext tc = new DefaultTreeContext(root,set); - JungleTree newTree = new DefaultJungleTree(tc,uuid,journal.getWriter(),editor); + JungleTree newTree = new DefaultJungleTree(tc,uuid,journal.getWriter(),editor,new IndexTreeEditor(traverser)); if(trees.putIfAbsent(name,newTree) != null){ return null; } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -1,12 +1,12 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; import fj.data.List; -import fj.data.Option; 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; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +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.store.operations.TreeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; @@ -27,13 +27,15 @@ private final AtomicReservableReference repository; private final String uuid; private final ChangeListWriter writer; - private final TreeEditor editor; - - public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor) { + private final TreeEditor treeEditor; + private final IndexTreeEditor indexTreeEditor; + + public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor, IndexTreeEditor indexTreeEditor) { this.repository = new AtomicReservableReference(tc); this.uuid = uuid; this.writer = writer; - this.editor = editor; + this.treeEditor = editor; + this.indexTreeEditor = indexTreeEditor; } @Override @@ -42,7 +44,8 @@ DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); TreeNode root = tc.getTreeNode(); TreeMap>>> index = getIndex(); - return new DefaultJungleTreeEditor(root, txManager, editor, index); + TreeMap parentIndex = getParentIndex(); + return new DefaultJungleTreeEditor(root, txManager, treeEditor, index,parentIndex); } @Override @@ -50,8 +53,16 @@ TreeContext tc = repository.get(); DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); TreeNode root = tc.getTreeNode(); - TreeMap>>> newIndex = getIndex(); - return new IndexJungleTreeEditor(root, txManager, editor, newIndex); + TreeMap>>> index = getIndex(); + TreeMap parentIndex = getParentIndex(); + return new IndexJungleTreeEditor(root, txManager, indexTreeEditor, index, parentIndex); + } + + @Override + public TreeMap getParentIndex() { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getParentIndex(); } @Override @@ -112,7 +123,7 @@ TreeContext oldTc = new DefaultTreeContext(root, cs); String oldTreeUuid = uuid + revision; - JungleTree oldTree = new DefaultJungleTree(oldTc,oldTreeUuid,writer,editor); + JungleTree oldTree = new DefaultJungleTree(oldTc,oldTreeUuid,writer,treeEditor,indexTreeEditor); return DefaultEither.newB(oldTree); } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -19,6 +19,7 @@ public JungleTreeEditor getLocalTreeEditor(); public TreeNode getRootNode(); public TreeMap>>> getIndex(); + public TreeMap getParentIndex(); public IndexJungleTreeEditor getIndexTreeEditor(); public Iterable getLog(); public long revision(); diff -r ef183969bf31 -r 72f454eb04ec src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/App.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/App.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/App.java Fri Nov 21 08:11:24 2014 +0900 @@ -7,6 +7,7 @@ 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; @@ -20,7 +21,7 @@ { public static void main( String[] args ) { - DefaultJungle jungle = new DefaultJungle(null,"sample",new DefaultTreeEditor(new DefaultTraverser())); + DefaultJungle jungle = new DefaultJungle(null,"sample", new DefaultTraverser()); jungle.createNewTree("hoge"); JungleTree tree = jungle.getTreeByName("hoge"); JungleTreeEditor editor = tree.getTreeEditor(); diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -23,4 +23,5 @@ public TreeMap>>> getIndex(); public Iterable getOperations(); + public TreeMap getParentIndex(); } diff -r ef183969bf31 -r 72f454eb04ec 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 Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Fri Nov 21 08:11:24 2014 +0900 @@ -16,7 +16,6 @@ public class DefaultTreeEditor implements TreeEditor { private final Traverser traverser; - public DefaultTreeEditor(Traverser traverser) { this.traverser = traverser; @@ -50,7 +49,6 @@ // target Direction targetDirection = path.head(); TreeNode target = targetDirection.getTarget(); - //EditableNodeWrapper wrapper = new EditableNodeWrapper(target); Either either = editor.edit(target); if(either.isA()){ return DefaultEither.newA(either.a()); @@ -61,9 +59,12 @@ // top int pos = targetDirection.getPosition(); TreeNode child = newWrap.getWrap(); + + for(Direction parentDirection : path.tail()){ + TreeNodeChildren chs = parentDirection.getTarget().getChildren(); - + Either ret = chs.replaceNode(pos,child); if(ret.isA()){ return DefaultEither.newA(ret.a()); diff -r ef183969bf31 -r 72f454eb04ec src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/IndexTreeEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/IndexTreeEditor.java Fri Nov 21 08:11:24 2014 +0900 @@ -0,0 +1,116 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; + + +import java.util.Iterator; + +import fj.data.List; +import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Direction; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser; +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 IndexTreeEditor { + + private final Traverser traverser; + + + public IndexTreeEditor(Traverser traverser) + { + this.traverser = traverser; + } + + + public Either>> edit(TreeNode root,NodePath path,NodeEditor editor,TreeMap parentIndex) + { + DefaultEvaluator e = new DefaultEvaluator(path); + Either either = traverser.traverse(root,e); + + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + Traversal t = either.b(); + Either>> ret = clone(t,editor,parentIndex); + + return ret; + } + + private Either>> clone(Traversal t,NodeEditor editor , TreeMap parentIndex) + { + // copying nodes from bottom to root + TreeMap newParentIndex = parentIndex; + List> path = List.nil(); + for (Direction direction : t) { + path = path.cons(direction); + } + + // target + Direction targetDirection = path.head(); + TreeNode target = targetDirection.getTarget(); + Iterator targetDeleteChildren = target.getChildren().iterator(); + + for (;targetDeleteChildren.hasNext();) { + TreeNode targetDeleteChild = targetDeleteChildren.next(); + newParentIndex = newParentIndex.delete(targetDeleteChild); + } + + + Either either = editor.edit(target); + if (either.isA()) { + return DefaultEither.newA(either.a()); + } + + LoggingNode newWrap = either.b(); + + // top + int pos = targetDirection.getPosition(); + TreeNode child = newWrap.getWrap(); + Iterator targetPutChildren = child.getChildren().iterator(); + + for (; targetPutChildren.hasNext();) { + TreeNode targetPutChild = targetPutChildren.next(); + newParentIndex = newParentIndex.set(targetPutChild, child); + } + + for (Direction parentDirection : path.tail()) { + + TreeNodeChildren chs = parentDirection.getTarget().getChildren(); + + Iterator deleteParentIndexChildren = chs.iterator(); + for (;deleteParentIndexChildren.hasNext();) { + TreeNode deleteParentIndexChild = deleteParentIndexChildren.next(); + newParentIndex = newParentIndex.delete(deleteParentIndexChild); + } + + Either ret = chs.replaceNode(pos, child); + if (ret.isA()) { + return DefaultEither.newA(ret.a()); + } + + TreeNode newParent = ret.b(); + Iterator putParentIndexChildren = newParent.getChildren().iterator(); + + for (;putParentIndexChildren.hasNext();) { + TreeNode putParentIndexChild = putParentIndexChildren.next(); + newParentIndex = newParentIndex.set(putParentIndexChild, newParent); + } + + child = newParent; + pos = parentDirection.getPosition(); + } + + TreeNode newRoot = child; + LoggingNode logNode = editor.wrap(newRoot, newWrap.getOperationLog()); + Pair> pair = new Pair>(logNode,newParentIndex); + return DefaultEither.newB(pair); + } + +} diff -r ef183969bf31 -r 72f454eb04ec 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 Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java Fri Nov 21 08:11:24 2014 +0900 @@ -2,7 +2,7 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainer; -public interface TreeNode extends AttributesContainer +public interface TreeNode extends AttributesContainer { public TreeNodeChildren getChildren(); diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -18,8 +18,9 @@ private final String treeName; private final long revision; private final TreeMap>>> index; + private final TreeMap parentIndex; - 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,TreeMap parentIndex) { this.root = _node; this.previous = _prev; @@ -28,6 +29,7 @@ this.treeName = _treeName; this.revision = _revision; this.index = index; + this.parentIndex = parentIndex; } @@ -78,4 +80,10 @@ return index; } + + @Override + public TreeMap getParentIndex() { + return parentIndex; + } + } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -33,25 +33,28 @@ private final TreeEditor editor; private final TreeOperationLog log; private final TreeMap>>> index; + private final TreeMap parentIndex; + // 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,TreeMap parentIndex) { - this(_root,_txManager,_editor,new DefaultTreeOperationLog(),index); + this(_root,_txManager,_editor,new DefaultTreeOperationLog(),index,parentIndex); } - public DefaultJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log, TreeMap>>> index) + public DefaultJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log, TreeMap>>> index,TreeMap parentIndex) { this.root = newNode; this.txManager = _txManager; this.editor = _editor; this.log = _log; this.index = index; + this.parentIndex = parentIndex; } private Either _edit(final NodePath _path,NodeEditor _e) @@ -76,7 +79,7 @@ DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable,newLog.length()); TreeOperationLog newTreeOpLog = log.append(treeOperationLog); - JungleTreeEditor newEditor = new DefaultJungleTreeEditor(newNode,txManager,editor,newTreeOpLog,index); + JungleTreeEditor newEditor = new DefaultJungleTreeEditor(newNode,txManager,editor,newTreeOpLog,index,parentIndex); return DefaultEither.newB(newEditor); } @@ -117,13 +120,13 @@ @Override public Either success() { - Either either = txManager.commit(root,log,index); + Either either = txManager.commit(root,log,index,parentIndex); if(either.isA()){ return DefaultEither.newA(either.a()); } TransactionManager newTxManager = either.b(); - JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor(root,newTxManager,editor,index); + JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor(root,newTxManager,editor,index,parentIndex); return DefaultEither.newB(newTreeEditor); } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -36,7 +36,7 @@ } @Override - public Either commit(TreeNode _newRoot,final TreeOperationLog _log, TreeMap>>> index) + public Either commit(TreeNode _newRoot,final TreeOperationLog _log, TreeMap>>> index,TreeMap parentIndex) { ChangeSet cs = tip.getChangeSet(); long currentRevision = cs.revision(); @@ -59,7 +59,7 @@ }; - DefaultChangeSet newCs = new DefaultChangeSet(_newRoot,cs,list,uuid, _treeName, nextRevision,index); + DefaultChangeSet newCs = new DefaultChangeSet(_newRoot,cs,list,uuid, _treeName, nextRevision,index,parentIndex); DefaultTreeContext newContext = new DefaultTreeContext(_newRoot,newCs); @SuppressWarnings("rawtypes") diff -r ef183969bf31 -r 72f454eb04ec 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 Thu Nov 13 22:04:14 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java Fri Nov 21 08:11:24 2014 +0900 @@ -50,5 +50,6 @@ { return new DefaultTreeNode(children,attrs); } + } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -6,7 +6,7 @@ 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.IndexTreeEditor; 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; @@ -32,150 +32,134 @@ import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexEditor; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.PutIndexEditor; -public class IndexJungleTreeEditor implements JungleTreeEditor -{ - private final TransactionManager txManager; - private final TreeNode root; - private final TreeEditor editor; - private final TreeOperationLog log; - private TreeMap>>> index; - -// public DefaultJungleTreeEditor(TreeNode root) -// { -// this(root,txManager,_editor,new DefaultTreeOperationLog()); -// } +public class IndexJungleTreeEditor implements JungleTreeEditor { + private final TransactionManager txManager; + private final TreeNode root; + private final IndexTreeEditor editor; + private final TreeOperationLog log; + private TreeMap>>> index; + private TreeMap parentIndex; + + public TreeMap>>> getIndex() { + return index; + } + + - public TreeMap>>> getIndex() { - return index; - } + public IndexJungleTreeEditor(TreeNode _root, TransactionManager _txManager, IndexTreeEditor treeEditor, + TreeMap>>> index,TreeMap parentIndex) { + this(_root, _txManager, treeEditor, new DefaultTreeOperationLog(), index,parentIndex); + } - public void setIndex( - TreeMap>>> index) { - this.index = index; - } + public IndexJungleTreeEditor(TreeNode newNode, TransactionManager _txManager, IndexTreeEditor _editor, + TreeOperationLog _log, TreeMap>>> index,TreeMap parentIndex) { + this.root = newNode; + this.txManager = _txManager; + this.editor = _editor; + this.log = _log; + this.index = index; + this.parentIndex = parentIndex; + } - 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) - { - this.root = newNode; - this.txManager = _txManager; - this.editor = _editor; - this.log = _log; - this.index = index; - } - - private Either _edit(final NodePath _path,NodeEditor _e, IndexEditor indexEditor) - { - Either either = editor.edit(root,_path,_e); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - LoggingNode newLogging = either.b(); - OperationLog newLog = newLogging.getOperationLog(); - TreeNode newNode = newLogging.getWrap(); - - IterableConverter.Converter converter = new IterableConverter.Converter(){ - @Override - public TreeOperation conv(NodeOperation _b){ - return new DefaultTreeOperation(_path,_b); - } - }; - - Iterable iterable = new IterableConverter(newLog,converter); - DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable,newLog.length()); - TreeOperationLog newTreeOpLog = log.append(treeOperationLog); - - Either newEither = indexEditor.edit(newNode,txManager,editor,newTreeOpLog, index); - return newEither; - } - - @Override - public Either addNewChildAt(NodePath _path, int _pos) - { - AppendChildAt appendChildAt = new AppendChildAt(_pos); - AddNewChildrenIndexEditor indexEditor = new AddNewChildrenIndexEditor(_pos, _path); - Either either = _edit(_path,appendChildAt,indexEditor); - Either newEither = DefaultEither.newB(either.b()); - return newEither; - } + + public Either _edit(final NodePath _path, NodeEditor _e, IndexEditor indexEditor) { + Either>> either = editor.edit(root, _path, _e,parentIndex); + if (either.isA()) { + return DefaultEither.newA(either.a()); + } + + LoggingNode newLogging = either.b().left(); + TreeMap newParentIndex = either.b().right(); + OperationLog newLog = newLogging.getOperationLog(); + TreeNode newNode = newLogging.getWrap(); + + IterableConverter.Converter converter = new IterableConverter.Converter() { + @Override + public TreeOperation conv(NodeOperation _b) { + return new DefaultTreeOperation(_path, _b); + } + }; + + Iterable iterable = new IterableConverter(newLog, converter); + DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable, newLog.length()); + TreeOperationLog newTreeOpLog = log.append(treeOperationLog); + Either newEither = indexEditor.edit(newNode, txManager, editor, newTreeOpLog, index, newParentIndex); + return newEither; + } + + @Override + public Either addNewChildAt(NodePath _path, int _pos) { + AppendChildAt appendChildAt = new AppendChildAt(_pos); + AddNewChildrenIndexEditor indexEditor = new AddNewChildrenIndexEditor(_pos, _path); + Either either = _edit(_path, appendChildAt, indexEditor); + Either newEither = DefaultEither.newB(either.b()); + return newEither; + } - @Override - public Either deleteChildAt(NodePath _path, int _pos) - { - DeleteChildAt deleteChildAt = new DeleteChildAt(_pos); - DeleteChildIndexEditor indexEditor = new DeleteChildIndexEditor(_pos, _path); - Either either = _edit(_path,deleteChildAt, indexEditor); - JungleTreeEditor editor = either.b(); - Either newEither = DefaultEither.newB(editor); - return newEither; - } + @Override + public Either deleteChildAt(NodePath _path, int _pos) { + DeleteChildAt deleteChildAt = new DeleteChildAt(_pos); + DeleteChildIndexEditor indexEditor = new DeleteChildIndexEditor(_pos, _path); + Either either = _edit(_path, deleteChildAt, indexEditor); + JungleTreeEditor editor = either.b(); + Either newEither = DefaultEither.newB(editor); + return newEither; + } - @Override - public Either putAttribute(NodePath _path,String _key,ByteBuffer _value) - { - PutAttribute putAttribute = new PutAttribute(_key,_value); - PutIndexEditor indexEditor = new PutIndexEditor(_key,_value,_path); - Either either = _edit(_path,putAttribute,indexEditor); - JungleTreeEditor editor = either.b(); - Either newEither = DefaultEither.newB(editor); - return newEither; - } + @Override + public Either putAttribute(NodePath _path, String _key, ByteBuffer _value) { + PutAttribute putAttribute = new PutAttribute(_key, _value); + PutIndexEditor indexEditor = new PutIndexEditor(_key, _value, _path); + Either either = _edit(_path, putAttribute, indexEditor); + JungleTreeEditor editor = either.b(); + Either newEither = DefaultEither.newB(editor); + return newEither; + } - @Override - public Either deleteAttribute(NodePath _path, String _key) - { - DeleteAttribute deleteAttribute = new DeleteAttribute(_key); - DeleteIndexEditor indexEditor = new DeleteIndexEditor(_key,_path,root); - Either either = _edit(_path,deleteAttribute,indexEditor); - Either newEither = DefaultEither.newB(either.b()); - return newEither; - } + @Override + public Either deleteAttribute(NodePath _path, String _key) { + DeleteAttribute deleteAttribute = new DeleteAttribute(_key); + DeleteIndexEditor indexEditor = new DeleteIndexEditor(_key, _path, root); + Either either = _edit(_path, deleteAttribute, indexEditor); + Either newEither = DefaultEither.newB(either.b()); + return newEither; + } - @Override - public Either edit(NodePath _path,NodeEditor _editor) - { - DefaultIndexEditor indexEditor = new DefaultIndexEditor(); - Either either = _edit(_path,_editor,indexEditor); - JungleTreeEditor editor = either.b(); - Either newEither = DefaultEither.newB(editor); - return newEither; - } + @Override + public Either edit(NodePath _path, NodeEditor _editor) { + DefaultIndexEditor indexEditor = new DefaultIndexEditor(); + Either either = _edit(_path, _editor, indexEditor); + JungleTreeEditor editor = either.b(); + Either newEither = DefaultEither.newB(editor); + return newEither; + } + + @Override + public Either success() { + Either either = txManager.commit(root, log, index,parentIndex); + if (either.isA()) { + return DefaultEither.newA(either.a()); + } + + TransactionManager newTxManager = either.b(); + JungleTreeEditor newTreeEditor = new IndexJungleTreeEditor(root, newTxManager, editor, index,parentIndex); - @Override - public Either success() - { - Either either = txManager.commit(root,log,index); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - TransactionManager newTxManager = either.b(); - JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor(root,newTxManager,editor,index); - - return DefaultEither.newB(newTreeEditor); - } + return DefaultEither.newB(newTreeEditor); + } + + @Override + public String getID() { + return txManager.getUUID(); + } - @Override - public String getID() - { - return txManager.getUUID(); - } + @Override + public String getRevision() { + return Long.toString(txManager.getRevision()); + } - @Override - public String getRevision() - { - return Long.toString(txManager.getRevision()); - } + @Override + public TreeNode getRoot() { + return root; + } - @Override - public TreeNode getRoot() - { - return root; - } - } \ No newline at end of file diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -11,7 +11,7 @@ public interface TransactionManager { - public Either commit(TreeNode _newRoot,TreeOperationLog _log, TreeMap>>> index); + public Either commit(TreeNode _newRoot,TreeOperationLog _log, TreeMap>>> index,TreeMap parentIndex); public String getUUID(); public long getRevision(); } diff -r ef183969bf31 -r 72f454eb04ec src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/TreeMapOrd.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/TreeMapOrd.java Fri Nov 21 08:11:24 2014 +0900 @@ -0,0 +1,25 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import fj.F; +import fj.Ord; +import fj.P; +import fj.P1; + +public class TreeMapOrd { + + private TreeMapOrd(){ + + } + + private static F> toP1 = new F> () { + @Override + public P1 f(TreeNode node) { + return P.p(node.toString()); + } + }; + + private static Ord> ord = Ord.p1Ord(Ord.stringOrd); + public static Ord treeNodeOrd = ord.comap(toP1); + +} diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -1,17 +1,11 @@ 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; +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.store.impl.logger.TreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; @@ -23,101 +17,98 @@ public class AddNewChildrenIndexEditor implements IndexEditor { - NodePath editNodePath; + NodePath editNodePath; - public AddNewChildrenIndexEditor(int pos, NodePath path) { - this.editNodePath = path.add(pos); - } + public AddNewChildrenIndexEditor(int pos, NodePath path) { + this.editNodePath = path.add(pos); + } - @Override - public Either edit( - TreeNode root, - TransactionManager txManager, - TreeEditor editor, - TreeOperationLog log, - TreeMap>>> index) { + @Override + public Either edit(TreeNode root, TransactionManager txManager, IndexTreeEditor editor, + TreeOperationLog log, TreeMap>>> index, + TreeMap parentIndex) { - TreeMap>>> newIndex = editIndex(index); - IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root, txManager, editor, newIndex); - return DefaultEither.newB(newEditor); - } + TreeMap>>> newIndex = editIndex(index); + IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root, txManager, editor, newIndex,parentIndex); + 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); + if (!index.isEmpty()) { + List keyList = index.keys(); + TreeMap>>> newIndex = TreeMap.empty(Ord.stringOrd); + TreeMap>> newInnerIndex = TreeMap.empty(Ord.stringOrd); - for (String indexKey : keyList) { - TreeMap>> innerIndex = index.get(indexKey).some(); - List innerIndexKeyList = innerIndex.keys(); + for (String indexKey : keyList) { + TreeMap>> innerIndex = index.get(indexKey).some(); + List innerIndexKeyList = innerIndex.keys(); - for (String innerIndexKey : innerIndexKeyList) { - List> pairList = innerIndex.get(innerIndexKey).some(); - List> list = checkPath(pairList); - if (!list.isEmpty()){ - //System.out.println(new String(list.head().left().getAttributes().get("KEY").array())); - newInnerIndex = newInnerIndex.set(innerIndexKey, list); - } - } - newIndex = newIndex.set(indexKey, newInnerIndex); - } - return newIndex; - } else { - return index; - } - } + for (String innerIndexKey : innerIndexKeyList) { + List> pairList = innerIndex.get(innerIndexKey).some(); + List> list = checkPath(pairList); + if (!list.isEmpty()) { + // System.out.println(new + // String(list.head().left().getAttributes().get("KEY").array())); + newInnerIndex = newInnerIndex.set(innerIndexKey, list); + } + } + newIndex = newIndex.set(indexKey, newInnerIndex); + } + return newIndex; + } else { + return index; + } + } + + public List> checkPath(List> pairList) { - public List> checkPath(List> pairList){ + List> list = List.nil(); + for (Pair pair : pairList) { - List> list = List.nil(); - for (Pair pair : pairList) { + NodePath path = pair.right(); + // System.out.println("oldPath = " + path.toString()); + NodePath newPath = new DefaultNodePath(); - NodePath path = pair.right(); - //System.out.println("oldPath = " + path.toString()); - NodePath newPath = new DefaultNodePath(); - - - if (editNodePath.size() > path.size()) { - list = list.cons(pair); - continue; - } + if (editNodePath.size() > path.size()) { + list = list.cons(pair); + continue; + } - Pair editNodePathCopy = editNodePath.pop(); - int loopCount = 0; + Pair editNodePathCopy = editNodePath.pop(); + int loopCount = 0; - for (Integer pathInt : path) { - loopCount++; + for (Integer pathInt : path) { + loopCount++; + + if (pathInt == -1) + continue; - if (pathInt == -1) - continue; - - if (editNodePathCopy.right().size() > 0) { - editNodePathCopy = editNodePathCopy.right().pop(); - - if (loopCount == editNodePath.size() && editNodePathCopy.left() <= pathInt) { - newPath = newPath.add(pathInt + 1); - continue; - } + if (editNodePathCopy.right().size() > 0) { + editNodePathCopy = editNodePathCopy.right().pop(); + + if (loopCount == editNodePath.size() && editNodePathCopy.left() <= pathInt) { + newPath = newPath.add(pathInt + 1); + continue; + } - if (!(editNodePathCopy.left() == pathInt)) { - newPath = path; - break; - } - } + if (!(editNodePathCopy.left() == pathInt)) { + newPath = path; + break; + } + } - newPath = newPath.add(pathInt); + newPath = newPath.add(pathInt); - } + } - //System.out.println("newPath = " + newPath.toString()); - Pair newPair = new Pair(pair.left(), newPath); - list = list.cons(newPair); - } + // System.out.println("newPath = " + newPath.toString()); + Pair newPair = new Pair(pair.left(), newPath); + list = list.cons(newPair); + } - return list; - } + return list; + } } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -2,9 +2,8 @@ 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.IndexTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; @@ -17,8 +16,8 @@ public class DefaultIndexEditor implements IndexEditor { @Override - public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>>> index) { - IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, index); + public Either edit(TreeNode root,TransactionManager txManager, IndexTreeEditor editor,TreeOperationLog log,TreeMap>>> index, TreeMap parentIndex){ + IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, index, parentIndex); Either either = DefaultEither.newB(newEditor); return either; } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -1,17 +1,12 @@ 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; +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.store.impl.logger.TreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; @@ -30,15 +25,10 @@ } @Override - public Either edit( - TreeNode root, - TransactionManager txManager, - TreeEditor editor, - TreeOperationLog log, - TreeMap>>> index) { + public Either edit(TreeNode root,TransactionManager txManager, IndexTreeEditor editor,TreeOperationLog log,TreeMap>>> index, TreeMap parentIndex) { TreeMap>>> newIndex = editIndex(index); - IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root, txManager, editor, newIndex); + IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root, txManager, editor, newIndex, parentIndex); return DefaultEither.newB(newEditor); } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -8,6 +8,7 @@ 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.IndexTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; @@ -32,12 +33,12 @@ } @Override - public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>>> index) { + public Either edit(TreeNode root,TransactionManager txManager, IndexTreeEditor editor,TreeOperationLog log,TreeMap>>> index, TreeMap parentIndex) { NodePath newPath = path.pop().right(); TreeNode target = getTarget(node, newPath); String attribute = target.getAttributes().getString(key); TreeMap>>> newIndex = editIndex(attribute, index); - IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex); + IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex, parentIndex); Either either = DefaultEither.newB(newEditor); return either; } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -5,6 +5,7 @@ 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.IndexTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; @@ -14,5 +15,5 @@ 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, IndexTreeEditor editor,TreeOperationLog log,TreeMap>>> index, TreeMap parentIndex); } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -30,7 +30,8 @@ String uuid = cs.uuid(); String treeName = cs.getTreeName(); long revision = cs.revision(); - DefaultChangeSet newCs = new DefaultChangeSet(root, prev, cl, uuid, treeName, revision, index); + TreeMap parentIndex = cs.getParentIndex(); + DefaultChangeSet newCs = new DefaultChangeSet(root, prev, cl, uuid, treeName, revision, index, parentIndex); DefaultTreeContext newTs = new DefaultTreeContext(root, newCs); reservation.set(newTs); } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -8,6 +8,7 @@ import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.IndexTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; @@ -36,11 +37,11 @@ } @Override - public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>>> index) { + public Eitheredit(TreeNode root,TransactionManager txManager, IndexTreeEditor editor,TreeOperationLog log,TreeMap>>> index, TreeMap parentIndex) { NodePath newPath = path.pop().right(); TreeNode target = getTarget(root, newPath); TreeMap>>> newIndex = editIndex(target, path, key, attribute,index); - IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex); + IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex, parentIndex); Either either = DefaultEither.newB(newEditor); return either; } diff -r ef183969bf31 -r 72f454eb04ec src/test/java/DefaultJungleTreeTest.java --- a/src/test/java/DefaultJungleTreeTest.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/test/java/DefaultJungleTreeTest.java Fri Nov 21 08:11:24 2014 +0900 @@ -6,6 +6,7 @@ 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; @@ -18,7 +19,7 @@ { public Jungle instance() { - Jungle j = new DefaultJungle(null,"hogehoge",new DefaultTreeEditor(new DefaultTraverser())); + Jungle j = new DefaultJungle(null,"hogehoge",new DefaultTraverser()); return j; } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -1,5 +1,6 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; + import java.nio.ByteBuffer; import org.junit.Test; @@ -10,6 +11,7 @@ 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; @@ -20,12 +22,12 @@ @Test public void getOldTreeTest() { - Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTraverser()); jungle.createNewTree("tree"); JungleTree tree = jungle.getTreeByName("tree"); JungleTreeEditor editor = tree.getTreeEditor(); DefaultNodePath path = new DefaultNodePath(); - + 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(); diff -r ef183969bf31 -r 72f454eb04ec src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/functionaljava/FjTreeMapTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/functionaljava/FjTreeMapTest.java Thu Nov 13 22:04:14 2014 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/functionaljava/FjTreeMapTest.java Fri Nov 21 08:11:24 2014 +0900 @@ -1,39 +1,65 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.functionaljava; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import org.apache.commons.collections.map.StaticBucketMap; import org.junit.Assert; import org.junit.Test; + import fj.F; import fj.Ord; +import fj.P; +import fj.P1; import fj.data.List; import fj.data.Option; import fj.data.TreeMap; public class FjTreeMapTest { - - @Test - public void testTreeMap() { + + F> toP3 = new F> () { + + @Override + public P1 f(TreeNode node) { + return P.p(node.toString()); + } + + }; + + + @Test + public void testTreeMap() { - List list = List.nil(); - list = list.cons(1).cons(2).cons(3); - System.out.println(list.toString()); - list.length(); - TreeMap map = TreeMap.empty(Ord.stringOrd); - TreeMap newMap = map.set("name","tatsuki"); - Option op = newMap.get("name"); - if (op.isNone()) { - - } - String str = op.some(); - - TreeMap newMap2 = map.set("name","kanagawa"); - String str2 = newMap2.get("name").some(); - Assert.assertEquals(str,"tatsuki"); - Assert.assertEquals(str2,"kanagawa"); - } - + Ord> aaa = Ord.p1Ord(Ord.stringOrd); + Ord test = aaa.comap(toP3); + TreeMap treeMap = TreeMap.empty(test); + TreeNode node1 = new DefaultTreeNode(); + TreeNode node2 = new DefaultTreeNode(); + treeMap = treeMap.set(node1,node2); + System.out.println(node1.toString()); + System.out.println(node2.toString()); + System.out.println(node1.toString()); + System.out.println(node2.toString()); + Option nodee = treeMap.get(node1); + TreeNode node = nodee.some(); + System.out.println(node.toString()); + List list = List.nil(); + list = list.cons(1).cons(2).cons(3); + System.out.println(list.toString()); + list.length(); + TreeMap map = TreeMap.empty(Ord.stringOrd); + TreeMap newMap = map.set("name", "tatsuki"); + Option op = newMap.get("name"); + if (op.isNone()) { + + } + String str = op.some(); + + TreeMap newMap2 = map.set("name", "kanagawa"); + String str2 = newMap2.get("name").some(); + Assert.assertEquals(str, "tatsuki"); + Assert.assertEquals(str2, "kanagawa"); + } } diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -1,5 +1,7 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.index; + + import java.nio.ByteBuffer; import java.util.Iterator; @@ -16,6 +18,7 @@ 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.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.transaction.DefaultTreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; @@ -30,7 +33,7 @@ @Test public void DeleteChildrenTest(){ - Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTreeEditor(new DefaultTraverser())); + Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTraverser()); jungle.createNewTree("tree"); JungleTree tree = jungle.getTreeByName("tree"); createTree(tree); diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -1,5 +1,7 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.index; + + import java.nio.ByteBuffer; import org.junit.Test; @@ -10,6 +12,7 @@ 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.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.transaction.IndexJungleTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; @@ -24,7 +27,7 @@ @Test public void PutAttributeIndexTest(){ - DefaultJungle jungle = new DefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser())); + DefaultJungle jungle = new DefaultJungle(null,"hoge",new DefaultTraverser()); JungleTree tree = jungle.createNewTree("fuga"); IndexJungleTreeEditor editor = tree.getIndexTreeEditor(); TreeMap>>> emptyIndex = editor.getIndex(); diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -16,6 +16,7 @@ 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.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.transaction.DefaultTreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; @@ -30,7 +31,7 @@ @Test public void DeleteChildrenTest(){ - Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTreeEditor(new DefaultTraverser())); + Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTraverser()); jungle.createNewTree("tree"); JungleTree tree = jungle.getTreeByName("tree"); createTree(tree); diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -9,6 +9,7 @@ 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.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.transaction.DefaultTreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; @@ -20,7 +21,6 @@ import java.nio.ByteBuffer; - import org.junit.Test; import fj.data.List; @@ -32,7 +32,7 @@ @Test public void IndexCommitTest() throws InterruptedException { - Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTreeEditor(new DefaultTraverser())); + Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTraverser()); jungle.createNewTree("tree"); JungleTree tree = jungle.getTreeByName("tree"); createTree(tree); diff -r ef183969bf31 -r 72f454eb04ec src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/ParentIndexTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/ParentIndexTest.java Fri Nov 21 08:11:24 2014 +0900 @@ -0,0 +1,55 @@ +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; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; +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.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; +import junit.framework.Assert; + +import org.junit.Test; + +import fj.data.Option; +import fj.data.TreeMap; + +public class ParentIndexTest { + + @Test + public void testParentIndex() { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTraverser()); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getIndexTreeEditor(); + DefaultNodePath path = new DefaultNodePath(); + editor = editor.addNewChildAt(path, 0).b(); + for (int num = 0; num < 5; num++) { + editor = editor.addNewChildAt(path.add(0), num).b().success().b(); + } + TreeMap parentIndex = tree.getParentIndex(); + + TreeNode node = tree.getRootNode(); + for (int num = 0; node.getChildren().size() != 0; num++) { + Iterator children = node.getChildren().iterator(); + for (; children.hasNext();) { + TreeNode child = children.next(); + TreeNode parent = parentIndex.get(child).some(); + Assert.assertEquals(parent, node); + } + node = node.getChildren().at(num).b(); + } + + JungleTree oldTree = tree.getOldTree(tree.revision() - 1).b(); + TreeNode oldRoot = oldTree.getRootNode(); + TreeNode oldNode = oldRoot.getChildren().at(0).b(); + Option oldParentOp = parentIndex.get(oldNode); + Assert.assertTrue(oldParentOp.isNone()); + TreeMap oldTreeParentIndex = oldTree.getParentIndex(); + oldParentOp = oldTreeParentIndex.get(oldNode); + Assert.assertTrue(oldParentOp.isSome()); + + } +} diff -r ef183969bf31 -r 72f454eb04ec 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 Fri Nov 21 08:11:24 2014 +0900 @@ -12,6 +12,7 @@ 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.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.transaction.DefaultTreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; @@ -32,7 +33,7 @@ @Test public void SearchQueryTest() { - Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTreeEditor(new DefaultTraverser())); + Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTraverser()); jungle.createNewTree("tree"); JungleTree tree = jungle.getTreeByName("tree"); createTree(tree);