Mercurial > hg > Members > tatsuki > bench > jungle-core
changeset 106:3e75124550e9
Merge with 3d88bad21bc47e3a624f09ca6badbb5508a744aa
author | one |
---|---|
date | Fri, 12 Sep 2014 19:49:00 +0900 |
parents | 78ef456c98a0 (diff) 3d88bad21bc4 (current diff) |
children | 5b7e45464bb8 69bbf08894aa |
files | src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java |
diffstat | 41 files changed, 777 insertions(+), 167 deletions(-) [+] |
line wrap: on
line diff
--- a/document/JungleMindmap.mm Thu Sep 11 18:02:26 2014 +0900 +++ b/document/JungleMindmap.mm Fri Sep 12 19:49:00 2014 +0900 @@ -91,7 +91,7 @@ <node CREATED="1409913383955" ID="ID_653968339" MODIFIED="1409913399484" TEXT="誰が検索したかを保存するAPI"/> </node> <node CREATED="1409906099431" HGAP="22" ID="ID_1697852268" MODIFIED="1409906130605" TEXT="indexをつける" VSHIFT="50"> -<node CREATED="1409906161185" HGAP="18" ID="ID_37822884" MODIFIED="1409912675141" TEXT="KeyとNodeのHashMapとAttribute"name"のHashMapを登録する" VSHIFT="-10"/> +<node CREATED="1409906161185" HGAP="18" ID="ID_37822884" MODIFIED="1410373602707" TEXT="KeyとNodeのHashMapとkeyとAttributeのHashMapを登録する" VSHIFT="-10"/> <node CREATED="1409906200281" HGAP="21" ID="ID_957989771" MODIFIED="1409906786182" TEXT="各version毎にindeがある" VSHIFT="-14"/> <node CREATED="1409906235377" HGAP="18" ID="ID_1286646129" MODIFIED="1409906798789" TEXT="indexはfjのTreeHashMapを使う" VSHIFT="-3"> <node CREATED="1409912676387" ID="ID_1944162611" MODIFIED="1409912716086" TEXT="非破壊のindexを使いたい"/>
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java Fri Sep 12 19:49:00 2014 +0900 @@ -21,7 +21,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; public class DefaultJungle implements Jungle { @@ -30,7 +29,7 @@ private String uuid; private TreeEditor editor; - public static void main(String _args[]) + public static void main(String args[]) { DefaultJungle j = new DefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser())); JungleTree t = j.createNewTree("fuga"); @@ -47,22 +46,22 @@ e1.success(); } - public DefaultJungle(Journal _journal,String _uuid,TreeEditor _editor) + public DefaultJungle(Journal journal,String uuid,TreeEditor editor) { - journal = new NullJournal(); - trees = new ConcurrentHashMap<String,JungleTree>(); - uuid = _uuid; - editor = _editor; + this.journal = new NullJournal(); + this.trees = new ConcurrentHashMap<String,JungleTree>(); + this.uuid = uuid; + this.editor = editor; } @Override - public JungleTree getTreeByName(String _name) + public JungleTree getTreeByName(String name) { - return trees.get(_name); + return trees.get(name); } @Override - public JungleTree createNewTree(final String _name) + public JungleTree createNewTree(final String name) { ChangeList list = new ChangeList(){ @Override @@ -76,17 +75,16 @@ } @Override public String getTreeName() { - return _name; + return name; } }; DefaultTreeNode root = new DefaultTreeNode(); - ChangeSet set = new DefaultChangeSet(root,null,list,uuid,_name,0,null); + TreeMap<String,List<TreeNode>> index = TreeMap.empty(Ord.stringOrd); + ChangeSet set = new DefaultChangeSet(root,null,list,uuid,name,0,index); DefaultTreeContext tc = new DefaultTreeContext(root,set); - TreeMap<String, String> attributeIndex = TreeMap.empty(Ord.stringOrd); - TreeMap<String,TreeNode> nodeIndex = TreeMap.empty(Ord.stringOrd); - JungleTree newTree = new DefaultJungleTree(tc,uuid,journal.getWriter(),editor , new Pair<TreeMap<String,TreeNode>,TreeMap<String,String>>(nodeIndex, attributeIndex)); - if(trees.putIfAbsent(_name,newTree) != null){ + JungleTree newTree = new DefaultJungleTree(tc,uuid,journal.getWriter(),editor); + if(trees.putIfAbsent(name,newTree) != null){ return null; } return newTree;
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,17 +1,17 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; -import fj.data.HashMap; +import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleIndexTreeEditor; 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.TreeContext; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; public class DefaultJungleTree implements JungleTree @@ -20,14 +20,13 @@ private final String uuid; private final ChangeListWriter writer; private final TreeEditor editor; - Pair<TreeMap<String,TreeNode>,TreeMap<String,String>> index; - public DefaultJungleTree(TreeContext _tc,String _uuid,ChangeListWriter _writer,TreeEditor _editor, Pair<TreeMap<String,TreeNode>,TreeMap<String,String>> index) + + public DefaultJungleTree(TreeContext tc,String uuid,ChangeListWriter writer,TreeEditor editor) { - this.repository = new AtomicReservableReference<TreeContext>(_tc); - this.uuid = _uuid; - this.writer = _writer; - this.editor = _editor; - this.index = index; + this.repository = new AtomicReservableReference<TreeContext>(tc); + this.uuid = uuid; + this.writer = writer; + this.editor = editor; } @Override @@ -36,8 +35,20 @@ TreeContext tc = repository.get(); DefaultTransactionManager txManager = new DefaultTransactionManager(writer,tc,repository,uuid); TreeNode root = tc.getTreeNode(); - return new DefaultJungleTreeEditor(root,txManager,editor, index); + return new DefaultJungleTreeEditor(root,txManager,editor); } + + @Override + public JungleTreeEditor getIndexTreeEditor() + { + TreeContext tc = repository.get(); + DefaultTransactionManager txManager = new DefaultTransactionManager(writer,tc,repository,uuid); + TreeNode root = tc.getTreeNode(); + ChangeSet cs = tc.getChangeSet(); + TreeMap<String,List<TreeNode>> newIndex = cs.getIndex(); + return new DefaultJungleIndexTreeEditor(root,txManager,editor,newIndex); + } + @Override public JungleTreeEditor getLocalTreeEditor() @@ -55,11 +66,15 @@ @Override public InterfaceTraverser getTraverser() { - return new InterfaceTraverser(getRootNode(), index, getTreeEditor()); + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return new InterfaceTraverser(getRootNode(), cs.getIndex(), getTreeEditor()); } @Override - public Pair<TreeMap<String,TreeNode>,TreeMap<String,String>> getIndex() { - return index; + public TreeMap<String,TreeMap<String, TreeNode>> getIndex() { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getIndex(); } }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/Jungle.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/Jungle.java Fri Sep 12 19:49:00 2014 +0900 @@ -3,6 +3,6 @@ public interface Jungle { - public JungleTree getTreeByName(String _name); - public JungleTree createNewTree(String _name); + public JungleTree getTreeByName(String name); + public JungleTree createNewTree(String name); }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,10 +1,10 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; +import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; public interface JungleTree { @@ -12,5 +12,6 @@ public InterfaceTraverser getTraverser(); public JungleTreeEditor getLocalTreeEditor(); public TreeNode getRootNode(); - public Pair<TreeMap<String,TreeNode>,TreeMap<String,String>> getIndex(); + public TreeMap<String,TreeMap<String, TreeNode>> getIndex(); + public JungleTreeEditor getIndexTreeEditor(); }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java Fri Sep 12 19:49:00 2014 +0900 @@ -13,11 +13,11 @@ { public TreeNode getRoot(); - public Either<Error,JungleTreeEditor> addNewChildAt(NodePath _path,int _pos); - public Either<Error,JungleTreeEditor> deleteChildAt(NodePath _path,int _pos); - public Either<Error,JungleTreeEditor> putAttribute(NodePath _path,String _key,ByteBuffer _value); - public Either<Error,JungleTreeEditor> deleteAttribute(NodePath _path,String _key); - public Either<Error,JungleTreeEditor> edit(NodePath _path,NodeEditor _editor); + public Either<Error,JungleTreeEditor> addNewChildAt(NodePath path,int pos); + public Either<Error,JungleTreeEditor> deleteChildAt(NodePath path,int pos); + public Either<Error,JungleTreeEditor> putAttribute(NodePath path,String key,ByteBuffer value); + public Either<Error,JungleTreeEditor> deleteAttribute(NodePath path,String key); + public Either<Error,JungleTreeEditor> edit(NodePath path,NodeEditor editor); public Either<Error,JungleTreeEditor> success(); public String getID();
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultChangeListReader.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultChangeListReader.java Fri Sep 12 19:49:00 2014 +0900 @@ -14,11 +14,11 @@ private ByteBuffer buf; private FileChannel ch; - DefaultChangeListReader(FileChannel _ch,ByteBuffer _buf,long _pos) + DefaultChangeListReader(FileChannel ch,ByteBuffer buf,long pos) { - pos = _pos; - buf = _buf; - ch = _ch; + this.pos = pos; + this.buf = buf; + this.ch = ch; } @Override
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultChangeListWriter.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultChangeListWriter.java Fri Sep 12 19:49:00 2014 +0900 @@ -7,15 +7,15 @@ public class DefaultChangeListWriter implements ChangeListWriter { - public DefaultChangeListWriter(ByteBuffer _buf) + public DefaultChangeListWriter(ByteBuffer buf) { } @Override - public synchronized Result write(ChangeList _operations) + public synchronized Result write(ChangeList operations) { - for(TreeOperation op : _operations){ + for(TreeOperation op : operations){ ByteBuffer treeOpBuf = serializeTreeOperation(op); } return null;
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultJournal.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultJournal.java Fri Sep 12 19:49:00 2014 +0900 @@ -51,7 +51,7 @@ { private final ChangeListWriter writer; - public static void main(String _args[]) throws Exception + public static void main(String args[]) throws Exception { RandomAccessFile f = new RandomAccessFile("./miscs/1.dat","rw"); MappedByteBuffer a = f.getChannel().map(MapMode.READ_WRITE,10,10); @@ -80,11 +80,11 @@ writer = null; } - public static Either<Error,DefaultJournal> newInstance(String _fileName) + public static Either<Error,DefaultJournal> newInstance(String fileName) { RandomAccessFile journal = null; try{ - journal = new RandomAccessFile(_fileName,"rw"); + journal = new RandomAccessFile(fileName,"rw"); FileChannel ch = journal.getChannel(); long length = journal.length(); ByteBuffer readBuf = ch.map(MapMode.READ_ONLY,0,READ_BUFFER_SIZE);
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultJournalWriter.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultJournalWriter.java Fri Sep 12 19:49:00 2014 +0900 @@ -13,16 +13,16 @@ } - public static Either<Error,DefaultJournalWriter> newInstance(String _fileName) + public static Either<Error,DefaultJournalWriter> newInstance(String fileName) { RandomAccessFile journal = null; try{ - journal = new RandomAccessFile(_fileName,"rw"); + journal = new RandomAccessFile(fileName,"rw"); //FileChannel ch = journal.getChannel(); long length = journal.length(); - }catch(FileNotFoundException _e){ + }catch(FileNotFoundException e){ - }catch(IOException _e){ + }catch(IOException e){ }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/ChangeSet.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/ChangeSet.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,11 +1,11 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; +import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; public interface ChangeSet { @@ -17,6 +17,6 @@ public String getTreeName(); public long revision(); - public Pair<TreeMap<String,TreeNode>,TreeMap<String,String>> getIndex(); + public TreeMap<String,List<TreeNode>> getIndex(); public Iterable<TreeOperation> getOperations(); }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditor.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditor.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,14 +1,12 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; -import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; 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; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Logging; public interface TreeEditor { - public Either<Error,LoggingNode> edit(TreeNode _root,NodePath _path,NodeEditor _transformer); + public Either<Error,Logging> edit(TreeNode root,NodePath path,NodeEditor transformer); }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNodePath.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNodePath.java Fri Sep 12 19:49:00 2014 +0900 @@ -12,7 +12,7 @@ { private final List<Integer> path; - public static void main(String _args[]) + public static void main(String args[]) { DefaultNodePath p = new DefaultNodePath(); p = p.add(1).add(2).add(3).add(4); @@ -24,9 +24,9 @@ path = List.list(-1); } - private DefaultNodePath(List<Integer> _path) + private DefaultNodePath(List<Integer> path) { - path = _path; + this.path = path; } @Override @@ -36,9 +36,9 @@ } @Override - public DefaultNodePath add(int _pos) + public DefaultNodePath add(int pos) { - List<Integer> newPath = path.snoc(_pos); + List<Integer> newPath = path.snoc(pos); return new DefaultNodePath(newPath); } @@ -68,15 +68,15 @@ List<List<Integer>> inits = path.inits(); inits = inits.filter(new F<List<Integer>,Boolean>(){ @Override - public Boolean f(List<Integer> _init){ - return _init.length() != 0; + public Boolean f(List<Integer> init){ + return init.length() != 0; } }); return inits.map(new F<List<Integer>,DefaultNodePath>(){ @Override - public DefaultNodePath f(List<Integer> _path){ - return new DefaultNodePath(_path); + public DefaultNodePath f(List<Integer> path){ + return new DefaultNodePath(path); } }); }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Fri Sep 12 19:49:00 2014 +0900 @@ -3,7 +3,6 @@ import fj.data.List; 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.logger.LoggingNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Direction; @@ -12,39 +11,40 @@ 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.tatsuki.jungle.store.index.Logging; public class DefaultTreeEditor implements TreeEditor { private final Traverser traverser; - public DefaultTreeEditor(Traverser _traverser) + public DefaultTreeEditor(Traverser traverser) { - traverser = _traverser; + this.traverser = traverser; } @Override - public Either<Error,LoggingNode> edit(TreeNode _root,NodePath _path,NodeEditor _editor) + public Either<Error,Logging> edit(TreeNode root,NodePath path,NodeEditor editor) { - DefaultEvaluator e = new DefaultEvaluator(_path); + DefaultEvaluator e = new DefaultEvaluator(path); //TraversableNodeWrapper<T> wrap = new TraversableNodeWrapper<T>(_root); - Either<Error, Traversal> either = traverser.traverse(_root,e); + Either<Error, Traversal> either = traverser.traverse(root,e); if(either.isA()){ return DefaultEither.newA(either.a()); } Traversal t = either.b(); - Either<Error,LoggingNode> ret = clone(t,_editor); + Either<Error,Logging> ret = clone(t,editor); return ret; } - private Either<Error,LoggingNode> clone(Traversal _t,NodeEditor _editor) + private Either<Error,Logging> clone(Traversal t,NodeEditor editor) { // copying nodes from bottom to root List<Direction<TreeNode>> path = List.nil(); - for(Direction<TreeNode> direction : _t){ + for(Direction<TreeNode> direction : t){ path = path.cons(direction); } @@ -52,13 +52,12 @@ Direction<TreeNode> targetDirection = path.head(); TreeNode target = targetDirection.getTarget(); //EditableNodeWrapper<T> wrapper = new EditableNodeWrapper<T>(target); - LoggingNode Logging = new LoggingNode(target); - Either<Error,LoggingNode> either = _editor.edit(Logging); + Either<Error,Logging> either = editor.edit(target); if(either.isA()){ return DefaultEither.newA(either.a()); } - LoggingNode newWrap = either.b(); + Logging newWrap = either.b(); // top int pos = targetDirection.getPosition(); @@ -77,6 +76,7 @@ } TreeNode newRoot = child; - return DefaultEither.newB(new LoggingNode(newRoot,newWrap.getOperationLog())); + Logging logNode = editor.wrap(newRoot,newWrap.getOperationLog()); + return DefaultEither.newB(logNode); } } \ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,7 +1,6 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainer; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; public interface TreeNode extends AttributesContainer {
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java Fri Sep 12 19:49:00 2014 +0900 @@ -7,9 +7,9 @@ public interface TreeNodeChildren extends Children { - public Either<Error,TreeNode> addNewChildAt(int _pos); - public Either<Error,TreeNode> deleteChildAt(int _pos); - public Either<Error,TreeNode> addNewChildAt(int _pos,TreeNode _newChild); - public Either<Error,TreeNode> replaceNode(int _pos,TreeNode _replacement); + public Either<Error,TreeNode> addNewChildAt(int pos); + public Either<Error,TreeNode> deleteChildAt(int pos); + public Either<Error,TreeNode> addNewChildAt(int pos,TreeNode newChild); + public Either<Error,TreeNode> replaceNode(int pos,TreeNode replacement); public List<TreeNode> getChildrenAsRawList(); } \ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingAttributes.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingAttributes.java Fri Sep 12 19:49:00 2014 +0900 @@ -10,6 +10,7 @@ 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.tatsuki.jungle.store.index.Logging; public class LoggingAttributes //implements EditableAttributes { @@ -28,7 +29,7 @@ return attributes.get(_key); } - private Either<Error,LoggingNode> edit(NodeOperation _op) + private Either<Error,Logging> edit(NodeOperation _op) { Either<Error,TreeNode> either = _op.invoke(wrap); if(either.isA()){ @@ -37,19 +38,19 @@ TreeNode newNode = either.b(); OperationLog newLog = log.add(_op); - LoggingNode newLoggingNode = new LoggingNode(newNode,newLog); + Logging newLogNode = new LoggingNode(newNode,newLog); - return DefaultEither.newB(newLoggingNode); + return DefaultEither.newB(newLogNode); } - public Either<Error,LoggingNode> delete(final String _key) + public Either<Error,Logging> delete(final String _key) { DeleteAttributeOperation deleteAttribute = new DeleteAttributeOperation(_key); return edit(deleteAttribute); } - public Either<Error,LoggingNode> put(final String _key,final ByteBuffer _value) + public Either<Error,Logging> put(final String _key,final ByteBuffer _value) { PutAttributeOperation putAttribute = new PutAttributeOperation(_key,_value); return edit(putAttribute);
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java Fri Sep 12 19:49:00 2014 +0900 @@ -10,6 +10,7 @@ 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.tatsuki.jungle.store.index.Logging; public class LoggingChildren //implements EditableChildren { @@ -36,7 +37,7 @@ return children.iterator(); }*/ - public Either<Error,LoggingNode> edit(NodeOperation _op) + public Either<Error,Logging> edit(NodeOperation _op) { Either<Error,TreeNode> either = _op.invoke(wrap); if(either.isA()){ @@ -45,23 +46,23 @@ TreeNode newWrap = either.b(); OperationLog newLog = log.add(_op); - LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog); + Logging newLoggingNode = new LoggingNode(newWrap,newLog); return DefaultEither.newB(newLoggingNode); } - public Either<Error,LoggingNode> addNewChildAt(final int _pos) + public Either<Error,Logging> addNewChildAt(final int _pos) { NodeOperation addNewChildAt = new AppendChildAtOperation(_pos); return edit(addNewChildAt); } - public Either<Error,LoggingNode> deleteChildAt(final int _pos) + public Either<Error,Logging> deleteChildAt(final int _pos) { NodeOperation deleteChildAt = new DeleteChildAtOperation(_pos); return edit(deleteChildAt); } - public Either<Error,LoggingNode> at(int _pos) + public Either<Error,Logging> at(int _pos) { Children children = wrap.getChildren(); Either<Error,TreeNode> either = children.at(_pos); @@ -70,6 +71,7 @@ } TreeNode node = either.b(); - return DefaultEither.newB(new LoggingNode(node)); + Logging logNode = new LoggingNode(node); + return DefaultEither.newB(logNode); } }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,9 +1,12 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; +import fj.data.List; +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Logging; -public class LoggingNode +public class LoggingNode implements Logging { public LoggingNode(TreeNode _wrap) { @@ -19,23 +22,32 @@ private final TreeNode wrap; private final OperationLog log; + @Override public LoggingAttributes getAttributes() { return new LoggingAttributes(wrap,log); } + @Override public LoggingChildren getChildren() { return new LoggingChildren(wrap,log); } + @Override public OperationLog getOperationLog() { return log; } + @Override public TreeNode getWrap() { return wrap; } + + @Override + public TreeMap<String, List<TreeNode>> getIndex() { + return null; + } }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/AppendChildAt.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/AppendChildAt.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,5 +1,7 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; +import fj.data.List; +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; @@ -9,26 +11,46 @@ 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.tatsuki.jungle.store.index.Logging; public class AppendChildAt implements NodeEditor { private final int pos; - private OperationLog log; public AppendChildAt(int _pos) { pos = _pos; - log = new DefaultOperationLog(); } - @Override - public Either<Error, LoggingNode> edit(LoggingNode _e) + public Either<Error, Logging> _edit(Logging _e) { - Either<Error,LoggingNode> either = _e.getChildren().addNewChildAt(pos); + Either<Error,Logging> either = _e.getChildren().addNewChildAt(pos); if(either.isA()){ // error return either; } return DefaultEither.newB(either.b()); } + + @Override + public Either<Error, Logging> edit(TreeNode _e) { + Logging logNode = wrap(_e); + return _edit(logNode); + } + + public Logging wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public Logging wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + + @Override + public TreeMap<String, List<TreeNode>> getIndex() { + // TODO Auto-generated method stub + return null; + } + }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteAttribute.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteAttribute.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,33 +1,51 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; +import fj.data.List; +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultOperationLog; 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.operations.DeleteAttributeOperation; 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.tatsuki.jungle.store.index.Logging; public class DeleteAttribute implements NodeEditor { private final String key; - private OperationLog log; public DeleteAttribute(String _key) { key = _key; - log = new DefaultOperationLog(); } - @Override - public Either<Error,LoggingNode> edit(LoggingNode _e) + public Either<Error,Logging> _edit(Logging logNode) { - Either<Error,LoggingNode> either = _e.getAttributes().delete(key); + Either<Error,Logging> either = logNode.getAttributes().delete(key); if(either.isA()){ // error return either; } return DefaultEither.newB(either.b()); } + + @Override + public Either<Error, Logging> edit(TreeNode _e) { + Logging logNode = wrap(_e); + return _edit(logNode); + } + public Logging wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public Logging wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + + @Override + public TreeMap<String, List<TreeNode>> getIndex() { + // TODO Auto-generated method stub + return null; + } }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteChildAt.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteChildAt.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,5 +1,7 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; +import fj.data.List; +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; @@ -9,6 +11,7 @@ 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.tatsuki.jungle.store.index.Logging; public class DeleteChildAt implements NodeEditor { @@ -18,14 +21,34 @@ pos = _pos; } - @Override - public Either<Error,LoggingNode> edit(LoggingNode _e) + public Either<Error,Logging> _edit(Logging logNode) { - Either<Error,LoggingNode> either = _e.getChildren().deleteChildAt(pos); + Either<Error,Logging> either = logNode.getChildren().deleteChildAt(pos); if(either.isA()){ // error return either; } return DefaultEither.newB(either.b()); } + + @Override + public Either<Error, Logging> edit(TreeNode _e) { + Logging logNode = wrap(_e); + return _edit(logNode); + } + + public Logging wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public Logging wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + + @Override + public TreeMap<String, List<TreeNode>> getIndex() { + // TODO Auto-generated method stub + return null; + } }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditor.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditor.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,13 +1,19 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; +import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.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.operations.NodeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Logging; public interface NodeEditor { - public Either<Error,LoggingNode> edit(LoggingNode _e); + public Either<Error,Logging> edit(TreeNode _e); + public Logging wrap(TreeNode node, OperationLog op); + public TreeMap<String,List<TreeNode>> getIndex(); } \ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/PutAttribute.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/PutAttribute.java Fri Sep 12 19:49:00 2014 +0900 @@ -2,6 +2,8 @@ import java.nio.ByteBuffer; +import fj.data.List; +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeAttributes; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultOperationLog; @@ -13,6 +15,7 @@ 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.tatsuki.jungle.store.index.Logging; public class PutAttribute implements NodeEditor { @@ -25,14 +28,34 @@ value = _value; } - @Override - public Either<Error,LoggingNode> edit(LoggingNode _e) + public Either<Error,Logging> _edit(Logging _e) { - Either<Error,LoggingNode> either = _e.getAttributes().put(key,value); + Either<Error,Logging> either = _e.getAttributes().put(key,value); if(either.isA()){ // error return either; } return DefaultEither.newB(either.b()); } + + @Override + public Either<Error, Logging> edit(TreeNode _e) { + Logging logNode = wrap(_e); + return _edit(logNode); + } + + public Logging wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public Logging wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + + @Override + public TreeMap<String, List<TreeNode>> getIndex() { + // TODO Auto-generated method stub + return null; + } }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultChangeSet.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultChangeSet.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,11 +1,11 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; +import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; public class DefaultChangeSet implements ChangeSet { @@ -15,9 +15,9 @@ private final String uuid; private final String treeName; private final long revision; - private final Pair<TreeMap<String,TreeNode>,TreeMap<String,String>> index; - - public DefaultChangeSet(TreeNode _node,ChangeSet _prev,ChangeList _log,String _uuid, String _treeName, long _revision, Pair<TreeMap<String,TreeNode>,TreeMap<String,String>> index) + private final TreeMap<String,List<TreeNode>> index; + TreeMap<String,List<String>> index2; + public DefaultChangeSet(TreeNode _node,ChangeSet _prev,ChangeList _log,String _uuid, String _treeName, long _revision, TreeMap<String,List<TreeNode>> index) { this.root = _node; this.previous = _prev; @@ -31,31 +31,31 @@ @Override public TreeNode getRoot() { - return this.root; + return root; } @Override public ChangeSet prev() { - return this.previous; + return previous; } @Override public ChangeList getChangeList() { - return this.changeList; + return changeList; } @Override public String uuid() { - return this.uuid; + return uuid; } @Override public String getTreeName() { - return this.treeName; + return treeName; } @Override @@ -71,7 +71,7 @@ } @Override - public Pair<TreeMap<String, TreeNode>, TreeMap<String, String>> getIndex() { + public TreeMap<String,List<TreeNode>> getIndex() { return index; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleIndexTreeEditor.java Fri Sep 12 19:49:00 2014 +0900 @@ -0,0 +1,132 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; + +import java.nio.ByteBuffer; + +import fj.data.List; +import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +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.tatsuki.jungle.store.index.AppendChildAtIndex; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.DeleteAttributeIndex; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.DeleteChildAtIndex; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Logging; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.PutAttributeIndex; + +public class DefaultJungleIndexTreeEditor extends DefaultJungleTreeEditor +{ + private final TransactionManager txManager; + private final TreeNode root; + private final TreeEditor editor; + private final TreeOperationLog log; + private TreeMap<String,List<TreeNode>> index; + + public DefaultJungleIndexTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor, TreeMap<String,List<TreeNode>> index) + { + this(_root,_txManager,_editor,new DefaultTreeOperationLog(), index); + } + + public DefaultJungleIndexTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log, TreeMap<String,List<TreeNode>> index) + { + super(newNode, _txManager, _editor , _log); + this.root = newNode; + this.txManager = _txManager; + this.editor = _editor; + this.log = _log; + this.index = index; + } + + private Either<Error,JungleTreeEditor> _edit(final NodePath _path,NodeEditor _e) + { + //LoggingNodeHook hook = new LoggingNodeHook(_e); + Either<Error,Logging> either = editor.edit(root,_path,_e); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + Logging newLogging = either.b(); + OperationLog newLog = newLogging.getOperationLog(); + TreeNode newNode = newLogging.getWrap(); + index = newLogging.getIndex(); + IterableConverter.Converter<TreeOperation,NodeOperation> converter = new IterableConverter.Converter<TreeOperation,NodeOperation>(){ + @Override + public TreeOperation conv(NodeOperation _b){ + return new DefaultTreeOperation(_path,_b); + } + }; + + Iterable<TreeOperation> iterable = new IterableConverter<TreeOperation,NodeOperation>(newLog,converter); + DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable,newLog.length()); + TreeOperationLog newTreeOpLog = log.append(treeOperationLog); + + JungleTreeEditor newEditor = new DefaultJungleIndexTreeEditor(newNode,txManager,editor,newTreeOpLog, index); + return DefaultEither.newB(newEditor); + } + + @Override + public Either<Error,JungleTreeEditor> addNewChildAt(NodePath _path, int _pos) + { + AppendChildAtIndex appendChildAt = new AppendChildAtIndex(_pos, index); + return _edit(_path,appendChildAt); + } + + @Override + public Either<Error,JungleTreeEditor> deleteChildAt(NodePath _path, int _pos) + { + DeleteChildAtIndex deleteChildAt = new DeleteChildAtIndex(_pos, index); + return _edit(_path,deleteChildAt); + } + + @Override + public Either<Error,JungleTreeEditor> putAttribute(NodePath _path,String _key,ByteBuffer _value) + { + PutAttributeIndex putAttribute = new PutAttributeIndex(_key,_value, index); + return _edit(_path,putAttribute); + } + + @Override + public Either<Error,JungleTreeEditor> deleteAttribute(NodePath _path, String _key) + { + DeleteAttributeIndex deleteAttribute = new DeleteAttributeIndex(_key, index); + return _edit(_path,deleteAttribute); + } + + @Override + public Either<Error,JungleTreeEditor> edit(NodePath _path,NodeEditor _editor) + { + return _edit(_path,_editor); + } + + @Override + public Either<Error,JungleTreeEditor> success() + { + Either<Error,TransactionManager> either = txManager.commit(root,log, index); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TransactionManager newTxManager = either.b(); + JungleTreeEditor newTreeEditor = new DefaultJungleIndexTreeEditor(root,newTxManager,editor, index); + + return DefaultEither.newB(newTreeEditor); + } + +}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java Fri Sep 12 19:49:00 2014 +0900 @@ -2,6 +2,7 @@ import java.nio.ByteBuffer; +import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; @@ -24,6 +25,7 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Logging; public class DefaultJungleTreeEditor implements JungleTreeEditor { @@ -31,31 +33,29 @@ private final TreeNode root; private final TreeEditor editor; private final TreeOperationLog log; - private Pair<TreeMap<String,TreeNode>,TreeMap<String,String>> index; - public DefaultJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor, Pair<TreeMap<String,TreeNode>,TreeMap<String,String>> index) + public DefaultJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor) { - this(_root,_txManager,_editor,new DefaultTreeOperationLog(), index); + this(_root,_txManager,_editor,new DefaultTreeOperationLog()); } - public DefaultJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log, Pair<TreeMap<String,TreeNode>,TreeMap<String,String>> index) + 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; } private Either<Error,JungleTreeEditor> _edit(final NodePath _path,NodeEditor _e) { //LoggingNodeHook hook = new LoggingNodeHook(_e); - Either<Error,LoggingNode> either = editor.edit(root,_path,_e); + Either<Error,Logging> either = editor.edit(root,_path,_e); if(either.isA()){ return DefaultEither.newA(either.a()); } - LoggingNode newLogging = either.b(); + Logging newLogging = either.b(); OperationLog newLog = newLogging.getOperationLog(); TreeNode newNode = newLogging.getWrap(); @@ -70,7 +70,7 @@ DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable,newLog.length()); TreeOperationLog newTreeOpLog = log.append(treeOperationLog); - JungleTreeEditor newEditor = new DefaultJungleTreeEditor(newNode,txManager,editor,newTreeOpLog, index); + JungleTreeEditor newEditor = new DefaultJungleTreeEditor(newNode,txManager,editor,newTreeOpLog); return DefaultEither.newB(newEditor); } @@ -111,13 +111,13 @@ @Override public Either<Error,JungleTreeEditor> success() { - Either<Error,TransactionManager> either = txManager.commit(root,log); + Either<Error,TransactionManager> either = txManager.commit(root,log,null); if(either.isA()){ return DefaultEither.newA(either.a()); } TransactionManager newTxManager = either.b(); - JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor(root,newTxManager,editor, index); + JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor(root,newTxManager,editor); return DefaultEither.newB(newTreeEditor); }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,6 +1,9 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; import java.util.Iterator; + +import fj.data.List; +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result; @@ -31,7 +34,7 @@ } @Override - public Either<Error,TransactionManager> commit(TreeNode _newRoot,final TreeOperationLog _log) + public Either<Error,TransactionManager> commit(TreeNode _newRoot,final TreeOperationLog _log, TreeMap<String,List<TreeNode>> index) { ChangeSet cs = tip.getChangeSet(); long currentRevision = cs.revision(); @@ -53,7 +56,7 @@ } }; - DefaultChangeSet newCs = new DefaultChangeSet(_newRoot,cs,list,uuid, _treeName, nextRevision,null); + DefaultChangeSet newCs = new DefaultChangeSet(_newRoot,cs,list,uuid, _treeName, nextRevision,index); DefaultTreeContext newContext = new DefaultTreeContext(_newRoot,newCs); @SuppressWarnings("rawtypes")
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java Fri Sep 12 19:49:00 2014 +0900 @@ -6,7 +6,6 @@ import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; public class DefaultTreeNode implements TreeNode
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,5 +1,7 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; +import fj.data.List; +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; @@ -7,7 +9,7 @@ public interface TransactionManager { - public Either<Error,TransactionManager> commit(TreeNode _newRoot,TreeOperationLog _log); + public Either<Error,TransactionManager> commit(TreeNode _newRoot,TreeOperationLog _log, TreeMap<String,List<TreeNode>> index); public String getUUID(); public long getRevision(); }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java Fri Sep 12 19:49:00 2014 +0900 @@ -2,6 +2,7 @@ import java.util.Iterator; +import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; @@ -18,22 +19,19 @@ InterfaceTraverser traverser; TreeNode node; - TreeMap<String, TreeNode> nodeIndex; - TreeMap<String, String> attributeIndex; + TreeMap<String,TreeMap<String, List<TreeNode>>> index; JungleTreeEditor editor; public InterfaceTraverser(TreeNode _root, - Pair<TreeMap<String, TreeNode>, TreeMap<String, String>> index, + TreeMap<String,TreeMap<String, List<TreeNode>>> index, JungleTreeEditor editor) { this.node = _root; - this.nodeIndex = index.left(); - this.attributeIndex = index.right(); + this.index = index; this.editor = editor; } public InterfaceTraverser getTraverser(JungleTree tree) { - return new InterfaceTraverser(tree.getRootNode(), tree.getIndex(), - tree.getTreeEditor()); + return new InterfaceTraverser(tree.getRootNode(), tree.getIndex(), tree.getTreeEditor()); } public void set(TreeNode root){ @@ -61,7 +59,7 @@ * _attribute){ return null; } */ - public JungleTreeEditor update(UpdateQuery query) { + public JungleTreeEditor update(final UpdateQuery query) { Iterator<Pair<TreeNode, NodePath>> findNode = find(query); //do { for (; findNode.hasNext();) { @@ -76,8 +74,8 @@ } public Iterator<Pair<TreeNode, NodePath>> find(final SearchQuery query) { - final PathNodeIterator itNode = new PathNodeIterator(node); - + final PathNodeIterator itNode = new PathNodeIterator(node, query); + return new Iterator<Pair<TreeNode, NodePath>>() { private Pair<TreeNode, NodePath> matchPair = nextmatch(itNode);
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java Fri Sep 12 19:49:00 2014 +0900 @@ -18,12 +18,17 @@ private TreeNodeChildren children; private Stack<TreeNode> nodeStack = new Stack<TreeNode>(); private Stack<Integer> searchStack = new Stack<Integer>(); - - public PathNodeIterator(TreeNode root) { + + /* + * get queryIndexCondition from query + * if already index exists, use index + * otherwise traverse tree and create index + * + * */ + public PathNodeIterator(TreeNode root, Query query) { this.root = root; path = new DefaultNodePath(); node = root; - } @Override
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/Query.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/Query.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,7 +1,12 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query; +import fj.data.List; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; public interface Query { boolean condition(TreeNode _node); + List<Pair<String,String>> indexCondition(); //attribute name ,attribute value + + }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/SearchQuery.java Thu Sep 11 18:02:26 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/SearchQuery.java Fri Sep 12 19:49:00 2014 +0900 @@ -1,22 +1,47 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query; +import fj.data.List; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; -public class SearchQuery /*implements Query*/ { +public class SearchQuery { + + private Query query; + private List<String> indexidAttributesList = List.nil(); - private String attribute; - private String key; - public SearchQuery(String _key, String _attribute){ - key = _key; - attribute = _attribute; + public Query getQuery() { + return query; + } + + public void setQuery(Query query) { + this.query = query; + } + + public List<String> getIndexidAttributesList() { + return indexidAttributesList; + } + + public void setIndexidAttributesList(List<String> indexidAttributesList) { + this.indexidAttributesList = indexidAttributesList; + } + + public SearchQuery(Query query){ + this.query = query; } - //@Override - public boolean condition(TreeNode _node) { - String str = new String(_node.getAttributes().get(key).array()); - //System.out.println(str); - if(str.equals(attribute)) - return true; - return false; + + public boolean condition(TreeNode node) { + return query.condition(node); + +// for example query String +// str = new String(_node.getAttributes().get(key).array()); +// //System.out.println(str); +// if(str.equals(attribute)) +// return true; +// return false; } + public List<Pair<String, String>> indexCondition() { + return query.indexCondition(); + } + }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/AppendChildAtIndex.java Fri Sep 12 19:49:00 2014 +0900 @@ -0,0 +1,38 @@ +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; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.AppendChildAt; +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 AppendChildAtIndex extends AppendChildAt { + + private TreeMap<String,List<TreeNode>> index; + + public AppendChildAtIndex(int _pos, TreeMap<String,List<TreeNode>> index) { + super(_pos); + this.index = index; + + } + + @Override + public Either<Error, Logging> edit(TreeNode _e) { + Logging logNode = wrap(_e); + return _edit(logNode); + } + + @Override + public Logging wrap(TreeNode node) { + return new LoggingIndexNode(node, index); + } + + @Override + public Logging wrap(TreeNode node, OperationLog op) { + return new LoggingIndexNode(node, op, index); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteAttributeIndex.java Fri Sep 12 19:49:00 2014 +0900 @@ -0,0 +1,38 @@ +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; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +public class DeleteAttributeIndex extends DeleteAttribute { + + TreeMap<String,List<TreeNode>> index; + private String key; + + public DeleteAttributeIndex(String _key ,TreeMap<String,List<TreeNode>> index) { + super(_key); + this.key = key; + this.index = index; + } + + @Override + public Either<Error, Logging> edit(TreeNode _e) { + Logging logNode = wrap(_e); + return _edit(logNode); + } + + @Override + public Logging wrap(TreeNode node) { + return new LoggingIndexNode(node, index); + } + + @Override + public Logging wrap(TreeNode node, OperationLog op) { + return new LoggingIndexNode(node, op, index); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteChildAtIndex.java Fri Sep 12 19:49:00 2014 +0900 @@ -0,0 +1,35 @@ +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; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +public class DeleteChildAtIndex extends DeleteChildAt{ + + private TreeMap<String,List<TreeNode>> index; + public DeleteChildAtIndex(int _pos, TreeMap<String,List<TreeNode>> index) { + super(_pos); + this.index = index; + } + + @Override + public Either<Error, Logging> edit(TreeNode _e) { + Logging logNode = wrap(_e); + return _edit(logNode); + } + + @Override + public Logging wrap(TreeNode node) { + return new LoggingIndexNode(node, index); + } + + @Override + public Logging wrap(TreeNode node, OperationLog op) { + return new LoggingIndexNode(node, op, index); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/Logging.java Fri Sep 12 19:49:00 2014 +0900 @@ -0,0 +1,17 @@ +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; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingAttributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingChildren; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; + +public interface Logging { + + public LoggingAttributes getAttributes(); + public LoggingChildren getChildren(); + public OperationLog getOperationLog(); + public TreeNode getWrap(); + public TreeMap<String,List<TreeNode>> getIndex(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/LoggingIndexAttributes.java Fri Sep 12 19:49:00 2014 +0900 @@ -0,0 +1,98 @@ +package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; + +import java.nio.ByteBuffer; + +import fj.Ord; +import fj.data.List; +import fj.data.Option; +import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingAttributes; +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.operations.DeleteAttributeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; +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 LoggingIndexAttributes extends LoggingAttributes { + + private final TreeNode wrap; + private final OperationLog log; + private TreeMap<String,TreeMap<String, List<TreeNode>>> index; + + public LoggingIndexAttributes(TreeNode _wrap, OperationLog _log, TreeMap<String,TreeMap<String, List<TreeNode>>> index) { + super(_wrap, _log); + this.wrap = _wrap; + this.log = _log; + this.index = index; + } + + private Either<Error,Logging> edit(NodeOperation _op) + { + Either<Error,TreeNode> either = _op.invoke(wrap); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TreeNode newNode = either.b(); + OperationLog newLog = log.add(_op); + Logging newLogNode = new LoggingNode(newNode,newLog); + + return DefaultEither.newB(newLogNode); + } + + public Either<Error,Logging> delete(final String key) + { + DeleteAttributeOperation deleteAttribute = new DeleteAttributeOperation(key); + Either<Error, Logging> either = edit(deleteAttribute); + + if(either.isA()) + return either; + + Logging logNode = either.b(); + TreeNode node = logNode.getWrap(); + OperationLog log = logNode.getOperationLog(); + index = index.delete(key); + Logging logIndexNode = new LoggingIndexNode(node, log, index); + return DefaultEither.newB(logIndexNode); + } + + public Either<Error,Logging> put(final String key,final ByteBuffer value) + { + PutAttributeOperation putAttribute = new PutAttributeOperation(key,value); + Either<Error, Logging> either = edit(putAttribute); + if(either.isA()) + return either; + + Logging logNode = either.b(); + TreeNode newNode = logNode.getWrap(); + OperationLog newLog = logNode.getOperationLog(); + Option<TreeMap<String, TreeNode>> opAttributeIndex = index.get(key); + String indexKey = new String(value.array()); + TreeMap<String, TreeNode> list = TreeMap.empty(Ord.stringOrd); + + if (opAttributeIndex.isNone()) { + TreeMap<String, TreeNode> newAttributeindex = TreeMap.empty(Ord.stringOrd); + list = list.set(indexKey,newNode); + } else { + Option<TreeNode> oplist = opAttributeIndex.some().get(indexKey); + list = opAttributeIndex.some(); + list = list.cons(newNode); + } + + + if (opList.isNone()) { + list = list.set(,newNode); + } else { + list = opList.some(); + list = list.cons(newNode); + } + TreeMap<String,List<TreeNode>> newIndex = index.set(indexKey,list); + Logging logIndexNode = new LoggingIndexNode(newNode, newLog, newIndex); + return DefaultEither.newB(logIndexNode); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/LoggingIndexNode.java Fri Sep 12 19:49:00 2014 +0900 @@ -0,0 +1,51 @@ +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; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultOperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingAttributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingChildren; +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.util.Pair; + +public class LoggingIndexNode extends LoggingNode { + + + private final TreeNode wrap; + private final OperationLog log; + private TreeMap<String,List<TreeNode>> index; + + public LoggingIndexNode(TreeNode wrap ,TreeMap<String,List<TreeNode>> index) + { + this(wrap,new DefaultOperationLog(),index); + } + + public LoggingIndexNode(TreeNode wrap,OperationLog log, TreeMap<String,List<TreeNode>> index) + { + super(wrap, log); + this.wrap = wrap; + this.log = log; + this.index = index; + } + + @Override + public TreeMap<String,List<TreeNode>> getIndex(){ + return index; + } + + @Override + public LoggingAttributes getAttributes() + { + return new LoggingIndexAttributes(wrap,log,index); + } + + @Override + public LoggingChildren getChildren() + { + return new LoggingChildren(wrap,log); + } + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutAttributeIndex.java Fri Sep 12 19:49:00 2014 +0900 @@ -0,0 +1,46 @@ +package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; + +import java.nio.ByteBuffer; + +import fj.data.List; +import fj.data.Option; +import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.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.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; + +public class PutAttributeIndex extends PutAttribute { + + private TreeMap<String,List<TreeNode>> index; + + public PutAttributeIndex(String _key,ByteBuffer _value, TreeMap<String,List<TreeNode>>index) + { + super(_key, _value); + this.index = index; + } + + @Override + public Either<Error, Logging> edit(TreeNode _e) { + Logging logNode = wrap(_e); + return _edit(logNode); + } + + @Override + public Logging wrap(TreeNode node) { + return new LoggingIndexNode(node, index); + } + + @Override + public Logging wrap(TreeNode node, OperationLog op) { + return new LoggingIndexNode(node, op, index); + } + + @Override + public TreeMap<String,List<TreeNode>> getIndex(){ + return index; + } +}