Mercurial > hg > Members > tatsuki > bench > jungle-core
diff src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/LoggingIndexAttributes.java @ 103:bed3afd5c2e2
add Index but Not use
author | one |
---|---|
date | Fri, 12 Sep 2014 14:37:09 +0900 |
parents | |
children | f9a0e7069811 |
line wrap: on
line diff
--- /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 14:37:09 2014 +0900 @@ -0,0 +1,79 @@ +package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; + +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.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,List<TreeNode>> index; + + public LoggingIndexAttributes(TreeNode _wrap, OperationLog _log, 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(); + String indexKey = new String(value.array()); + List<TreeNode> list = index.get(indexKey).some(); + list = list.cons(newNode); + index.set(indexKey, list); + Logging logIndexNode = new LoggingIndexNode(newNode, newLog, index); + return DefaultEither.newB(logIndexNode); + } +}