changeset 135:6e9a8d26e0cf

refactor
author one
date Fri, 24 Oct 2014 18:49:48 +0900
parents f46a6e0e4594
children 0f68cd7b2838
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/persistent/ChangeList.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/NodePath.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNodePath.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/AppendChildAt.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteAttribute.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteChildAt.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/PutAttribute.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/IndexJungleTreeEditor.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/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/PutIndexEditor.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/AddChildrenIndexTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/DeleteChildrenIndexTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/DeleteChildrenTest.java
diffstat 20 files changed, 358 insertions(+), 160 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java	Fri Oct 24 18:49:48 2014 +0900
@@ -80,10 +80,6 @@
 				return name;
 			}
 			
-			@Override
-			public int getLogSize() {
-				return 0;
-			}
 		};
 		
 		DefaultTreeNode root = new DefaultTreeNode();
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java	Fri Oct 24 18:49:48 2014 +0900
@@ -91,14 +91,6 @@
 	}
 	
 	@Override
-	public int getLogSize(){
-		TreeContext tc = repository.get();
-		ChangeSet cs = tc.getChangeSet();
-		ChangeList cl = cs.getChangeList();
-		return cl.getLogSize();
-	}
-
-	@Override
 	public Iterable<TreeOperation> getLog() {
 		TreeContext tc = repository.get();
 		ChangeSet cs = tc.getChangeSet();
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java	Fri Oct 24 18:49:48 2014 +0900
@@ -20,6 +20,5 @@
 	public TreeNode getRootNode();
 	public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex();
 	public IndexJungleTreeEditor getIndexTreeEditor();
-	public int getLogSize();
 	public Iterable<TreeOperation> getLog();
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/ChangeList.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/ChangeList.java	Fri Oct 24 18:49:48 2014 +0900
@@ -6,5 +6,4 @@
 {
 	public String uuid();
 	public String getTreeName();
-	public int getLogSize();
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/NodePath.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/NodePath.java	Fri Oct 24 18:49:48 2014 +0900
@@ -8,4 +8,5 @@
 	public Pair<Integer,NodePath> pop();
 	public NodePath tail();
 	public int size();
+	public Pair<Integer,NodePath> last();
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNodePath.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNodePath.java	Fri Oct 24 18:49:48 2014 +0900
@@ -4,7 +4,6 @@
 
 import fj.F;
 import fj.data.List;
-
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
 
@@ -52,6 +51,13 @@
 	}
 
 	@Override
+	public Pair<Integer,NodePath> last(){
+		Integer last = path.last();
+		List<Integer> list = path.reverse().tail().reverse();
+		return new Pair<Integer,NodePath>(last,new DefaultNodePath(list));
+	}
+	
+	@Override
 	public String toString()
 	{
 		return path.toString();
@@ -81,6 +87,7 @@
 		});
 	}
 
+
 	@Override
 	public NodePath tail() {
 		List<Integer> tail = path.reverse();
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/AppendChildAt.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/AppendChildAt.java	Fri Oct 24 18:49:48 2014 +0900
@@ -48,10 +48,4 @@
 		return new LoggingNode(node, op);
 	}
 
-	@Override
-	public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteAttribute.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteAttribute.java	Fri Oct 24 18:49:48 2014 +0900
@@ -43,10 +43,4 @@
 	public LoggingNode wrap(TreeNode node, OperationLog op) {
 		return new LoggingNode(node, op);
 	}
-
-	@Override
-	public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() {
-		// TODO Auto-generated method stub
-		return null;
-	}
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteChildAt.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteChildAt.java	Fri Oct 24 18:49:48 2014 +0900
@@ -47,9 +47,4 @@
 		return new LoggingNode(node, op);
 	}
 
-	@Override
-	public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() {
-		// TODO Auto-generated method stub
-		return null;
-	}
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditor.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditor.java	Fri Oct 24 18:49:48 2014 +0900
@@ -15,5 +15,4 @@
 {
 	public Either<Error,LoggingNode> edit(TreeNode _e);
 	public LoggingNode wrap(TreeNode node, OperationLog op);
-	public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex();
 }
\ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/PutAttribute.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/PutAttribute.java	Fri Oct 24 18:49:48 2014 +0900
@@ -54,9 +54,4 @@
 		return new LoggingNode(node, op);
 	}
 
-	@Override
-	public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() {
-		// TODO Auto-generated method stub
-		return null;
-	}
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java	Fri Oct 24 18:49:48 2014 +0900
@@ -56,10 +56,7 @@
 			public String uuid(){
 				return uuid;
 			}
