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="&#x8ab0;&#x304c;&#x691c;&#x7d22;&#x3057;&#x305f;&#x304b;&#x3092;&#x4fdd;&#x5b58;&#x3059;&#x308b;API"/>
 </node>
 <node CREATED="1409906099431" HGAP="22" ID="ID_1697852268" MODIFIED="1409906130605" TEXT="index&#x3092;&#x3064;&#x3051;&#x308b;" VSHIFT="50">
-<node CREATED="1409906161185" HGAP="18" ID="ID_37822884" MODIFIED="1409912675141" TEXT="Key&#x3068;Node&#x306e;HashMap&#x3068;Attribute&quot;name&quot;&#x306e;HashMap&#x3092;&#x767b;&#x9332;&#x3059;&#x308b;" VSHIFT="-10"/>
+<node CREATED="1409906161185" HGAP="18" ID="ID_37822884" MODIFIED="1410373602707" TEXT="Key&#x3068;Node&#x306e;HashMap&#x3068;key&#x3068;Attribute&#x306e;HashMap&#x3092;&#x767b;&#x9332;&#x3059;&#x308b;" VSHIFT="-10"/>
 <node CREATED="1409906200281" HGAP="21" ID="ID_957989771" MODIFIED="1409906786182" TEXT="&#x5404;version&#x6bce;&#x306b;inde&#x304c;&#x3042;&#x308b;" VSHIFT="-14"/>
 <node CREATED="1409906235377" HGAP="18" ID="ID_1286646129" MODIFIED="1409906798789" TEXT="index&#x306f;fj&#x306e;TreeHashMap&#x3092;&#x4f7f;&#x3046;" VSHIFT="-3">
 <node CREATED="1409912676387" ID="ID_1944162611" MODIFIED="1409912716086" TEXT="&#x975e;&#x7834;&#x58ca;&#x306e;index&#x3092;&#x4f7f;&#x3044;&#x305f;&#x3044;"/>
--- 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;
+	}
+}