changeset 310:474728dcfdb8

add PathType
author tatsuki
date Thu, 26 Jan 2017 23:44:14 +0900
parents f8e75ef7ac5d
children 9e9a15fb6e92
files src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/DefaultNodePath.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/NodePath.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/PathType.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/RedBlackTreeNodePath.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/editor/jungleTreeEditor/RedBlackJungleTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/editor/treeEditor/RedBlackTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Error/TreeEditorError.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungleNetwork/operations/NetworkNodePath.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/treeeditor/RedBlack/RedBlackTreeEditorAttributeTest.java
diffstat 9 files changed, 59 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/DefaultNodePath.java	Thu Jan 26 16:19:51 2017 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/DefaultNodePath.java	Thu Jan 26 23:44:14 2017 +0900
@@ -122,4 +122,10 @@
         return PathType.Default;
     }
 
+    @Override // Defultでは今の所使わない
+    public NodePath setType(PathType type) {
+        return null;
+    }
+
+
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/NodePath.java	Thu Jan 26 16:19:51 2017 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/NodePath.java	Thu Jan 26 23:44:14 2017 +0900
@@ -16,4 +16,5 @@
 	public String getKey();
 	public ByteBuffer getValue();
 	public PathType getPathType();
+	public NodePath setType(PathType type);
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/PathType.java	Thu Jan 26 16:19:51 2017 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/PathType.java	Thu Jan 26 23:44:14 2017 +0900
@@ -1,5 +1,5 @@
 package jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath;
 
 public enum PathType {
-    Default,RedBlack
+    Default,RedBlack,RedBlackNode,RedBlackAttribute
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/RedBlackTreeNodePath.java	Thu Jan 26 16:19:51 2017 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/nodepath/RedBlackTreeNodePath.java	Thu Jan 26 23:44:14 2017 +0900
@@ -11,36 +11,24 @@
 
     private final String key;
     private final ByteBuffer value;
-    /**
-     * traverserを使うかどうかのフラグ
-     * -2だった場合Traverserを使わない
-     * 主にノードの追加、削除等回転処理が行われる処理の場合に使う
-     * <p>
-     * それ以外の値だった場合Traverserを使う
-     * Attribute関係とか
-     * intの理由はgetで受け取れるから
-     * <p>
-     * flagはaddでセットする
-     * ココらへんは後でちゃんと直す
-     */
-    private int flags;
+    private final PathType type;
 
     public RedBlackTreeNodePath() {
         this.key = "default";
         this.value = ByteBuffer.wrap("default".getBytes());
-        this.flags = -2;
+        this.type = PathType.RedBlack;
     }
 
     public RedBlackTreeNodePath(String key, ByteBuffer value) {
         this.key = key;
         this.value = value;
-        this.flags = -2;
+        this.type = PathType.RedBlack;
     }
 
-    private RedBlackTreeNodePath(String key, ByteBuffer value, int flags) {
+    private RedBlackTreeNodePath(String key, ByteBuffer value, PathType type) {
         this.key = key;
         this.value = value;
-        this.flags = flags;
+        this.type = type;
     }
 
     @Override
@@ -55,7 +43,12 @@
 
     @Override
     public PathType getPathType() {
-        return PathType.RedBlack;
+        return type;
+    }
+
+    @Override
+    public NodePath setType(PathType type) {
+        return new RedBlackTreeNodePath(this.getKey(), this.getValue(), type);
     }
 
     //以下使わない
@@ -66,12 +59,12 @@
 
     @Override
     public int get(int index) {
-        return flags;
+        return -2;
     }
 
     @Override
     public NodePath add(int pos) {
-        return new RedBlackTreeNodePath(key, value, pos);
+        return null;
     }
 
     @Override
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/editor/jungleTreeEditor/RedBlackJungleTreeEditor.java	Thu Jan 26 16:19:51 2017 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/editor/jungleTreeEditor/RedBlackJungleTreeEditor.java	Thu Jan 26 23:44:14 2017 +0900
@@ -23,6 +23,7 @@
 
 import static jp.ac.u_ryukyu.ie.cr.jungle.util.Error.JungleTreeError.INVALID_ARGUMENT;
 import static jp.ac.u_ryukyu.ie.cr.jungle.util.Error.JungleTreeError.NOT_USE_METHOD;
+import static jp.ac.u_ryukyu.ie.cr.jungle.util.Error.TreeEditorError.UNDEFINE_NODEPATH;
 
 
 public class RedBlackJungleTreeEditor implements JungleTreeEditor {
@@ -81,43 +82,55 @@
      */
     @Override
     public Either<Error, JungleTreeEditor> addNewChildAndPutAttribute(NodePath path, int pos, String key, ByteBuffer value) {
+        if (path.getPathType() != PathType.RedBlack)
+            return DefaultEither.newA(UNDEFINE_NODEPATH);
         AppendChildAndPutAttribute appendChildAndPutAttribute = new AppendChildAndPutAttribute(key, value, pos);
-        return _edit(path, appendChildAndPutAttribute);
+        NodePath newParh = path.setType(PathType.RedBlackNode); //回転処理を行わないで木の複製を行う設定のPathに変えている… ダサい…
+        return _edit(newParh, appendChildAndPutAttribute);
     }
 
     @Override
     public Either<Error, JungleTreeEditor> addNewChildAt(NodePath path, int _pos) {
+        if (path.getPathType() != PathType.RedBlack)
+            return DefaultEither.newA(UNDEFINE_NODEPATH);
         ByteBuffer value = ByteBuffer.wrap("defaultValue".getBytes());
         return addNewChildAndPutAttribute(path, 0, balanceKey, value);
     }
 
     @Override
     public Either<Error, JungleTreeEditor> deleteChildAt(NodePath path, int pos) {
+        if (path.getPathType() != PathType.RedBlack)
+            return DefaultEither.newA(UNDEFINE_NODEPATH);
         String key = path.getKey();
         if (!key.equals(balanceKey))
             return DefaultEither.newA(INVALID_ARGUMENT);
+        NodePath newParh = path.setType(PathType.RedBlackNode); //回転処理を行わないで木の複製を行う設定のPathに変えている… ダサい…
         ByteBuffer value = path.getValue();
         RedBlackTreeDeleteChildAt deleteChildAt = new RedBlackTreeDeleteChildAt(key, value);
-        return _edit(path, deleteChildAt);
+        return _edit(newParh, deleteChildAt);
     }
 
     @Override
     public Either<Error, JungleTreeEditor> putAttribute(NodePath path, String key, ByteBuffer value) {
+        if (path.getPathType() != PathType.RedBlack)
+            return DefaultEither.newA(UNDEFINE_NODEPATH);
         if (key.equals(balanceKey))
             return DefaultEither.newA(INVALID_ARGUMENT);
         if (path.getPathType() != PathType.RedBlack)
             return DefaultEither.newA(INVALID_ARGUMENT);
         NodeEditor editor = new PutAttribute(key, value);
-        NodePath newParh = path.add(-1); //回転処理を行わないで木の複製を行う設定のPathに変えている… ダサい…
+        NodePath newParh = path.setType(PathType.RedBlackAttribute); //回転処理を行わないで木の複製を行う設定のPathに変えている… ダサい…
         return _edit(newParh, editor);
     }
 
     @Override
     public Either<Error, JungleTreeEditor> deleteAttribute(NodePath path, String _key) {
+        if (path.getPathType() != PathType.RedBlack)
+            return DefaultEither.newA(UNDEFINE_NODEPATH);
         if (_key.equals(balanceKey))
             return DefaultEither.newA(INVALID_ARGUMENT);
         DeleteAttribute deleteAttribute = new DeleteAttribute(_key);
-        NodePath newParh = path.add(-1); //回転処理を行わないで木の複製を行う設定のPathに変えている… ダサい…
+        NodePath newParh = path.setType(PathType.RedBlackAttribute); //回転処理を行わないで木の複製を行う設定のPathに変えている… ダサい…
         return _edit(newParh, deleteAttribute);
     }
 
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/editor/treeEditor/RedBlackTreeEditor.java	Thu Jan 26 16:19:51 2017 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/editor/treeEditor/RedBlackTreeEditor.java	Thu Jan 26 23:44:14 2017 +0900
@@ -3,6 +3,7 @@
 import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List;
 import jp.ac.u_ryukyu.ie.cr.jungle.store.logger.LoggingNode;
 import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.NodePath;
+import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.PathType;
 import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor;
 import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNodeChildren;
@@ -24,7 +25,7 @@
 
     @Override
     public Either<Error, LoggingNode> edit(TreeNode root, NodePath path, NodeEditor editor) {
-        if (path.get(0) == -2)
+        if (path.getPathType() == PathType.RedBlackNode)
             return redBlackTreeNodeEdit(root, editor);
         Evaluator e = new RedBlackTreeEvaluator(path);
         Either<Error, Traversal> traverseEither = traverser.traverse(root, e);
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Error/TreeEditorError.java	Thu Jan 26 16:19:51 2017 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Error/TreeEditorError.java	Thu Jan 26 23:44:14 2017 +0900
@@ -3,6 +3,7 @@
 public class TreeEditorError
 {
 	public static final Error NODEPATH_NOTFOUND = new DefaultError();
+	public static final Error UNDEFINE_NODEPATH = new DefaultError();
 	public static final Error NOT_USE_METHOD = new DefaultError();
 	public static final Error ADD_NEW_CHILD_ERROR = new DefaultError();
 	public static final Error UNDEFINENODE_PARENT_NOT_FOUND = new DefaultError();
@@ -11,3 +12,4 @@
 	public static final Error SET_APPENDEDNODE_ERROR= new DefaultError();
 	public static final Error DELETE_VALUE_NOT_FOUND = new DefaultError();
 }
+
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/jungleNetwork/operations/NetworkNodePath.java	Thu Jan 26 16:19:51 2017 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungleNetwork/operations/NetworkNodePath.java	Thu Jan 26 23:44:14 2017 +0900
@@ -13,10 +13,12 @@
 @Message
 public class NetworkNodePath implements NodePath {
     LinkedList<Integer> path;
+    PathType type;
 
     public NetworkNodePath() {
         path = new LinkedList<Integer>();
         path.add(-1);
+        type = PathType.Default;
     }
 
     public NetworkNodePath(NodePath _p) {
@@ -24,6 +26,15 @@
         for (Integer pos : _p) {
             path.add(pos);
         }
+        type = _p.getPathType();
+    }
+
+    public NetworkNodePath(NodePath _p, PathType type) {
+        path = new LinkedList<Integer>();
+        for (Integer pos : _p) {
+            path.add(pos);
+        }
+        this.type = type;
     }
 
     private NetworkNodePath(LinkedList<Integer> _path) {
@@ -107,4 +118,9 @@
     public PathType getPathType() {
         return PathType.Default;
     }
+
+    @Override //ネットワークでは今のところ使わない
+    public NodePath setType(PathType type) {
+        return null;
+    }
 }
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/treeeditor/RedBlack/RedBlackTreeEditorAttributeTest.java	Thu Jan 26 16:19:51 2017 +0900
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/treeeditor/RedBlack/RedBlackTreeEditorAttributeTest.java	Thu Jan 26 23:44:14 2017 +0900
@@ -38,7 +38,6 @@
         }
 
         JungleTreeEditor editor = tree.getJungleTreeEditor();
-        path = path.add(1);
         NodePath rbtPath = new RedBlackTreeNodePath(balanceKey,ByteBuffer.wrap(("value6".getBytes())));
         Either<Error, JungleTreeEditor> either = editor.putAttribute(rbtPath, key, testPutValue);
         Assert.assertFalse(either.isA()); //AttributeのPutが成功したかどうか調べる
@@ -51,8 +50,7 @@
         TreeNode attributePutedTreeRoot = tree.getRootNode();
         Assert.assertNotEquals(attributePutedTreeRoot,oldRoot);//// とりあえずルートがちゃんと入れ替えられているかを調べる
 
-
-        TreeNode editedNode = tree.getNodeOfPath(path).b();
+        
         InterfaceTraverser traverser = tree.getTraverser(true);
         Iterator<TreeNode> nodeIterator = traverser.find((TreeNode n) -> {
             Attributes attributes = n.getAttributes();