-			@Override
-			public int getLogSize() {
-				return _log.length();
-			}
+
 		};
 		
 		DefaultChangeSet newCs = new DefaultChangeSet(_newRoot,cs,list,uuid, _treeName, nextRevision,index);
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/IndexJungleTreeEditor.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/IndexJungleTreeEditor.java	Fri Oct 24 18:49:48 2014 +0900
@@ -25,6 +25,8 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
+import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.index.AddChildrenIndexTest;
+import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.AddNewChildrenIndexEditor;
 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.DeleteIndexEditor;
@@ -97,7 +99,7 @@
 	public Either<Error,JungleTreeEditor> addNewChildAt(NodePath _path, int _pos)
 	{
 		AppendChildAt appendChildAt = new AppendChildAt(_pos);
-		DefaultIndexEditor indexEditor = new DefaultIndexEditor();
+		AddNewChildrenIndexEditor indexEditor = new AddNewChildrenIndexEditor(_pos, _path);
 		Either<Error,IndexJungleTreeEditor> either = _edit(_path,appendChildAt,indexEditor);
 		Either<Error,JungleTreeEditor> newEither = DefaultEither.newB(either.b());
 		return newEither;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/AddNewChildrenIndexEditor.java	Fri Oct 24 18:49:48 2014 +0900
@@ -0,0 +1,123 @@
+package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index;
+
+import java.util.Iterator;
+
+import fj.F;
+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.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.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<Pair<TreeNode, NodePath>>>> index) {
+
+		TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = editIndex(index);
+		IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root, txManager, editor, newIndex);
+		return DefaultEither.newB(newEditor);
+	}
+
+	public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> editIndex(
+			TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index) {
+
+		if (!index.isEmpty()) {
+			List<String> keyList = index.keys();
+			TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = TreeMap.empty(Ord.stringOrd);
+			TreeMap<String, List<Pair<TreeNode, NodePath>>> newInnerIndex = TreeMap.empty(Ord.stringOrd);
+
+			for (String indexKey : keyList) {
+				TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = index.get(indexKey).some();
+				List<String> innerIndexKeyList = innerIndex.keys();
+
+				for (String innerIndexKey : innerIndexKeyList) {
+					List<Pair<TreeNode, NodePath>> pairList = innerIndex.get(innerIndexKey).some();
+					List<Pair<TreeNode, 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<Pair<TreeNode, NodePath>> checkPath(List<Pair<TreeNode, NodePath>> pairList){
+
+		List<Pair<TreeNode, NodePath>> list = List.nil();
+		for (Pair<TreeNode, NodePath> pair : pairList) {
+
+			NodePath path = pair.right();
+			System.out.println("oldPath = " + path.toString());
+			NodePath newPath = new DefaultNodePath();
+			
+			
+			if (editNodePath.size() > path.size()) {
+				list = list.cons(pair);
+				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());
+			Pair<TreeNode, NodePath> newPair = new Pair<TreeNode, NodePath>(pair.left(), newPath);
+			list = list.cons(newPair);
+		}
+
+		return list;
+	}
+
+}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteChildIndexEditor.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteChildIndexEditor.java	Fri Oct 24 18:49:48 2014 +0900
@@ -97,9 +97,9 @@
 				if (pathInt == -1)
 					continue;
 				if (editNodePathCopy.right().size() > 0) {
+					
 					editNodePathCopy = editNodePathCopy.right().pop();
-					if (loopCount >= editNodePath.size()
-							&& editNodePathCopy.left() < pathInt) {
+					if (loopCount == editNodePath.size() && editNodePathCopy.left() < pathInt) {
 						newPath = newPath.add(pathInt - 1);
 						continue;
 					}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteIndexEditor.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteIndexEditor.java	Fri Oct 24 18:49:48 2014 +0900
@@ -45,6 +45,7 @@
 	public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> editIndex(String attribute, TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index){
 	
 		Option<TreeMap<String, List<Pair<TreeNode, NodePath>>>> innerIndexOp = index.get(key);
+		
 		if (innerIndexOp.isSome()) {
 			TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = innerIndexOp.some();
 			Option<List<Pair<TreeNode, NodePath>>> listOp = innerIndex.get(attribute);
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java	Tue Oct 21 19:47:25 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java	Fri Oct 24 18:49:48 2014 +0900
@@ -55,12 +55,12 @@
 		if (attribute != 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(attribute, list);
-				TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = index.set(key, innerIndex);
-				return newIndex;
+//				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(attribute, list);
+//				TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = index.set(key, innerIndex);
+				return index;
 			} else {
 
 				TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = innerIndexOp.some();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/AddChildrenIndexTest.java	Fri Oct 24 18:49:48 2014 +0900
@@ -0,0 +1,105 @@
+package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.index;
+
+import java.nio.ByteBuffer;
+import java.util.Iterator;
+
+import org.junit.Test;
+import org.junit.experimental.theories.suppliers.TestedOn;
+
+import fj.data.List;
+import fj.data.Option;
+import fj.data.TreeMap;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
+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.NodePath;
+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.transaction.DefaultTreeNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
+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;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
+import junit.framework.Assert;
+
+public class AddChildrenIndexTest {
+
+	@Test
+	public void DeleteChildrenTest(){
+		Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTreeEditor(new DefaultTraverser()));
+		jungle.createNewTree("tree");
+		JungleTree tree = jungle.getTreeByName("tree");
+		createTree(tree);
+		tree.getRootNode();
+		InterfaceTraverser ifTraverser = tree.getTraverser();
+
+		Iterator<Pair<TreeNode, NodePath>> pairIterator = ifTraverser.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>");
+
+		 for (;pairIterator.hasNext();pairIterator.next()) {
+			 
+		 }
+		ifTraverser.commitIndex(); 
+		
+		IndexJungleTreeEditor editor = tree.getIndexTreeEditor();
+		Either<Error, JungleTreeEditor> either = editor.addNewChildAt(new DefaultNodePath().add(0), 0);
+		either.b().success();
+		
+		InterfaceTraverser newIfTraverser = tree.getTraverser();
+		TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = newIfTraverser.getIndex();
+		Assert.assertTrue(newIndex.get(key).some().get("<-1,0,0>").isNone());
+		Assert.assertEquals(newIndex.get(key).some().get("<-1,0,1>").some().head().right().toString(),"<-1,0,2>");
+		
+		}
+	public static String key = "KEY";
+	public static DefaultTreeNode factory = new DefaultTreeNode();
+
+	public void createTree(JungleTree tree) {
+		NodePath root = new DefaultNodePath();
+		createChildren(tree, root, 0);
+
+		for (int x = 0; x < 3; x++) {
+			createChildren(tree, root.add(0), x);
+			for (int y = 0; y < 3; y++) {
+				createChildren(tree, root.add(0).add(x), y);
+			}
+		}
+
+	}
+
+	public void createChildren(JungleTree tree, NodePath root, int num) {
+		JungleTreeEditor editor = tree.getTreeEditor();// Treeのeditorを作成
+		Either<Error, JungleTreeEditor> either = editor
+				.addNewChildAt(root, num); // 新しく入れるところへのパス
+		if (either.isA()) {
+			Assert.fail();
+		}
+		editor = either.b();
+		either = editor.success();
+		if (either.isA()) {
+			Assert.fail();
+		}
+		NodePath childPath = root.add(num);
+		editor = tree.getTreeEditor();
+		NodePath attribute = root.add(num);
+		System.out.println(attribute.toString());
+		either = editor.putAttribute(childPath, key,ByteBuffer.wrap(attribute.toString().getBytes()));
+		if (either.isA()) {
+			Assert.fail();
+		}
+		editor = either.b();
+		either = editor.success();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/DeleteChildrenIndexTest.java	Fri Oct 24 18:49:48 2014 +0900
@@ -0,0 +1,108 @@
+package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.index;
+
+import java.nio.ByteBuffer;
+import java.util.Iterator;
+
+import org.junit.Test;
+import org.junit.experimental.theories.suppliers.TestedOn;
+
+import fj.data.List;
+import fj.data.Option;
+import fj.data.TreeMap;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
+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.NodePath;
+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.transaction.DefaultTreeNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
+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;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
+import junit.framework.Assert;
+
+public class DeleteChildrenIndexTest {
+
+	@Test
+	public void DeleteChildrenTest(){
+		Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTreeEditor(new DefaultTraverser()));
+		jungle.createNewTree("tree");
+		JungleTree tree = jungle.getTreeByName("tree");
+		createTree(tree);
+		tree.getRootNode();
+		InterfaceTraverser ifTraverser = tree.getTraverser();
+
+		Iterator<Pair<TreeNode, NodePath>> pairIterator = ifTraverser.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>");
+
+		 for (;pairIterator.hasNext();pairIterator.next()) {
+			 
+		 }
+		//check index
+		ifTraverser.commitIndex();
+		TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = ifTraverser.getIndex();
+		Assert.assertTrue(index.get(key).some().get("<-1,0,0>").isSome());
+		
+		IndexJungleTreeEditor editor = tree.getIndexTreeEditor();
+		Either<Error, JungleTreeEditor> either = editor.deleteChildAt(new DefaultNodePath().add(0), 0);
+		either.b().success();
+		
+		InterfaceTraverser newIfTraverser = tree.getTraverser();
+		TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = newIfTraverser.getIndex();
+		Assert.assertEquals(newIndex.get(key).some().get("<-1,0,1>").some().head().right().toString(),"<-1,0,0>");
+		
+		}
+	public static String key = "KEY";
+	public static DefaultTreeNode factory = new DefaultTreeNode();
+
+	public void createTree(JungleTree tree) {
+		NodePath root = new DefaultNodePath();
+		createChildren(tree, root, 0);
+
+		for (int x = 0; x < 3; x++) {
+			createChildren(tree, root.add(0), x);
+			for (int y = 0; y < 3; y++) {
+				createChildren(tree, root.add(0).add(x), y);
+			}
+		}
+
+	}
+
+	public void createChildren(JungleTree tree, NodePath root, int num) {
+		JungleTreeEditor editor = tree.getTreeEditor();// Treeのeditorを作成
+		Either<Error, JungleTreeEditor> either = editor
+				.addNewChildAt(root, num); // 新しく入れるところへのパス
+		if (either.isA()) {
+			Assert.fail();
+		}
+		editor = either.b();
+		either = editor.success();
+		if (either.isA()) {
+			Assert.fail();
+		}
+		NodePath childPath = root.add(num);
+		editor = tree.getTreeEditor();
+		NodePath attribute = root.add(num);
+		System.out.println(attribute.toString());
+		either = editor.putAttribute(childPath, key,
+				ByteBuffer.wrap(attribute.toString().getBytes()));
+		if (either.isA()) {
+			Assert.fail();
+		}
+		editor = either.b();
+		either = editor.success();
+	}
+}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/DeleteChildrenTest.java	Tue Oct 21 19:47:25 2014 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.index;
-
-import java.nio.ByteBuffer;
-import java.util.Iterator;
-
-import org.junit.Test;
-import org.junit.experimental.theories.suppliers.TestedOn;
-
-import fj.data.List;
-import fj.data.Option;
-import fj.data.TreeMap;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
-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.NodePath;
-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.transaction.DefaultTreeNode;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
-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;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
-import junit.framework.Assert;
-
-public class DeleteChildrenTest {
-
-	@Test
-	public void DeleteChildrenTest(){
-		Jungle jungle = new DefaultJungle(null, "hogehoge",new DefaultTreeEditor(new DefaultTraverser()));
-		jungle.createNewTree("tree");
-		JungleTree tree = jungle.getTreeByName("tree");
-		createTree(tree);
-		tree.getRootNode();
-		InterfaceTraverser ifTraverser = tree.getTraverser();
-
-		Iterator<Pair<TreeNode, NodePath>> pairIterator = ifTraverser.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>");
-
-		 for (;pairIterator.hasNext();pairIterator.next()) {
-			 
-		 }
-		//check index
-		ifTraverser.commitIndex();
-		TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = ifTraverser.getIndex();
-		Assert.assertTrue(index.get(key).some().get("<-1,0,0>").isSome());
-		
-		IndexJungleTreeEditor editor = tree.getIndexTreeEditor();
-		Either<Error, JungleTreeEditor> either = editor.deleteChildAt(new DefaultNodePath().add(0), 0);
-		either.b().success();
-		
-		InterfaceTraverser newIfTraverser = tree.getTraverser();
-		TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = newIfTraverser.getIndex();
-		Assert.assertTrue(newIndex.get(key).some().get("<-1,0,0>").isNone());
-		Assert.assertEquals(newIndex.get(key).some().get("<-1,0,1>").some().head().right().toString(),"<-1,0,0>");
-		
-		}
-	public static String key = "KEY";
-	public static DefaultTreeNode factory = new DefaultTreeNode();
-
-	public void createTree(JungleTree tree) {
-		NodePath root = new DefaultNodePath();
-		createChildren(tree, root, 0);
-
-		for (int x = 0; x < 2; x++) {
-			createChildren(tree, root.add(0), x);
-			for (int y = 0; y < 2; y++) {
-				createChildren(tree, root.add(0).add(x), y);
-			}
-		}
-
-	}
-
-	public void createChildren(JungleTree tree, NodePath root, int num) {
-		JungleTreeEditor editor = tree.getTreeEditor();// Treeのeditorを作成
-		Either<Error, JungleTreeEditor> either = editor
-				.addNewChildAt(root, num); // 新しく入れるところへのパス
-		if (either.isA()) {
-			Assert.fail();
-		}
-		editor = either.b();
-		either = editor.success();
-		if (either.isA()) {
-			Assert.fail();
-		}
-		NodePath childPath = root.add(num);
-		editor = tree.getTreeEditor();
-		NodePath attribute = root.add(num);
-		System.out.println(attribute.toString());
-		either = editor.putAttribute(childPath, key,
-				ByteBuffer.wrap(attribute.toString().getBytes()));
-		if (either.isA()) {
-			Assert.fail();
-		}
-		editor = either.b();
-		either = editor.success();
-	}
-}