Mercurial > hg > Members > tatsuki > bench > jungle-core
view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/IndexJungleTreeEditor.java @ 127:b2c1fd513feb
push index thread add read log
author | one |
---|---|
date | Mon, 13 Oct 2014 03:22:16 +0900 |
parents | f81ec544a155 |
children | 9c46e5c2ffac |
line wrap: on
line source
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.DeleteIndexEditor; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexEditor; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.PutIndexEditor; public class IndexJungleTreeEditor implements JungleTreeEditor { private final TransactionManager txManager; private final TreeNode root; private final TreeEditor editor; private final TreeOperationLog log; private TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index; // public DefaultJungleTreeEditor(TreeNode root) // { // this(root,txManager,_editor,new DefaultTreeOperationLog()); // } public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() { return index; } public void setIndex( TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index) { this.index = index; } public IndexJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor, TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index) { this(_root,_txManager,_editor,new DefaultTreeOperationLog(), index); } public IndexJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log, TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index) { this.root = newNode; this.txManager = _txManager; this.editor = _editor; this.log = _log; this.index = index; } private Either<Error,IndexJungleTreeEditor> _edit(final NodePath _path,NodeEditor _e) { Either<Error,LoggingNode> 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<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); IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(newNode,txManager,editor,newTreeOpLog, index); return DefaultEither.newB(newEditor); } @Override public Either<Error,JungleTreeEditor> addNewChildAt(NodePath _path, int _pos) { AppendChildAt appendChildAt = new AppendChildAt(_pos); Either<Error,IndexJungleTreeEditor> either = _edit(_path,appendChildAt); JungleTreeEditor editor = either.b(); Either<Error,JungleTreeEditor> newEither = DefaultEither.newB(editor); return newEither; } @Override public Either<Error,JungleTreeEditor> deleteChildAt(NodePath _path, int _pos) { DeleteChildAt deleteChildAt = new DeleteChildAt(_pos); Either<Error,IndexJungleTreeEditor> either = _edit(_path,deleteChildAt); JungleTreeEditor editor = either.b(); Either<Error,JungleTreeEditor> newEither = DefaultEither.newB(editor); return newEither; } @Override public Either<Error,JungleTreeEditor> putAttribute(NodePath _path,String _key,ByteBuffer _value) { PutAttribute putAttribute = new PutAttribute(_key,_value); Either<Error,IndexJungleTreeEditor> either = _edit(_path,putAttribute); PutIndexEditor indexEditor = new PutIndexEditor(); Either<Error,JungleTreeEditor> newEither = indexEditor.edit(either.b()); return newEither; } @Override public Either<Error,JungleTreeEditor> deleteAttribute(NodePath _path, String _key) { DeleteAttribute deleteAttribute = new DeleteAttribute(_key); Either<Error,IndexJungleTreeEditor> either = _edit(_path,deleteAttribute); DeleteIndexEditor indexEditor = new DeleteIndexEditor(); Either<Error,JungleTreeEditor> newEither = indexEditor.edit(either.b()); return newEither; } @Override public Either<Error,JungleTreeEditor> edit(NodePath _path,NodeEditor _editor) { Either<Error,IndexJungleTreeEditor> either = _edit(_path,_editor); JungleTreeEditor editor = either.b(); Either<Error,JungleTreeEditor> newEither = DefaultEither.newB(editor); return newEither; } @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 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; } }