# HG changeset patch # User one # Date 1416905561 -32400 # Node ID 20af7f25ef32a6bc476f6a4a3e5d1d7f72352284 # Parent 8a0aa8fc137cf12cc8dc153c4b62084d67aab9c8 miner change diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java Tue Nov 25 17:52:41 2014 +0900 @@ -11,13 +11,11 @@ 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.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.tatsuki.jungle.store.index.Index; @@ -29,10 +27,9 @@ 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 DefaultTraverser()); + DefaultJungle j = new DefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser())); JungleTree t = j.createNewTree("fuga"); JungleTreeEditor e1 = t.getTreeEditor(); @@ -46,13 +43,12 @@ e1.success(); } - public DefaultJungle(Journal journal,String uuid,Traverser traverser) + public DefaultJungle(Journal journal,String uuid,TreeEditor editor) { this.journal = new NullJournal(); this.trees = new ConcurrentHashMap(); this.uuid = uuid; - this.traverser = traverser; - this.editor = new DefaultTreeEditor(traverser); + this.editor = editor; } @Override @@ -86,7 +82,7 @@ ParentIndex parentIndex = new ParentIndex(); 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,new IndexTreeEditor(traverser)); + JungleTree newTree = new DefaultJungleTree(tc,uuid,journal.getWriter(),editor); if(trees.putIfAbsent(name,newTree) != null){ return null; } diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java Tue Nov 25 17:52:41 2014 +0900 @@ -5,12 +5,10 @@ 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; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTransactionManager; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; @@ -22,19 +20,17 @@ import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public class DefaultJungleTree implements JungleTree { + private final AtomicReservableReference repository; private final String uuid; private final ChangeListWriter writer; private final TreeEditor treeEditor; - private final IndexTreeEditor indexTreeEditor; - public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor, - IndexTreeEditor indexTreeEditor) { + public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor) { this.repository = new AtomicReservableReference(tc); this.uuid = uuid; this.writer = writer; this.treeEditor = editor; - this.indexTreeEditor = indexTreeEditor; } @Override @@ -42,27 +38,9 @@ TreeContext tc = repository.get(); DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); TreeNode root = tc.getTreeNode(); - Index index = getIndex(); - ParentIndex parentIndex = getParentIndex(); - return new DefaultJungleTreeEditor(root, txManager, treeEditor, index, parentIndex); + return new DefaultJungleTreeEditor(root, txManager, treeEditor); } - @Override - public IndexJungleTreeEditor getIndexTreeEditor() { - TreeContext tc = repository.get(); - DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); - TreeNode root = tc.getTreeNode(); - Index index = getIndex(); - ParentIndex parentIndex = getParentIndex(); - return new IndexJungleTreeEditor(root, root, txManager, indexTreeEditor, index, parentIndex); - } - - @Override - public ParentIndex getParentIndex() { - TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getParentIndex(); - } @Override public JungleTreeEditor getLocalTreeEditor() { @@ -77,13 +55,19 @@ } @Override - public InterfaceTraverser getTraverser() { + public InterfaceTraverser getTraverser(boolean useIndex) { AtomicReservableReference.Reservation reservation = repository.getReservation(); IndexManager indexManager = new IndexManager(reservation); Index index = getIndex(); - if (index != null) - return new InterfaceTraverser(getRootNode(), index, indexManager); - return new InterfaceTraverser(getRootNode(), indexManager); + ParentIndex parentIndex = getParentIndex(); + return new InterfaceTraverser(getRootNode(), index, parentIndex, indexManager,useIndex); + } + + @Override + public ParentIndex getParentIndex() { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getParentIndex(); } @Override @@ -93,12 +77,6 @@ return cs.getIndex(); } - @Override - public Iterable getLog() { - TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getOperations(); - } @Override public long revision() { @@ -112,7 +90,7 @@ TreeContext tc = repository.get(); ChangeSet cs = tc.getChangeSet(); - for (; cs.revision() != revision;) { + for (;cs.revision() != revision;) { cs = cs.prev(); if (cs == null) return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); @@ -122,8 +100,9 @@ TreeContext oldTc = new DefaultTreeContext(root, cs); String oldTreeUuid = uuid + revision; - JungleTree oldTree = new DefaultJungleTree(oldTc, oldTreeUuid, writer, treeEditor, indexTreeEditor); + JungleTree oldTree = new DefaultJungleTree(oldTc, oldTreeUuid, writer, treeEditor); return DefaultEither.newB(oldTree); } + } diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java Tue Nov 25 17:52:41 2014 +0900 @@ -3,8 +3,6 @@ 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.IndexJungleTreeEditor; 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; @@ -14,13 +12,11 @@ public interface JungleTree { public JungleTreeEditor getTreeEditor(); - public InterfaceTraverser getTraverser(); public JungleTreeEditor getLocalTreeEditor(); public TreeNode getRootNode(); - public Index getIndex(); - public ParentIndex getParentIndex(); - public IndexJungleTreeEditor getIndexTreeEditor(); - public Iterable getLog(); public long revision(); public Either getOldTree(long revision); + public Index getIndex(); + public ParentIndex getParentIndex(); + public InterfaceTraverser getTraverser(boolean useIndex); } diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java Tue Nov 25 17:52:41 2014 +0900 @@ -3,22 +3,17 @@ import java.nio.ByteBuffer; 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.store.trasnformer.NodeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; public interface JungleTreeEditor { - public TreeNode getRoot(); public Either addNewChildAt(NodePath path,int pos); public Either deleteChildAt(NodePath path,int pos); public Either putAttribute(NodePath path,String key,ByteBuffer value); public Either deleteAttribute(NodePath path,String key); public Either edit(NodePath path,NodeEditor editor); - public Either success(); - public String getID(); - public String getRevision(); } diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/App.java Tue Nov 25 17:52:41 2014 +0900 @@ -6,6 +6,7 @@ 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.DefaultTreeEditor; 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; @@ -19,7 +20,7 @@ { public static void main( String[] args ) { - DefaultJungle jungle = new DefaultJungle(null,"sample", new DefaultTraverser()); + DefaultJungle jungle = new DefaultJungle(null,"sample", new DefaultTreeEditor(new DefaultTraverser())); jungle.createNewTree("hoge"); JungleTree tree = jungle.getTreeByName("hoge"); JungleTreeEditor editor = tree.getTreeEditor(); diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Node.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Node.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; - - -public interface Node extends AttributesContainer -{ -}*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Parent.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Parent.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; - -public interface Parent -{ - public Children getChildren(); -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultAttributes.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultAttributes.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import java.nio.ByteBuffer; - -import fj.data.Option; -import fj.data.TreeMap; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes; - - -public class DefaultAttributes implements Attributes -{ - private final TreeMap attrs; - - public DefaultAttributes(TreeMap _attrs) - { - attrs = _attrs; - } - - /* - @Override - public Either put(String _key,ByteBuffer _value) - { - TreeMap newAttrs = attrs.set(_key,_value); - EditableNode newNode = new DefaultNode(children,newAttrs); - - return DefaultEither.newB(newNode); - } - - public TreeMap getAttributesAsRawMap() - { - return attrs; - } - - @Override - public ByteBuffer get(String _key) - { - if(_key == null){ - return null; - } - - Option result = attrs.get(_key); - return result.isSome() ? result.some() : null; - } - - /* - @Override - public Either delete(String _key) - { - return null; - } -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChildren.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - - -import java.util.Iterator; -import fj.data.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError; -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.IterableWrapper; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public class DefaultChildren> implements Children> -{ - private final List> children; - - public DefaultChildren(List> _children) - { - children = _children; - } - - /* - public Either replaceNode(DefaultNode _target,int _pos) - { - if(check(_pos)){ - return DefaultEither.newA(OUT_OF_RANGE); - } - - P2,List> split = children.splitAt(_pos); - List head = split._1(); - List tail = split._2().tail().cons(_target); - List newList = head.append(tail); - - DefaultNode newNode = new DefaultNode(newList,attrs); - return DefaultEither.newB(newNode); - } - - - @Override - public int size() - { - return children.length(); - } - - /* - - public Either addNewChildAt(int _pos) - { - if(!check(_pos)){ - return DefaultEither.newA(OUT_OF_RANGE); - } - - P2,List> split = children.splitAt(_pos); - List newChildren = split._1().snoc(new DefaultNode()).append(split._2()); - DefaultNode newNode = new DefaultNode(newChildren,attrs); - - return DefaultEither.newB(newNode); - } - - public Either deleteChildAt(int _pos) - { - if(!check(_pos)){ - return DefaultEither.newA(OUT_OF_RANGE); - } - - P2,List> split = children.splitAt(_pos); - List newChildren = split._1().init().append(split._2()); - - DefaultNode newNode = new DefaultNode(newChildren,attrs); - - return DefaultEither.newB(newNode); - } - - - - @Override - public Either> at(int _pos) - { - TreeNode target = children.index(_pos); - if(target == null){ - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); // TODO - } - TreeNode ret = target; - - return DefaultEither.newB(ret); - } - - public List> getChildrenAsRawList() - { - return children; - } - - @Override - public Iterator> iterator() - { - return (new IterableWrapper>(children)).iterator(); - } -}*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNode.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import java.nio.ByteBuffer; -import fj.Ord; -import fj.data.List; -import fj.data.TreeMap; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; - -public class DefaultNode implements Node -{ - public List children; - public TreeMap attrs; - - private static final List NIL_LIST = List.nil(); - private static final TreeMap NIL_MAP = TreeMap.empty(Ord.stringOrd); - - public DefaultNode() - { - this(NIL_LIST,NIL_MAP); - } - - public DefaultNode(List _children,TreeMap _attrs) - { - attrs = _attrs; - children = _children; - } - - public DefaultNode clone() - { - return new DefaultNode(children,attrs); - } - - @Override - public DefaultChildren getChildren() - { - return new DefaultChildren(children); - } - - @Override - public DefaultAttributes getAttributes() - { - return new DefaultAttributes(attrs); - } -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/EditableNodeWrapper.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/EditableNodeWrapper.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,152 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import java.nio.ByteBuffer; -import java.util.Iterator; - - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; -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.IterableConverter; - -public class EditableNodeWrapper> implements EditableNode> -{ - private final T wrap; - - public EditableNodeWrapper(T target) - { - wrap = target; - } - - @Override - public EditableAttributes> getAttributes() - { - return new EditableAttributesWrapper(wrap); - } - - @Override - public EditableChildren> getChildren() - { - return new EditableChildrenWrapper(wrap); - } - - public T getWrap() - { - return wrap; - } - - private static class EditableAttributesWrapper> implements EditableAttributes> - { - private final TreeNodeAttributes attributes; - - public EditableAttributesWrapper(TreeNode _wrap) - { - attributes = _wrap.getAttributes(); - } - - @Override - public ByteBuffer get(String _key) - { - return attributes.get(_key); - } - - @Override - public Either> delete(String _key) - { - Either either = attributes.delete(_key); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - T newWrap = either.b(); - EditableNodeWrapper newWrapper = new EditableNodeWrapper(newWrap); - return DefaultEither.newB(newWrapper); - } - - @Override - public Either> put(String _key,ByteBuffer _value) - { - Either either = attributes.put(_key,_value); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - T newWrap = either.b(); - EditableNodeWrapper newWrapper = new EditableNodeWrapper(newWrap); - return DefaultEither.newB(newWrapper); - } - } - - public static class EditableChildrenWrapper> implements EditableChildren> - { - private final TreeNodeChildren children; - - public EditableChildrenWrapper(T _wrap) - { - children = _wrap.getChildren(); - } - - @Override - public Either> at(int _pos) - { - Either either = children.at(_pos); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - T target = either.b(); - EditableNodeWrapper newWrapper = new EditableNodeWrapper(target); - return DefaultEither.newB(newWrapper); - } - - @Override - public int size() - { - return children.size(); - } - - @Override - public Iterator> iterator() - { - IterableConverter.Converter,T> converter = new IterableConverter.Converter,T>(){ - @Override - public EditableNodeWrapper conv(T _b){ - return new EditableNodeWrapper(_b); - } - }; - - - return new IterableConverter,T>(children,converter).iterator(); - } - - @Override - public Either> addNewChildAt(int _pos) - { - Either either = children.addNewChildAt(_pos); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - T newWrap = either.b(); - EditableNodeWrapper newWrapper = new EditableNodeWrapper(newWrap); - - return DefaultEither.newB(newWrapper); - } - - @Override - public Either> deleteChildAt(int _pos) - { - Either either = children.deleteChildAt(_pos); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - T newWrap = either.b(); - EditableNodeWrapper newWrapper = new EditableNodeWrapper(newWrap); - - return DefaultEither.newB(newWrapper); - } - } -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/NodeWrapper.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/NodeWrapper.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import java.util.Iterator; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; -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.IterableConverter; - -public class NodeWrapper> implements Node -{ - private final T wrap; - - public NodeWrapper(T _wrap) - { - wrap = _wrap; - } - - @Override - public Attributes getAttributes() - { - return wrap.getAttributes(); - } - - @Override - public Children getChildren() - { - return new ChildrenWrapper(wrap); - } - - private static class ChildrenWrapper> implements Children - { - private final TreeNodeChildren children; - - public ChildrenWrapper(T _wrap) - { - children = _wrap.getChildren(); - } - - @Override - public Iterator iterator() - { - IterableConverter.Converter converter = new IterableConverter.Converter(){ - @Override - public Node conv(T _b){ - return new NodeWrapper(_b); - } - }; - - - return new IterableConverter(children,converter).iterator(); - } - - @Override - public Either at(int _pos) - { - Either either = children.at(_pos); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - T target = either.b(); - Node newWrapper = new NodeWrapper(target); - - return DefaultEither.newB(newWrapper); - } - - @Override - public int size() - { - return children.size(); - } - } -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TraversableNodeWrapper.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TraversableNodeWrapper.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import java.util.Iterator; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.TraversableNode; -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.IterableConverter; - -public class TraversableNodeWrapper> - implements TraversableNode> -{ - private final T wrap; - - public TraversableNodeWrapper(T _wrap) - { - wrap = _wrap; - } - - public T getWrapped() - { - return wrap; - } - - @Override - public Children> getChildren() - { - final Children ch = wrap.getChildren(); - - return new Children>(){ - - final IterableConverter.Converter,T> converter = new IterableConverter.Converter,T>(){ - @Override - public TraversableNodeWrapper conv(T _b) - { - return new TraversableNodeWrapper(_b); - } - }; - - final IterableConverter,T> iterable = new IterableConverter,T>(ch,converter); - - @Override - public Iterator> iterator() - { - return iterable.iterator(); - } - - @Override - public int size() - { - return ch.size(); - } - - @Override - public Either> at(int _pos) - { - Either either = ch.at(_pos); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - T newWrap = either.b(); - return DefaultEither.newB(new TraversableNodeWrapper(newWrap)); - } - }; - } -}*/ diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java Tue Nov 25 17:52:41 2014 +0900 @@ -10,7 +10,7 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -public class LoggingChildren //implements EditableChildren +public class LoggingChildren { private final TreeNode wrap; private final OperationLog log; @@ -27,14 +27,6 @@ return children.size(); } - /* - @Override - public Iterator iterator() - { - LoggingChildren children = wrap.getChildren(); - return children.iterator(); - }*/ - public Either edit(NodeOperation _op) { Either either = _op.invoke(wrap); diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNodeHook.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNodeHook.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/*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.trasnformer.NodeEditor; -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 LoggingNodeHook implements NodeEditor -{ - private OperationLog log; - private final NodeEditor editor; - - public LoggingNodeHook(NodeEditor _editor) - { - log = null; - editor = _editor; - } - - @Override - public Either edit(TreeNode _e) - { - //LoggingNode loggingNode = new LoggingNode(_e); - Either either = editor.edit(_e); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - log = editor.getLog(); - return DefaultEither.newB(either.b()); - } - - public OperationLog getLog() - { - return log; - } -}*/ diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableAttributes.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableAttributes.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; - -import java.nio.ByteBuffer; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface EditableAttributes extends Attributes -{ - public Either delete(String _key); - public Either put(String _key,ByteBuffer _value); -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableChildren.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; - -public interface EditableChildren> extends Children -{ - public Either addNewChildAt(int _pos); - public Either deleteChildAt(int _pos); - - public final Error OUT_OF_RANGE = new DefaultError(); -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableNode.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainer; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent; - -public interface EditableNode> extends AttributesContainer , Parent -{ - public EditableAttributes getAttributes(); - public EditableChildren getChildren(); -} - -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java Tue Nov 25 17:52:41 2014 +0900 @@ -23,8 +23,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public class DefaultJungleTreeEditor implements JungleTreeEditor { @@ -32,29 +30,21 @@ private final TreeNode root; private final TreeEditor editor; private final TreeOperationLog log; - private final Index index; - private final ParentIndex parentIndex; -// public DefaultJungleTreeEditor(TreeNode root) -// { -// this(root,txManager,_editor,new DefaultTreeOperationLog()); -// } - public DefaultJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor, Index index,ParentIndex parentIndex) + public DefaultJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor) { - this(_root,_txManager,_editor,new DefaultTreeOperationLog(),index,parentIndex); + this(_root,_txManager,_editor,new DefaultTreeOperationLog()); } - public DefaultJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log, Index index,ParentIndex parentIndex) + public DefaultJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log) { 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) @@ -79,7 +69,7 @@ DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable,newLog.length()); TreeOperationLog newTreeOpLog = log.append(treeOperationLog); - JungleTreeEditor newEditor = new DefaultJungleTreeEditor(newNode,txManager,editor,newTreeOpLog,index,parentIndex); + JungleTreeEditor newEditor = new DefaultJungleTreeEditor(newNode,txManager,editor,newTreeOpLog); return DefaultEither.newB(newEditor); } @@ -120,32 +110,16 @@ @Override public Either success() { - Either either = txManager.commit(root,log,index,parentIndex); + Either either = txManager.commit(root,log); if(either.isA()){ return DefaultEither.newA(either.a()); } TransactionManager newTxManager = either.b(); - JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor(root,newTxManager,editor,index,parentIndex); + JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor(root,newTxManager,editor); return DefaultEither.newB(newTreeEditor); } - @Override - public String getID() - { - return txManager.getUUID(); - } - @Override - public String getRevision() - { - return Long.toString(txManager.getRevision()); - } - - @Override - public TreeNode getRoot() - { - return root; - } } diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java Tue Nov 25 17:52:41 2014 +0900 @@ -24,8 +24,7 @@ private final ChangeListWriter writer; private final String uuid; - public DefaultTransactionManager(ChangeListWriter _writer,TreeContext _tip, - AtomicReservableReference _repository,String _uuid) + public DefaultTransactionManager(ChangeListWriter _writer,TreeContext _tip, AtomicReservableReference _repository,String _uuid) { repository = _repository; tip = _tip; @@ -34,7 +33,7 @@ } @Override - public Either commit(TreeNode _newRoot,final TreeOperationLog _log, Index index,ParentIndex parentIndex) + public Either commit(TreeNode _newRoot,final TreeOperationLog _log) { ChangeSet cs = tip.getChangeSet(); long currentRevision = cs.revision(); @@ -57,7 +56,9 @@ }; - DefaultChangeSet newCs = new DefaultChangeSet(_newRoot,cs,list,uuid, _treeName, nextRevision,index,parentIndex); + Index nulIndex = new Index(); + ParentIndex nulParentIndex = new ParentIndex(); + DefaultChangeSet newCs = new DefaultChangeSet(_newRoot,cs,list,uuid, _treeName, nextRevision, nulIndex, nulParentIndex); DefaultTreeContext newContext = new DefaultTreeContext(_newRoot,newCs); @SuppressWarnings("rawtypes") diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java Tue Nov 25 17:52:41 2014 +0900 @@ -106,7 +106,6 @@ @Override public Either at(int _pos) { - System.out.println(children.length()); if(children.length() < _pos + 1){ return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); } diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,261 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; - -import java.nio.ByteBuffer; -import java.util.Iterator; - -import fj.P2; -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.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; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; -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.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; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; -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.IterableConverter; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.TreeMapOrd; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.DefaultIndexEditor; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.DeleteChildIndexEditor; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexEditor; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; - -public class IndexJungleTreeEditor implements JungleTreeEditor { - private final TransactionManager txManager; - private final TreeNode root; - private final TreeNode oldRoot; - private final IndexTreeEditor editor; - private final TreeOperationLog log; - private final TreeOperationLog tmpLog; - private Index index; - private ParentIndex parentIndex; - - public Index getIndex() { - return index; - } - - public IndexJungleTreeEditor(TreeNode _root, TreeNode oldRoot, TransactionManager _txManager, - IndexTreeEditor treeEditor, Index index, ParentIndex parentIndex) { - this(_root, oldRoot, _txManager, treeEditor, new DefaultTreeOperationLog(), new DefaultTreeOperationLog(), index, - parentIndex); - } - - public IndexJungleTreeEditor(TreeNode _root, TreeNode oldRoot, TransactionManager _txManager, - IndexTreeEditor treeEditor, TreeOperationLog log, Index index, ParentIndex parentIndex) { - this(_root, oldRoot, _txManager, treeEditor, log, new DefaultTreeOperationLog(), index, parentIndex); - } - - public IndexJungleTreeEditor(TreeNode newNode, TreeNode oldRoot, TransactionManager _txManager, - IndexTreeEditor _editor, TreeOperationLog _log, TreeOperationLog tmpLog, Index index, ParentIndex parentIndex) { - this.root = newNode; - this.oldRoot = oldRoot; - this.txManager = _txManager; - this.editor = _editor; - this.log = _log; - this.index = index; - this.parentIndex = parentIndex; - this.tmpLog = tmpLog; - } - - public 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 newTmpLog = tmpLog.append(treeOperationLog); - IndexJungleTreeEditor newIndexTreeEditor = new IndexJungleTreeEditor(newNode, oldRoot, txManager, this.editor, log, - newTmpLog, index, parentIndex); - return DefaultEither.newB(newIndexTreeEditor); - } - - @Override - public Either addNewChildAt(NodePath _path, int _pos) { - AppendChildAt appendChildAt = new AppendChildAt(_pos); - IndexEditor indexEditor = new DefaultIndexEditor(index); - 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, index); - 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); - IndexEditor indexEditor = new DefaultIndexEditor(index); - 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); - IndexEditor indexEditor = new DefaultIndexEditor(index); - Either either = _edit(_path, deleteAttribute, indexEditor); - Either newEither = DefaultEither.newB(either.b()); - return newEither; - } - - @Override - public Either edit(NodePath _path, NodeEditor _editor) { - IndexEditor indexEditor = new DefaultIndexEditor(index); - Either either = _edit(_path, _editor, indexEditor); - JungleTreeEditor editor = either.b(); - Either newEither = DefaultEither.newB(editor); - return newEither; - } - - @Override - public Either success() { - Pair newIndexPair = editIndex(tmpLog); - ParentIndex newParentIndex = newIndexPair.left(); - Index newIndex = newIndexPair.right(); - TreeOperationLog newLog = log.append(tmpLog); - Either either = txManager.commit(root, newLog, newIndex, newParentIndex); - if (either.isA()) { - return DefaultEither.newA(either.a()); - } - - TransactionManager newTxManager = either.b(); - JungleTreeEditor newTreeEditor = new IndexJungleTreeEditor(root, root, newTxManager, editor, index, parentIndex); - - return DefaultEither.newB(newTreeEditor); - } - - private Pair editIndex(TreeOperationLog tmpLog) { - TreeMap putParentNodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd); - TreeMap deleteParentNodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd); - - for (TreeOperation log : tmpLog) { - - NodePath targetNodePath = log.getNodePath(); - putParentNodeMap = getTargetNode(TreeMap.empty(TreeMapOrd.treeNodeOrd), root, targetNodePath); - deleteParentNodeMap = getTargetNode(TreeMap.empty(TreeMapOrd.treeNodeOrd), oldRoot, targetNodePath); - System.out.println(log.getNodePath().toString()); - } - - Pair indexPair = new Pair(parentIndex, index); - if (!deleteParentNodeMap.isEmpty()) - indexPair = deleteIndexAttribute(putParentNodeMap, indexPair); - - if (!putParentNodeMap.isEmpty()) - indexPair = putIndexAttribute(putParentNodeMap, indexPair); - - ParentIndex newParentIndex = indexPair.left(); - Index newIndex = indexPair.right(); - Pair newIndexPair = new Pair(newParentIndex, newIndex); - return newIndexPair; - } - - private Pair deleteIndexAttribute(TreeMap deleteParentNodeMap, - Pair indexPair) { - - Iterator> parentNodeIterator = deleteParentNodeMap.iterator(); - ParentIndex newParentIndex = indexPair.left(); - Index newIndex = indexPair.right(); - - for (; parentNodeIterator.hasNext();) { - TreeNode parentNode = parentNodeIterator.next()._1(); - newIndex = newIndex.deleteNodeAll(parentNode); - newParentIndex = newParentIndex.deleteAllChildren(parentNode); - } - - Pair newIndexPair = new Pair(newParentIndex, newIndex); - return newIndexPair; - } - - private Pair putIndexAttribute(TreeMap putParentNodeMap, - Pair indexPair) { - Iterator> parentNodeIterator = putParentNodeMap.iterator(); - ParentIndex newParentIndex = indexPair.left(); - Index newIndex = indexPair.right(); - - for (; parentNodeIterator.hasNext();) { - - TreeNode parentNode = parentNodeIterator.next()._1(); - newIndex = newIndex.putNodeAll(parentNode); - newParentIndex = newParentIndex.addAllChildren(parentNode); - - } - Pair newIndexPair = new Pair(newParentIndex, newIndex); - return newIndexPair; - } - - private TreeMap getTargetNode(TreeMap treeNodeMap, TreeNode node, - NodePath path) { - if (path.size() == 0) - return treeNodeMap; - - Pair pathNode = path.pop(); - - if (pathNode.left() == -1) { - TreeMap newTreeNodeMap = treeNodeMap.set(node, node); - return getTargetNode(newTreeNodeMap, node, pathNode.right()); - } - - Either either = node.getChildren().at(pathNode.left()); - if (either.isA()) - return treeNodeMap; - - TreeNode child = either.b(); - TreeMap newTreeNodeMap = treeNodeMap.set(child, child); - if (pathNode.right().size() == 0) - return newTreeNodeMap; - - return getTargetNode(newTreeNodeMap, child, pathNode.right()); - - } - - @Override - public String getID() { - return txManager.getUUID(); - } - - @Override - public String getRevision() { - return Long.toString(txManager.getRevision()); - } - - @Override - public TreeNode getRoot() { - return root; - } - -} \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java Tue Nov 25 17:52:41 2014 +0900 @@ -5,12 +5,10 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public interface TransactionManager { - public Either commit(TreeNode _newRoot,TreeOperationLog _log, Index index,ParentIndex parentIndex); + public Either commit(TreeNode _newRoot,TreeOperationLog _log); public String getUUID(); public long getRevision(); } diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java Tue Nov 25 17:52:41 2014 +0900 @@ -2,53 +2,101 @@ import java.util.Iterator; -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.store.NodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; 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.IndexManager; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public class InterfaceTraverser { - // InterfaceTraverser traverser; TreeNode node; Index index; + ParentIndex parentIndex; + boolean parentUpdateFlag; IndexManager indexManager; + boolean indexFlag; - public InterfaceTraverser(TreeNode _root, IndexManager indexManager) { - this.node = _root; - this.index = new Index(); - this.indexManager = indexManager; - } - - public InterfaceTraverser(TreeNode _root, Index index, - IndexManager indexManager) { + public InterfaceTraverser(TreeNode _root, Index index, ParentIndex parentIndex, IndexManager indexManager, + boolean indexFlag) { this.node = _root; this.index = index; this.indexManager = indexManager; - } - - public void commitIndex() { - indexManager.commit(index); + this.parentIndex = parentIndex; + if (parentIndex.isEmpty()) + parentUpdateFlag = true; + else + parentUpdateFlag = false; + this.indexFlag = indexFlag; } public Index getIndex() { return index; } + public void commit() { + parentUpdateFlag = false; + indexManager.commit(index, parentIndex); + } + + public ParentIndex getParentIndex() { + return parentIndex; + } + public void setIndex(Index index) { this.index = index; } + public Iterator emptyQuery() { + + 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(); + List keys = targetNode.getAttributes().getKeys(); + for (String key : keys) { + String value = targetNode.getAttributes().getString(key); + if (value != null) + index = index.set(key, value, targetNode); + if (parentUpdateFlag) + parentIndex = parentIndex.set(targetNode); + } + } + 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() { + } + + }; + + } + /** * subTree以下のNodeに対してKey,Valueのペアでindexを使って探索を行う * @@ -58,63 +106,60 @@ * @param searchValue * @return */ - public Iterator> findInSubTree(Query query, Pair subTree, String key, - String searchValue) { + public Iterator findInSubTree(Query query, TreeNode subTree, String key, String searchValue) { /* * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す */ - - if (index.get(key).isSome()) { + List nodeList = index.get(key, searchValue); + if (nodeList != null) { - TreeMap>> innerIndex = this.index.get(key).some(); - - Option>> opList = innerIndex.get(searchValue); + if (nodeList.isEmpty()) + return new NulIterator();// 空のIteratorを返す - if (opList.isNone()) - return new NulIterator>();// 空のIteratorを返す + // ここでNode以下にあるか調べる + List filteredList = List.nil(); - List> list = opList.some(); - NodePath targetNodePath = subTree.right(); - List> filteredList = List.nil(); - - for (Pair pair : list) { - NodePath compareNodePath = pair.right(); - if (targetNodePath.compare(compareNodePath)) - filteredList = filteredList.cons(pair); + for (TreeNode targetNode : nodeList) { + 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>() { + return new Iterator() { - private Pair matchPair = nextmatch(itNode); + private TreeNode matchNode = nextmatch(itNode); - private Pair nextmatch(PathNodeIterator itNode) { + private TreeNode nextmatch(PathNodeIterator itNode) { for (; itNode.hasNext();) { - Pair pathNode = itNode.next(); - if (query.condition(pathNode.left())) - return pathNode; + TreeNode targetNode = itNode.next(); + if (query.condition(targetNode)) + return targetNode; } return null; } @Override public boolean hasNext() { - if (matchPair == null) { + if (matchNode == null) { return false; } return true; } @Override - public Pair next() { - Pair currentPair = matchPair; - matchPair = nextmatch(itNode); - return currentPair; + public TreeNode next() { + TreeNode currentNode = matchNode; + matchNode = nextmatch(itNode); + return currentNode; } @Override @@ -134,50 +179,40 @@ * @param searchValue * @return */ - public Iterator> findInSubTreeAllValue(Query query, Pair subTree, - String key) { + public Iterator findInSubTreeAllValue(Query query, TreeNode subTree, String key) { /* * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得 * そのKeyを保有するNodeとNodeのPathを取得する * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す */ - - if (index.get(key).isSome()) { - - TreeMap>> innerIndex = this.index.get(key).some(); - List searchValues = innerIndex.keys(); - List> filteredList = List.nil(); - NodePath targetNodePath = subTree.right(); - - for (String searchValue : searchValues) { - Option>> opList = innerIndex.get(searchValue); - - if (opList.isNone()) - continue; - - List> list = opList.some(); - for (Pair pair : list) { - NodePath compareNodePath = pair.right(); - if (targetNodePath.compare(compareNodePath)) - filteredList = filteredList.cons(pair); - + Iterator NodeIterator = index.getAll(key); + if (NodeIterator != null) { + 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>() { + return new Iterator() { - private Pair matchPair = nextmatch(itNode); + private TreeNode matchPair = nextmatch(itNode); - private Pair nextmatch(PathNodeIterator itNode) { + private TreeNode nextmatch(PathNodeIterator itNode) { for (; itNode.hasNext();) { - Pair pathNode = itNode.next(); - if (query.condition(pathNode.left())) - return pathNode; + TreeNode targetNode = itNode.next(); + if (query.condition(targetNode)) + return targetNode; } return null; } @@ -191,9 +226,62 @@ } @Override - public Pair next() { - Pair currentPair = matchPair; + public TreeNode next() { + TreeNode currentNode = matchPair; matchPair = nextmatch(itNode); + return currentNode; + } + + @Override + public void remove() { + } + + }; + } + } + + public Iterator find(Query query, String key, String searchValue) { + + List nodeList = index.get(key, searchValue); + if (nodeList != null) { + return nodeList.iterator(); + } 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 (indexFlag) { + if (value != null) + index = index.set(key, value, targetNode); + } + if (parentUpdateFlag) + parentIndex = parentIndex.set(targetNode); + if (query.condition(targetNode)) + return targetNode; + } + 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; } @@ -205,179 +293,50 @@ } } - public Iterator> find(Query query, String key, String searchValue) { - - if (index.get(key).isSome()) { + public Iterator findAll(Query query, String key) { - TreeMap>> innerIndex = this.index.get(key).some(); - Option>> opList = innerIndex.get(searchValue); + Iterator nodeList = index.getAll(key); + if (nodeList != null) { - if (opList.isNone()) - return new NulIterator>();// 空のIteratorを返す - - final List> list = opList.some(); - return list.iterator(); + return nodeList; } else { - Pair pair = new Pair(node, new DefaultNodePath()); - final PathNodeIterator itNode = new PathNodeIterator(pair); - return new Iterator>() { + + final PathNodeIterator itNode = new PathNodeIterator(node); + return new Iterator() { - private Pair matchPair = nextmatch(itNode); + private TreeNode matchNode = nextmatch(itNode); - private Pair nextmatch(PathNodeIterator itNode) { + private TreeNode nextmatch(PathNodeIterator itNode) { for (; itNode.hasNext();) { - Pair pathNode = itNode.next(); - String value = pathNode.left().getAttributes().getString(key); - Option>>> innerIndexOp = index.get(key); - - if (value != null) { - if (innerIndexOp.isNone()) { - - TreeMap>> innerIndex = TreeMap.empty(Ord.stringOrd); - List> list = List.nil(); - list = list.cons(pathNode); - innerIndex = innerIndex.set(value, list); - index = index.set(key, innerIndex); - - } else { - - TreeMap>> innerIndex = innerIndexOp.some(); - Option>> opList = innerIndex.get(value); - - if (opList.isNone()) { - - List> list = List.nil(); - list = list.cons(pathNode); - innerIndex = innerIndex.set(value, list); - - } else { - - List> list = opList.some(); - list = list.cons(pathNode); - innerIndex = innerIndex.set(value, list); - - } - index = index.set(key, innerIndex); - - } + TreeNode targetNode = itNode.next(); + String value = targetNode.getAttributes().getString(key); + if (indexFlag) { + if (value != null) + index = index.set(key, value, targetNode); } - - if (query.condition(pathNode.left())) - return pathNode; + if (parentUpdateFlag) + parentIndex = parentIndex.set(targetNode); + if (query.condition(targetNode)) + return targetNode; } + commit(); return null; } @Override public boolean hasNext() { - if (matchPair == null) { - // index = itNode.getIndex(); + if (matchNode == null) { return false; } return true; } @Override - public Pair next() { - Pair currentPair = matchPair; - matchPair = nextmatch(itNode); - return currentPair; - } - - @Override - public void remove() { - } - - }; - } - } - - public Iterator> findAll(Query query, String key) { - - if (index.get(key).isSome()) { - - TreeMap>> innerIndex = this.index.get(key).some(); - List searchValues = innerIndex.keys(); - List> valueList = List.nil(); - - for (String searchValue : searchValues) { - Option>> opList = innerIndex.get(searchValue); - - if (opList.isNone()) - continue; - - List> list = opList.some(); - valueList = valueList.append(list); - } - return valueList.iterator(); - - } else { - Pair pair = new Pair(node, new DefaultNodePath()); - final PathNodeIterator itNode = new PathNodeIterator(pair); - return new Iterator>() { - - private Pair matchPair = nextmatch(itNode); - - private Pair nextmatch(PathNodeIterator itNode) { - - for (; itNode.hasNext();) { - Pair pathNode = itNode.next(); - String value = pathNode.left().getAttributes().getString(key); - Option>>> innerIndexOp = index.get(key); - - if (value != null) { - if (innerIndexOp.isNone()) { - - TreeMap>> innerIndex = TreeMap.empty(Ord.stringOrd); - List> list = List.nil(); - list = list.cons(pathNode); - innerIndex = innerIndex.set(value, list); - index = index.set(key, innerIndex); - - } else { - - TreeMap>> innerIndex = innerIndexOp.some(); - Option>> opList = innerIndex.get(value); - - if (opList.isNone()) { - - List> list = List.nil(); - list = list.cons(pathNode); - innerIndex = innerIndex.set(value, list); - - } else { - - List> list = opList.some(); - list = list.cons(pathNode); - innerIndex = innerIndex.set(value, list); - - } - index = index.set(key, innerIndex); - - } - } - - if (query.condition(pathNode.left())) - return pathNode; - } - return null; - } - - @Override - public boolean hasNext() { - if (matchPair == null) { - // index = itNode.getIndex(); - return false; - } - return true; - } - - @Override - public Pair next() { - Pair currentPair = matchPair; - matchPair = nextmatch(itNode); + public TreeNode next() { + TreeNode currentPair = matchNode; + matchNode = nextmatch(itNode); return currentPair; } diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Result.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Result.java Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Result.java Tue Nov 25 17:52:41 2014 +0900 @@ -2,7 +2,7 @@ public class Result { - // for traverser + public static final Result ACCEPT = new Result("ACCEPT"); public static final Result CONTINUE = new Result("CONTINUE"); public static final Result BREAK = new Result("BREAK"); diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traversable.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traversable.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface Traversable> -{ - public Either traverse(Evaluator _e); -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/TraversableChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/TraversableChildren.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -public interface TraversableChildren extends Iterable -{ - public int size(); -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/TraversableNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/TraversableNode.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent; - -public interface TraversableNode extends Parent -{ -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/IterableWrapper.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/IterableWrapper.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; - -import java.util.Iterator; - -public class IterableWrapper implements Iterable -{ - private final Iterable iterable; - - public IterableWrapper(Iterable _iterable) - { - iterable = _iterable; - } - - @Override - public Iterator iterator() - { - return new IteratorWrapper(); - } - - public class IteratorWrapper implements Iterator - { - private final Iterator iterator; - - public IteratorWrapper() - { - iterator = iterable.iterator(); - } - - @Override - public boolean hasNext() - { - return iterator.hasNext(); - } - - @Override - public T next() - { - return iterator.next(); - } - - @Override - public void remove() - { - iterator.remove(); - } - } -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/TraversableWrapper.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/TraversableWrapper.java Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.TraversableNode; - -public class TraversableWrapper implements TraversableNode> -{ - - @Override - public Children> getChildren() - { - return null; - } - -} -*/ \ No newline at end of file diff -r 8a0aa8fc137c -r 20af7f25ef32 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java Tue Nov 25 17:52:41 2014 +0900 @@ -3,14 +3,11 @@ import java.util.Iterator; import java.util.Stack; -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.store.impl.TreeNodeChildren; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; -public class PathNodeIterator implements Iterator> { +public class PathNodeIterator implements Iterator { - NodePath path; TreeNode root; TreeNode node; int childNumber; @@ -24,10 +21,9 @@ * otherwise traverse tree and create index * * */ - public PathNodeIterator(Pair pair) { - this.root = pair.left(); - path = pair.right(); - node = root; + public PathNodeIterator(TreeNode root) { + this.root = root; + this.node = root; } @Override @@ -36,13 +32,10 @@ } @Override - public Pair next() { + public TreeNode next() { TreeNode now = node; - NodePath currentPath = path; - // System.out.println("path = " + currentPath.toString()); if (node.getChildren().size() > 0) { // nodeStack.push(node); - path = path.add(0); children = node.getChildren(); node = children.at(0).b(); childNumber = 1; @@ -50,14 +43,12 @@ } else if (node == root) { node = null; // no more node children = null; - return new Pair(now, currentPath); + return now; }else if (children != null && children.size() > childNumber) { childNumber = searchStack.pop(); node = children.at(childNumber).b(); - path = path.tail().add(childNumber); searchStack.push(++childNumber); } else { - path = path.tail(); node = nodeStack.pop(); children = node.getChildren(); childNumber = searchStack.pop(); @@ -65,21 +56,19 @@ if (node == root) { node = null; // no more node children = null; - return new Pair(now, currentPath); + return now; } - path = path.tail(); node = nodeStack.pop(); children = node.getChildren(); childNumber = searchStack.pop(); } if (node != null && childNumber < children.size()) { - path = path.add(childNumber); nodeStack.push(node); node = children.at(childNumber).b(); searchStack.push(++childNumber); } } - return new Pair(now, currentPath); + return now; } @Override diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; - - -import fj.Ord; -import fj.data.List; -import fj.data.TreeMap; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; - -public class AddNewChildrenIndexEditor implements IndexEditor { - - NodePath editNodePath; - - public AddNewChildrenIndexEditor(int pos, NodePath path) { - this.editNodePath = path.add(pos); - } - - @Override - public Either edit( - TreeNode root, - TransactionManager txManager, - TreeEditor editor, - TreeOperationLog log, - TreeMap>> index) { - - TreeMap>> newIndex = editIndex(index); - IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root, txManager, editor, newIndex); - return DefaultEither.newB(newEditor); - } - - public TreeMap>> editIndex( - TreeMap>> index) { - - if (!index.isEmpty()) { - List keyList = index.keys(); - TreeMap>> newIndex = TreeMap.empty(Ord.stringOrd); - TreeMap> newInnerIndex = TreeMap.empty(Ord.stringOrd); - - for (String indexKey : keyList) { - TreeMap> innerIndex = index.get(indexKey).some(); - List innerIndexKeyList = innerIndex.keys(); - - for (String innerIndexKey : innerIndexKeyList) { - List pairList = innerIndex.get(innerIndexKey).some(); - List list = checkPath(pairList); - if (!list.isEmpty()){ - //System.out.println(new String(list.head().left().getAttributes().get("KEY").array())); - newInnerIndex = newInnerIndex.set(innerIndexKey, list); - } - } - newIndex = newIndex.set(indexKey, newInnerIndex); - } - return newIndex; - } else { - return index; - } - } - - public List checkPath(List pairList){ - - List list = List.nil(); - for (NodePath path : pairList) { - - - //System.out.println("oldPath = " + path.toString()); - NodePath newPath = new DefaultNodePath(); - - - if (editNodePath.size() > path.size()) { - list = list.cons(path); - continue; - } - - Pair editNodePathCopy = editNodePath.pop(); - int loopCount = 0; - - for (Integer pathInt : path) { - loopCount++; - - if (pathInt == -1) - continue; - - if (editNodePathCopy.right().size() > 0) { - editNodePathCopy = editNodePathCopy.right().pop(); - - if (loopCount == editNodePath.size() && editNodePathCopy.left() <= pathInt) { - newPath = newPath.add(pathInt + 1); - continue; - } - - if (!(editNodePathCopy.left() == pathInt)) { - newPath = path; - break; - } - } - - newPath = newPath.add(pathInt); - - } - - //System.out.println("newPath = " + newPath.toString()); - list = list.cons(path); - } - - return list; - } - -} diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; - -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 fj.Ord; -import fj.data.List; -import fj.data.Option; -import fj.data.TreeMap; - -public class DefaultIndexEditor implements IndexEditor { - - Index index; - - public DefaultIndexEditor(Index index) { - this.index = index; - } - - @Override - public IndexEditor delete(TreeNode node) { - TreeNodeAttributes attribute = node.getAttributes(); - List keys = attribute.getKeys(); - Index newIndexTreeMap = index; - for (String key : keys) { - Option>> indexOp = index.get(key); - if (indexOp.isSome()) { - TreeMap> index = indexOp.some(); - String value = attribute.getString(key); - Option> nodeListOp = index.get(value); - if (nodeListOp.isSome()) { - List nodeList = nodeListOp.some(); - List newNodeList = List.nil(); - for (TreeNode indexingNode : nodeList) { - if (indexingNode != node) - newNodeList = newNodeList.cons(indexingNode); - } - TreeMap> newIndex; - newIndex = index.set(value, newNodeList); - newIndexTreeMap = newIndexTreeMap.set(key, newIndex); - } - - } - } - - return new DefaultIndexEditor(newIndexTreeMap); - } - - @Override - public IndexEditor add(TreeNode node) { - TreeNodeAttributes attribute = node.getAttributes(); - List keys = attribute.getKeys(); - TreeMap>> newIndexTreeMap = index; - for (String key : keys) { - Option>> indexOp = index.get(key); - if (indexOp.isSome()) { - TreeMap> index = indexOp.some(); - String value = attribute.getString(key); - Option> nodeListOp = index.get(value); - if (nodeListOp.isSome()) { - List nodeList = nodeListOp.some(); - List newNodeList = nodeList.cons(node); - TreeMap> newIndex = index.set(value, newNodeList); - newIndexTreeMap = newIndexTreeMap.set(key, newIndex); - } else { // test - List nodeList = List.nil(); - value = attribute.getString(key); - List newNodeList = nodeList.cons(node); - TreeMap> newIndex = index.set(value, newNodeList); - newIndexTreeMap = newIndexTreeMap.set(key, newIndex); - } - - } else { // test - TreeMap> index = TreeMap.empty(Ord.stringOrd); - List nodeList = List.nil(); - String value = attribute.getString(key); - List newNodeList = nodeList.cons(node); - TreeMap> newIndex = index.set(value, newNodeList); - newIndexTreeMap = newIndexTreeMap.set(key, newIndex); - } - } - - return new DefaultIndexEditor(newIndexTreeMap); - } - - @Override - public TreeMap>> getIndex() { - return index; - } - - @Override - public IndexEditor edit(TreeNode node) { - return this; - } - -} diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; - -import fj.Ord; -import fj.data.List; -import fj.data.Option; -import fj.data.TreeMap; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.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.util.Pair; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIterator; - -public class DeleteChildIndexEditor implements IndexEditor { - - Index index; - int pos; - - public DeleteChildIndexEditor(int pos, Index index) { - this.index = index; - this.pos = pos; - } - - @Override - public IndexEditor delete(TreeNode node) { - TreeNodeAttributes attribute = node.getAttributes(); - List keys = attribute.getKeys(); - TreeMap>> newIndexTreeMap = index; - for (String key : keys) { - Option>> indexOp = index.get(key); - if (indexOp.isSome()) { - TreeMap> index = indexOp.some(); - String value = attribute.getString(key); - Option> nodeListOp = index.get(value); - if (nodeListOp.isSome()) { - List nodeList = nodeListOp.some(); - List newNodeList = List.nil(); - for (TreeNode indexingNode : nodeList) { - if (indexingNode != node) - newNodeList = newNodeList.cons(indexingNode); - } - TreeMap> newIndex; - newIndex = index.set(value, newNodeList); - newIndexTreeMap = newIndexTreeMap.set(key, newIndex); - } - - } - } - - return new DefaultIndexEditor(newIndexTreeMap); - } - - @Override - public IndexEditor add(TreeNode node) { - TreeNodeAttributes attribute = node.getAttributes(); - List keys = attribute.getKeys(); - TreeMap>> newIndexTreeMap = index; - for (String key : keys) { - Option>> indexOp = index.get(key); - if (indexOp.isSome()) { - TreeMap> index = indexOp.some(); - String value = attribute.getString(key); - Option> nodeListOp = index.get(value); - if (nodeListOp.isSome()) { - List nodeList = nodeListOp.some(); - List newNodeList = nodeList.cons(node); - TreeMap> newIndex = index.set(value, newNodeList); - newIndexTreeMap = newIndexTreeMap.set(key, newIndex); - } else { // test - List nodeList = List.nil(); - value = attribute.getString(key); - List newNodeList = nodeList.cons(node); - TreeMap> newIndex = index.set(value, newNodeList); - newIndexTreeMap = newIndexTreeMap.set(key, newIndex); - } - - } else { // test - TreeMap> index = TreeMap.empty(Ord.stringOrd); - List nodeList = List.nil(); - String value = attribute.getString(key); - List newNodeList = nodeList.cons(node); - TreeMap> newIndex = index.set(value, newNodeList); - newIndexTreeMap = newIndexTreeMap.set(key, newIndex); - } - } - - return new DefaultIndexEditor(newIndexTreeMap); - } - - @Override - public TreeMap>> getIndex() { - return index; - } - - @Override - public IndexEditor edit(TreeNode node) { - PathNodeIterator nodeSearcher = new PathNodeIterator(new Pair(node, new DefaultNodePath())); - TreeMap>> newIndexTreeMap = index; - - for (; nodeSearcher.hasNext();) { - TreeNode deleteNode = nodeSearcher.next().left(); - TreeNodeAttributes attribute = deleteNode.getAttributes(); - List keys = attribute.getKeys(); - for (String key : keys) { - Option>> indexOp = newIndexTreeMap.get(key); - if (indexOp.isSome()) { - TreeMap> index = indexOp.some(); - String value = attribute.getString(key); - Option> nodeListOp = index.get(value); - if (nodeListOp.isSome()) { - List nodeList = nodeListOp.some(); - List newNodeList = List.nil(); - for (TreeNode indexingNode : nodeList) { - if (indexingNode != deleteNode) - newNodeList = newNodeList.cons(indexingNode); - } - TreeMap> newIndex = index.set(value, newNodeList); - newIndexTreeMap = newIndexTreeMap.set(key, newIndex); - } - - } - } - } - return null; - } - -} diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; - -import java.nio.ByteBuffer; -import java.util.Iterator; - -import fj.data.List; -import fj.data.Option; -import fj.data.TreeMap; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; - -public class DeleteIndexEditor implements IndexEditor { - - String key; - String pathString; - NodePath path; - TreeNode node; - - public DeleteIndexEditor(String key, NodePath path, TreeNode node) { - this.key = key; - this.pathString = path.toString(); - this.path = path; - this.node = node; - } - - @Override - public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>> index) { - NodePath newPath = path.pop().right(); - TreeNode target = getTarget(node, newPath); - TreeMap>> newIndex = index; - Iterator attributeIterator = target.getAttributes().getString(key); - for (;attributeIterator.hasNext();){ - String attribute = attributeIterator.next(); - newIndex = editIndex(attribute, newIndex); - } - IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex); - Either either = DefaultEither.newB(newEditor); - return either; - } - - public TreeMap>> editIndex(String attribute, TreeMap>> index){ - - Option>> innerIndexOp = index.get(key); - - if (innerIndexOp.isSome()) { - TreeMap> innerIndex = innerIndexOp.some(); - Option> listOp = innerIndex.get(attribute); - - if (listOp.isSome()) { - List list = listOp.some(); - List newList = List.nil(); - - for (NodePath path : list){ - if (!path.toString().equals(pathString)) { - newList = newList.cons(path); - } - } - - if (newList.isEmpty()) { - TreeMap> newInnerIndex = innerIndex.delete(attribute); - - if (newInnerIndex.isEmpty()) { - TreeMap>> newIndex = index.delete(key); - return newIndex; - } - - TreeMap>> newIndex = index.set(key, newInnerIndex); - return newIndex; - } - - TreeMap> newInnerIndex = innerIndex.set(attribute,newList); - TreeMap>> newIndex = index.set(key, newInnerIndex); - return newIndex; - - } else { - return index; - } - } else { - return index; - } - } - - public TreeNode getTarget(TreeNode node , NodePath path){ - Pair pathNode = path.pop(); - Either either = node.getChildren().at(pathNode.left()); - if (either.isA()) - return node; - - TreeNode child = either.b(); - if (pathNode.right().size() == 0) - return child; - - TreeNode target = getTarget(child,pathNode.right()); - return target; - } - - -} diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/Index.java Tue Nov 25 17:52:41 2014 +0900 @@ -2,6 +2,7 @@ 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 fj.Ord; import fj.P2; @@ -27,8 +28,16 @@ public Index set(String key, String value, TreeNode node) { Option>> indexOp = indexList.get(key); - if (indexOp.isNone()) - return this; + if (indexOp.isNone()) { + TreeMap> index = TreeMap.empty(Ord.stringOrd); + List nodeList = List.nil(); + List newNodeList = nodeList.cons(node); + TreeMap> newIndex = index.set(value, newNodeList); + TreeMap>> newIndexList = indexList.set(key, newIndex); + + + return new Index(newIndexList); + } TreeMap> index = indexOp.some(); Option> nodeListOp = index.get(value); @@ -43,101 +52,42 @@ } TreeMap> newIndex = index.set(value, newNodeList); TreeMap>> newIndexList = indexList.set(key, newIndex); - return new Index(newIndexList); - } - - 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 Index deleteNodeAll(TreeNode node) { - List keys = node.getAttributes().getKeys(); - TreeMap>> newIndexList = indexList; - - for (String key : keys) { - Option>> indexOp = indexList.get(key); - if (indexOp.isNone()) - continue; - - TreeMap> index = indexOp.some(); - Iterator>> indexIterator = index.iterator(); - - TreeMap> newIndex = index; - for (; indexIterator.hasNext();) { - List newNodeList = List.nil(); - P2> NodeListP2 = indexIterator.next(); - String value = NodeListP2._1(); - List targetNodeList = NodeListP2._2(); - for (TreeNode targetNode : targetNodeList) { - if (!node.equals(targetNode)) - newNodeList = newNodeList.cons(targetNode); - } - newIndex = newIndex.set(value, newNodeList); - } - newIndexList = indexList.set(key, newIndex); - } return new Index(newIndexList); } + + +// 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 Index putNodeAll(TreeNode node) { - List keys = node.getAttributes().getKeys(); - TreeMap>> newIndexList = indexList; - - for (String key : keys) { - - String value = node.getAttributes().getString(key); - if (value == null) - continue; - - Option>> indexOp = indexList.get(key); - if (indexOp.isNone()) - continue; - TreeMap> index = indexOp.some(); - Option> nodeListOp = index.get(value); - TreeMap> newIndex = index; - - if (nodeListOp.isNone()) { - List newNodeList = List.nil(); - newNodeList = newNodeList.cons(node); - newIndex = newIndex.set(value, newNodeList); - } else { - List newNodeList = nodeListOp.some(); - newNodeList = newNodeList.cons(node); - newIndex = newIndex.set(value, newNodeList); - } - - newIndexList = newIndexList.set(key, newIndex); - } - return new Index(newIndexList); - } - public List get(String key, String value) { + Option>> indexOp = indexList.get(key); if (indexOp.isNone()) - return List.nil(); + return null; TreeMap> index = indexOp.some(); Option> nodeListOp = index.get(value); @@ -148,6 +98,49 @@ return nodeListOp.some(); } + public Iterator getAll(String key){ + + Option>> indexOp = indexList.get(key); + if (indexOp.isNone()) + return null; + + TreeMap> index = indexOp.some(); + if (!index.isEmpty()) + return new NulIterator(); + + + return new Iterator(){ + + Iterator>> treeMapIterator = index.iterator(); + List nodeList = List.nil(); + TreeNode node; + + @Override + public boolean hasNext() { + + if (nodeList.isNotEmpty()) { + node = nodeList.head(); + nodeList = nodeList.tail(); + return true; + } + + for (;treeMapIterator.hasNext();) { + nodeList = treeMapIterator.next()._2(); + node = nodeList.head(); + nodeList = nodeList.tail(); + return true; + } + return false; + } + + @Override + public TreeNode next() { + return node; + } + + }; + + } private TreeMap>> getIndex() { return indexList; diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; - -import fj.data.List; -import fj.data.TreeMap; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; - - -public interface IndexEditor { - public IndexEditor add(TreeNode node); - public IndexEditor delete(TreeNode node); - public IndexEditor edit(TreeNode node); - public TreeMap>> getIndex(); -} diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexManager.java Tue Nov 25 17:52:41 2014 +0900 @@ -18,7 +18,7 @@ this.reservation = reservation; } - public void commit(Index index){ + public void commit(Index index, ParentIndex parentIndex){ TreeContext tc = reservation.get(); ChangeSet cs = tc.getChangeSet(); TreeNode root = cs.getRoot(); @@ -27,8 +27,8 @@ String uuid = cs.uuid(); String treeName = cs.getTreeName(); long revision = cs.revision(); - ParentIndex parentIndex = cs.getParentIndex(); - DefaultChangeSet newCs = new DefaultChangeSet(root, prev, cl, uuid, treeName, revision, index, parentIndex); + index.get("KER", "value"); + DefaultChangeSet newCs = new DefaultChangeSet(root, prev, cl, uuid, treeName, revision, index, parentIndex); DefaultTreeContext newTs = new DefaultTreeContext(root, newCs); reservation.set(newTs); } diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java Tue Nov 25 17:52:41 2014 +0900 @@ -2,6 +2,7 @@ import java.util.Iterator; + 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; @@ -9,7 +10,7 @@ import fj.data.TreeMap; public class ParentIndex { - + private final TreeMap parentIndex; public ParentIndex() { @@ -19,28 +20,38 @@ public ParentIndex(TreeMap parentIndex) { this.parentIndex = parentIndex; } - + + public boolean isEmpty(){ + return parentIndex.isEmpty(); + } public ParentIndex(ParentIndex parentIndex) { this.parentIndex = parentIndex.getParentIndex(); } - private TreeMap getParentIndex() { + public TreeMap getParentIndex() { return parentIndex; } - public Option get(TreeNode child) { + public TreeNode get(TreeNode child) { Option parentOp = parentIndex.get(child); - return parentOp; + if (parentOp.isSome()) + return parentOp.some(); + return null; } - - public ParentIndex set(TreeNode child, TreeNode parent){ - TreeMap newParentIndex = parentIndex.set(child,parent); + + public ParentIndex set(TreeNode parent) { + Iterator childrenIterator = parent.getChildren().iterator(); + TreeMap newParentIndex = parentIndex; + for (; childrenIterator.hasNext();) { + TreeNode child = childrenIterator.next(); + newParentIndex = newParentIndex.set(child, parent); + } return new ParentIndex(newParentIndex); } - + public ParentIndex delete(TreeNode child) { TreeMap newParentIndex = parentIndex.delete(child); - return new ParentIndex(newParentIndex); + return new ParentIndex(newParentIndex); } public ParentIndex deleteAllChildren(TreeNode parentNode) { diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; - - - -import fj.Ord; -import fj.data.List; -import fj.data.Option; -import fj.data.TreeMap; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -import java.nio.ByteBuffer; - -public class PutIndexEditor implements IndexEditor { - - String key; - String attribute; - NodePath path; - TransactionManager txManager; - TreeNode root; - TreeEditor editor; - TreeOperationLog log; - - public PutIndexEditor(String key, ByteBuffer attribute,NodePath path) { - this.key = key; - this.attribute = new String(attribute.array()); - this.path = path; - } - - @Override - public Either edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap>> index) { - TreeMap>> newIndex = editIndex(path, key, attribute,index); - IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex); - Either either = DefaultEither.newB(newEditor); - return either; - } - - public TreeMap>> editIndex(NodePath path, String key, String attribute,TreeMap>> index){ - - Option>> innerIndexOp = index.get(key); - - if (attribute != null) { - if (innerIndexOp.isNone()) { - - TreeMap> innerIndex = TreeMap.empty(Ord.stringOrd); - List list = List.nil(); - list = list.cons(path); - innerIndex = innerIndex.set(attribute, list); - TreeMap>> newIndex = index.set(key, innerIndex); - return newIndex; - } else { - - TreeMap> innerIndex = innerIndexOp.some(); - - Option> opList = innerIndex.get(attribute); - - if (opList.isNone()) { - - List list = List.nil(); - list = list.cons(path); - innerIndex = innerIndex.set(attribute, list); - - } else { - - List list = opList.some(); - list = list.cons(path); - innerIndex = innerIndex.set(attribute, list); - - } - TreeMap>> newIndex = index.set(key, innerIndex); - return newIndex; - } - } - return index; - } - -// public TreeNode getTarget(TreeNode node , NodePath path){ -// Pair path = path.pop(); -// Either either = node.getChildren().at(path.left()); -// if (either.isA()) -// return node; -// -// TreeNode child = either.b(); -// if (path.right().size() == 0) -// return child; -// -// TreeNode target = getTarget(child,path.right()); -// return target; -// } - -} diff -r 8a0aa8fc137c -r 20af7f25ef32 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 Sat Nov 22 15:25:09 2014 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexCommitTest.java Tue Nov 25 17:52:41 2014 +0900 @@ -18,6 +18,7 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; import junit.framework.Assert; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; import java.nio.ByteBuffer; @@ -32,7 +33,7 @@ @Test public void IndexCommitTest() throws InterruptedException { - Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTraverser()); + Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTreeEditor(new DefaultTraverser())); jungle.createNewTree("tree"); JungleTree tree = jungle.getTreeByName("tree"); createTree(tree); @@ -51,41 +52,40 @@ }, key, "<-1,0,1>"); //check index - TreeMap>>> index = ifTraverser.getIndex(); - Option>>> opIndex = index.get(key); - Assert.assertTrue(!opIndex.isNone()); - TreeMap>> innerIndex = opIndex.some(); - Assert.assertTrue(!innerIndex.get("<-1,0,0>").isNone()); + Index index = ifTraverser.getIndex(); + index.get(key,"<-1,0,1>"); + ifTraverser.commit(); + JungleTree newTree = jungle.getTreeByName("tree"); + InterfaceTraverser newIfTraverser = newTree.getTraverser(); + Index newIndex = newIfTraverser.getIndex(); + newIndex.get(key,"<-1,0,1>"); JungleTreeEditor editor = tree.getTreeEditor(); Either either = editor.addNewChildAt(new DefaultNodePath(), 0); editor = either.b(); editor.success(); - ifTraverser.commitIndex(); - JungleTree newTree = jungle.getTreeByName("tree"); - InterfaceTraverser newIfTraverser = newTree.getTraverser(); - TreeMap>>> newIndex = newIfTraverser.getIndex(); - Assert.assertTrue(newIndex.isEmpty()); - - InterfaceTraverser ifTraverser1= tree.getTraverser(); - - ifTraverser1.find((TreeNode node) -> { - ByteBuffer attribute = node.getAttributes().get(key); - if (attribute != null) { - byte[] byteAttribute = attribute.array(); - String str = new String(byteAttribute); - System.out.println("attribute = " + str); - return str.equals("<-1,0,1>"); - } - return false; - }, key, "<-1,0,1>"); - - ifTraverser1.commitIndex(); - JungleTree newTree2 = jungle.getTreeByName("tree"); - InterfaceTraverser newIfTraverser2 = newTree2.getTraverser(); - TreeMap>>> newIndex1 = newIfTraverser2.getIndex(); - Assert.assertFalse(newIndex1.isEmpty()); + ifTraverser.commit(); +// Assert.assertTrue(newIndex.isEmpty()); +// +// InterfaceTraverser ifTraverser1= tree.getTraverser(); +// +// ifTraverser1.find((TreeNode node) -> { +// ByteBuffer attribute = node.getAttributes().get(key); +// if (attribute != null) { +// byte[] byteAttribute = attribute.array(); +// String str = new String(byteAttribute); +// System.out.println("attribute = " + str); +// return str.equals("<-1,0,1>"); +// } +// return false; +// }, key, "<-1,0,1>"); +// +// ifTraverser1.commit(); +// JungleTree newTree2 = jungle.getTreeByName("tree"); +// InterfaceTraverser newIfTraverser2 = newTree2.getTraverser(); +// TreeMap>>> newIndex1 = newIfTraverser2.getIndex(); +// Assert.assertFalse(newIndex1.isEmpty()); }