changeset 153:20af7f25ef32

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