Mercurial > hg > Members > tatsuki > bench > jungle-core
view src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/DeleteChildrenIndexTest.java @ 143:afbe19c98f53
change Index form TreeMap<String,TreeMap<String<List<Pair<TreeNode,NodePath>>>> → TreeMap<String,TreeMap<String<List<NodePath>>>
bag
author | one |
---|---|
date | Sat, 15 Nov 2014 17:48:07 +0900 |
parents | 6e9a8d26e0cf |
children | 0854f9a9e81d |
line wrap: on
line source
package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.index; import java.nio.ByteBuffer; import java.util.Iterator; import org.junit.Test; import fj.data.List; 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<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<NodePath>>> newIndex = newIfTraverser.getIndex(); NodePath targetPath = newIndex.get(key).some().get("<-1,0,1>").some().head(); TreeNode targetNode = getTarget(tree.getRootNode(), targetPath); Assert.assertEquals(targetNode.getAttributes().getString(key), "<-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(); } public TreeNode getTarget(TreeNode node, NodePath path) { Pair<Integer, NodePath> removeHeadPath = path.pop(); if (removeHeadPath.left() == -1) return getTarget(node, removeHeadPath.right()); Either<Error, TreeNode> either = node.getChildren().at(removeHeadPath.left()); if (either.isA()) return node; TreeNode child = either.b(); if (removeHeadPath.right().size() == 0) return child; TreeNode target = getTarget(child, removeHeadPath.right()); return target; } }