# HG changeset patch # User one # Date 1425607174 -32400 # Node ID 550f51183d8a37b5bb97855d30b1154531c62865 # Parent e26462a38ce0b8785391dc4c0ea7f881c4a1f746# Parent a2598139df64efd6f649ba9a02f2b7d652bee8c1 Merge with a2598139df64efd6f649ba9a02f2b7d652bee8c1 diff -r a2598139df64 -r 550f51183d8a .database.swp Binary file .database.swp has changed diff -r a2598139df64 -r 550f51183d8a .gradle/1.10/taskArtifacts/cache.properties.lock Binary file .gradle/1.10/taskArtifacts/cache.properties.lock has changed diff -r a2598139df64 -r 550f51183d8a .gradle/1.10/taskArtifacts/fileHashes.bin Binary file .gradle/1.10/taskArtifacts/fileHashes.bin has changed diff -r a2598139df64 -r 550f51183d8a .gradle/1.10/taskArtifacts/fileSnapshots.bin Binary file .gradle/1.10/taskArtifacts/fileSnapshots.bin has changed diff -r a2598139df64 -r 550f51183d8a .gradle/1.10/taskArtifacts/outputFileStates.bin Binary file .gradle/1.10/taskArtifacts/outputFileStates.bin has changed diff -r a2598139df64 -r 550f51183d8a .gradle/1.10/taskArtifacts/taskArtifacts.bin Binary file .gradle/1.10/taskArtifacts/taskArtifacts.bin has changed diff -r a2598139df64 -r 550f51183d8a .gradle/1.9/taskArtifacts/cache.properties.lock Binary file .gradle/1.9/taskArtifacts/cache.properties.lock has changed diff -r a2598139df64 -r 550f51183d8a .gradle/1.9/taskArtifacts/fileHashes.bin Binary file .gradle/1.9/taskArtifacts/fileHashes.bin has changed diff -r a2598139df64 -r 550f51183d8a .gradle/1.9/taskArtifacts/fileSnapshots.bin Binary file .gradle/1.9/taskArtifacts/fileSnapshots.bin has changed diff -r a2598139df64 -r 550f51183d8a .gradle/1.9/taskArtifacts/outputFileStates.bin Binary file .gradle/1.9/taskArtifacts/outputFileStates.bin has changed diff -r a2598139df64 -r 550f51183d8a .gradle/1.9/taskArtifacts/taskArtifacts.bin Binary file .gradle/1.9/taskArtifacts/taskArtifacts.bin has changed diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java Fri Mar 06 10:59:34 2015 +0900 @@ -45,7 +45,7 @@ e1.success(); } - public DefaultJungle(Journal journal,String uuid,TreeEditor editor) + public DefaultJungle(Journal journal,String uuid,TreeEditor editor) { this.journal = new NullJournal(); this.trees = new ConcurrentHashMap(); @@ -81,7 +81,7 @@ DefaultTreeNode root = new DefaultTreeNode(); TreeMap>> indexList = TreeMap.empty(Ord.stringOrd); - TreeMap parentIndex = new ParentIndex().getParentIndex(); + TreeMap parentIndex = new ParentIndex().getParentIndex(); ChangeSet set = new DefaultChangeSet(root,null,list,uuid,name,0,indexList,parentIndex); DefaultTreeContext tc = new DefaultTreeContext(root,set); JungleTree newTree = new DefaultJungleTree(tc,uuid,journal.getWriter(),editor); diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java Fri Mar 06 10:59:34 2015 +0900 @@ -16,4 +16,5 @@ public Either deleteAttribute(NodePath path,String key); public Either edit(NodePath path,NodeEditor editor); public Either success(); + public Either replaceNewRootNode(); } diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java Fri Mar 06 10:59:34 2015 +0900 @@ -5,5 +5,6 @@ APPEND_CHILD, DELETE_CHILD, PUT_ATTRIBUTE, - DELETE_ATTRIBUTE; + DELETE_ATTRIBUTE, + REPLACE_ROOT; } \ No newline at end of file diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Fri Mar 06 10:59:34 2015 +0900 @@ -79,4 +79,5 @@ LoggingNode logNode = editor.wrap(newRoot,newWrap.getOperationLog()); return DefaultEither.newB(logNode); } + } \ No newline at end of file diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java Fri Mar 06 10:59:34 2015 +0900 @@ -1,5 +1,8 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + public interface TreeNode{ public TreeNodeChildren getChildren(); @@ -8,4 +11,5 @@ public TreeNode createNewNode(); + public Either appendRootNode(); } diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java Fri Mar 06 10:59:34 2015 +0900 @@ -12,4 +12,5 @@ public Either addNewChildAt(int pos,TreeNode newChild); public Either replaceNode(int pos,TreeNode replacement); public List getChildrenAsRawList(); + public Either addExistTreeNodeToChildren(TreeNode node, int pos); } \ No newline at end of file diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java Fri Mar 06 10:59:34 2015 +0900 @@ -1,10 +1,19 @@ 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.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.ReplaceRootNodeOperation; +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 LoggingNode { + + private final TreeNode wrap; + private final OperationLog log; + public LoggingNode(TreeNode _wrap) { this(_wrap,new DefaultOperationLog()); @@ -16,9 +25,6 @@ log = _log; } - private final TreeNode wrap; - private final OperationLog log; - public LoggingAttributes getAttributes() { return new LoggingAttributes(wrap,log); @@ -35,9 +41,26 @@ return log; } - public TreeNode getWrap() - { - return wrap; - } + + public Either replaceNewRootNode() { + NodeOperation replaceRootNode = new ReplaceRootNodeOperation(); + return edit(replaceRootNode); + } + public Either edit(NodeOperation op){ + Either either = op.invoke(wrap); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TreeNode newWrap = either.b(); + OperationLog newLog = log.add(op); + LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog); + return DefaultEither.newB(newLoggingNode); + } + + public TreeNode getWrap() + { + return wrap; + } } diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/ReplaceRootNodeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/ReplaceRootNodeOperation.java Fri Mar 06 10:59:34 2015 +0900 @@ -0,0 +1,37 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +public class ReplaceRootNodeOperation implements NodeOperation { + + @Override + public Command getCommand() { + return Command.REPLACE_ROOT; + } + + @Override + public Either invoke(TreeNode target) { + return target.appendRootNode(); + } + + @Override + public int getPosition() { + return -1; + } + + @Override + public String getKey() { + return null; + } + + @Override + public ByteBuffer getValue() { + return null; + } + +} diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/replaceRootNodeAt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/replaceRootNodeAt.java Fri Mar 06 10:59:34 2015 +0900 @@ -0,0 +1,40 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.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 replaceRootNodeAt implements NodeEditor { + + + public Either _edit(LoggingNode _e) + { + Either either = _e.replaceNewRootNode(); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + + + @Override + public Either edit(TreeNode _e) { + LoggingNode logNode = wrap(_e); + return _edit(logNode); + } + + public LoggingNode wrap(TreeNode node) { + return new LoggingNode(node); + } + + + @Override + public LoggingNode wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + +} diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java Fri Mar 06 10:59:34 2015 +0900 @@ -2,10 +2,10 @@ import java.nio.ByteBuffer; - 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.DefaultTreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; @@ -15,6 +15,7 @@ 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.replaceRootNodeAt; 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; @@ -73,6 +74,13 @@ return DefaultEither.newB(newEditor); } + @Override + public Either replaceNewRootNode() + { + replaceRootNodeAt appendChildAt = new replaceRootNodeAt(); + return _edit(new DefaultNodePath(),appendChildAt); + } + @Override public Either addNewChildAt(NodePath _path, int _pos) { diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java Fri Mar 06 10:59:34 2015 +0900 @@ -58,7 +58,6 @@ } }; -System.out.println("transaction"); IndexManager indexManager = new IndexManager(repository.getReservation()); InterfaceTraverser traverser = new InterfaceTraverser(_newRoot, indexManager, true); traverser.createIndex(); diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java Fri Mar 06 10:59:34 2015 +0900 @@ -6,6 +6,9 @@ import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; public class DefaultTreeNode implements TreeNode { @@ -49,5 +52,12 @@ return new DefaultTreeNode(children,attrs); } + @Override + public Either appendRootNode() { + TreeNodeChildren newRootChildren = new DefaultTreeNodeChildren(NIL_LIST, NIL_MAP); + Either either = newRootChildren.addExistTreeNodeToChildren(this, 0); + return either; + } + } diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java Fri Mar 06 10:59:34 2015 +0900 @@ -130,4 +130,18 @@ return DefaultEither.newB(newNode); } + + @Override + public Either addExistTreeNodeToChildren(TreeNode node, int pos) { + + if(!boundaryCheck(pos) || pos < 0){ + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + P2,List> split = children.splitAt(pos); + List newChildren = split._1().snoc(node).append(split._2()); + TreeNode newNode = new DefaultTreeNode(newChildren,attrs); + return DefaultEither.newB(newNode); + } + } diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java Fri Mar 06 10:59:34 2015 +0900 @@ -21,10 +21,12 @@ List list = List.nil(); return list.cons(_root).iterator(); } + @Override public int size(){ return 1; } + @Override public Either at(int _pos){ if(_pos != 0){ @@ -38,6 +40,7 @@ Children chs = wrapper; Either>> ret = _traverse(chs,_evaluator,-1); + if(ret.isA()){ return DefaultEither.newA(ret.a()); } diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java Fri Mar 06 10:59:34 2015 +0900 @@ -1,6 +1,5 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - import java.util.Iterator; import fj.Ord; @@ -28,8 +27,8 @@ this(root, TreeMap.empty(Ord.stringOrd), new ParentIndex(), indexManager, indexFlag); } - public InterfaceTraverser(TreeNode root, TreeMap>> index, ParentIndex parentIndex, IndexManager indexManager, - boolean useIndex) { + public InterfaceTraverser(TreeNode root, TreeMap>> index, + ParentIndex parentIndex, IndexManager indexManager, boolean useIndex) { this.node = root; this.index = index; this.indexManager = indexManager; @@ -59,11 +58,10 @@ } public void createIndex() { - - long t1 = System.currentTimeMillis(); + // long t1 = System.currentTimeMillis(); IndexCreater creater = new IndexCreater(node); - long t2 = System.currentTimeMillis(); - // System.out.println("createIndex time = " + (t2 - t1)); + // long t2 = System.currentTimeMillis(); + // System.out.println("createIndex time = " + (t2 - t1)); index = creater.getIndex(); parentIndex = creater.getParentIndex(); } @@ -77,67 +75,68 @@ * @param searchValue * @return */ -// public Iterator findInSubTree(final Query query, TreeNode subTree, String key, String searchValue) { -// /* -// * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 -// * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す -// */ -// Iterator nodeIterator = index.get(key, searchValue); -// if (nodeIterator.hasNext() && useIndex) { -// -// // ここでNode以下にあるか調べる -// List 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() { -// -// private TreeNode matchNode = nextmatch(itNode); -// -// private TreeNode nextmatch(PathNodeIterator itNode) { -// -// for (; itNode.hasNext();) { -// TreeNode targetNode = itNode.next(); -// if (query.condition(targetNode)) -// return targetNode; -// } -// return null; -// } -// -// @Override -// public boolean hasNext() { -// if (matchNode == null) { -// return false; -// } -// return true; -// } -// -// @Override -// public TreeNode next() { -// TreeNode currentNode = matchNode; -// matchNode = nextmatch(itNode); -// return currentNode; -// } -// -// @Override -// public void remove() { -// } -// -// }; -// } -// } + // public Iterator findInSubTree(final Query query, TreeNode + // subTree, String key, String searchValue) { + // /* + // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 + // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す + // */ + // Iterator nodeIterator = index.get(key, searchValue); + // if (nodeIterator.hasNext() && useIndex) { + // + // // ここでNode以下にあるか調べる + // List 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() { + // + // private TreeNode matchNode = nextmatch(itNode); + // + // private TreeNode nextmatch(PathNodeIterator itNode) { + // + // for (; itNode.hasNext();) { + // TreeNode targetNode = itNode.next(); + // if (query.condition(targetNode)) + // return targetNode; + // } + // return null; + // } + // + // @Override + // public boolean hasNext() { + // if (matchNode == null) { + // return false; + // } + // return true; + // } + // + // @Override + // public TreeNode next() { + // TreeNode currentNode = matchNode; + // matchNode = nextmatch(itNode); + // return currentNode; + // } + // + // @Override + // public void remove() { + // } + // + // }; + // } + // } /** * subTree以下のNodeに対してKeyに対応する値をindexを使って探索する @@ -148,100 +147,71 @@ * @param searchValue * @return */ -// public Iterator findInSubTreeAllValue(final Query query, TreeNode subTree, String key) { -// /* -// * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得 -// * そのKeyを保有するNodeとNodeのPathを取得する -// * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 -// * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す -// */ -// Iterator NodeIterator = index.getAll(key); -// if (NodeIterator != null && useIndex) { -// List 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() { -// -// private TreeNode matchPair = nextmatch(itNode); -// -// private TreeNode nextmatch(PathNodeIterator itNode) { -// -// for (; itNode.hasNext();) { -// TreeNode targetNode = itNode.next(); -// if (query.condition(targetNode)) -// return targetNode; -// } -// return null; -// } -// -// @Override -// public boolean hasNext() { -// if (matchPair == null) { -// return false; -// } -// return true; -// } -// -// @Override -// public TreeNode next() { -// TreeNode currentNode = matchPair; -// matchPair = nextmatch(itNode); -// return currentNode; -// } -// -// @Override -// public void remove() { -// } -// -// }; -// } -// } + // public Iterator findInSubTreeAllValue(final Query query, TreeNode + // subTree, String key) { + // /* + // * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得 + // * そのKeyを保有するNodeとNodeのPathを取得する + // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 + // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す + // */ + // Iterator NodeIterator = index.getAll(key); + // if (NodeIterator != null && useIndex) { + // List 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() { + // + // private TreeNode matchPair = nextmatch(itNode); + // + // private TreeNode nextmatch(PathNodeIterator itNode) { + // + // for (; itNode.hasNext();) { + // TreeNode targetNode = itNode.next(); + // if (query.condition(targetNode)) + // return targetNode; + // } + // return null; + // } + // + // @Override + // public boolean hasNext() { + // if (matchPair == null) { + // return false; + // } + // return true; + // } + // + // @Override + // public TreeNode next() { + // TreeNode currentNode = matchPair; + // matchPair = nextmatch(itNode); + // return currentNode; + // } + // + // @Override + // public void remove() { + // } + // + // }; + // } + // } - -public Iterator get(String key, String value) { - - Option>> indexOp = index.get(key); - if (indexOp.isNone()) - return new NulIterator(); - - TreeMap> index = indexOp.some(); - Option> nodeMapOp = index.get(value); - - if (nodeMapOp.isNone()) - return new NulIterator(); - - Iterator> mapIterator = nodeMapOp.some().iterator(); - return new Iterator() { - - @Override - public boolean hasNext() { - return mapIterator.hasNext(); - } - - @Override - public TreeNode next() { - return mapIterator.next()._1(); - } - - }; -} - - public Iterator find(final Query query, final String key, String searchValue) { - Iterator nodeIterator = get(key, searchValue); + Iterator nodeIterator = get(key, searchValue); if (nodeIterator.hasNext() && useIndex) { return nodeIterator; } else { @@ -257,11 +227,13 @@ TreeNode targetNode = itNode.next(); String value = targetNode.getAttributes().getString(key); if (useIndex) { - if (value != null); -// index = index.set(key, value, targetNode); + if (value != null) + ; + // index = index.set(key, value, targetNode); } - if (parentUpdateFlag); - // parentIndex = parentIndex.set(targetNode); + if (parentUpdateFlag) + ; + // parentIndex = parentIndex.set(targetNode); if (query.condition(targetNode)) return targetNode; } @@ -293,59 +265,87 @@ } } -// public Iterator findAll(final Query query, final String key) { -// -// Iterator nodeList = index.getAll(key); -// if (nodeList != null && useIndex) { -// -// return nodeList; -// -// } else { -// -// final PathNodeIterator itNode = new PathNodeIterator(node); -// return new Iterator() { -// -// private TreeNode matchNode = nextmatch(itNode); -// -// private TreeNode nextmatch(PathNodeIterator itNode) { -// -// for (; itNode.hasNext();) { -// TreeNode targetNode = itNode.next(); -// String value = targetNode.getAttributes().getString(key); -// if (useIndex) { -// if (value != null) -// index = index.set(key, value, targetNode); -// } -// if (parentUpdateFlag); -// // parentIndex = parentIndex.set(targetNode); -// if (query.condition(targetNode)) -// return targetNode; -// } -// if (useIndex || parentUpdateFlag) -// 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() { -// } -// -// }; -// } -// } + // public Iterator findAll(final Query query, final String key) { + // + // Iterator nodeList = index.getAll(key); + // if (nodeList != null && useIndex) { + // + // return nodeList; + // + // } else { + // + // final PathNodeIterator itNode = new PathNodeIterator(node); + // return new Iterator() { + // + // private TreeNode matchNode = nextmatch(itNode); + // + // private TreeNode nextmatch(PathNodeIterator itNode) { + // + // for (; itNode.hasNext();) { + // TreeNode targetNode = itNode.next(); + // String value = targetNode.getAttributes().getString(key); + // if (useIndex) { + // if (value != null) + // index = index.set(key, value, targetNode); + // } + // if (parentUpdateFlag); + // // parentIndex = parentIndex.set(targetNode); + // if (query.condition(targetNode)) + // return targetNode; + // } + // if (useIndex || parentUpdateFlag) + // 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() { + // } + // + // }; + // } + // } + + public Iterator get(String key, String value) { + + Option>> indexOp = index.get(key); + if (indexOp.isNone()) + return new NulIterator(); + + TreeMap> index = indexOp.some(); + Option> nodeMapOp = index.get(value); + + if (nodeMapOp.isNone()) + return new NulIterator(); + + Iterator> mapIterator = nodeMapOp.some().iterator(); + return new Iterator() { + + @Override + public boolean hasNext() { + return mapIterator.hasNext(); + } + + @Override + public TreeNode next() { + return mapIterator.next()._1(); + } + + }; + } } diff -r a2598139df64 -r 550f51183d8a src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java Fri Mar 06 10:59:34 2015 +0900 @@ -5,7 +5,6 @@ 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; -import fj.Ord; import fj.data.Option; import fj.data.TreeMap; diff -r a2598139df64 -r 550f51183d8a src/test/java/DefaultJungleTreeTest.java --- a/src/test/java/DefaultJungleTreeTest.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/test/java/DefaultJungleTreeTest.java Fri Mar 06 10:59:34 2015 +0900 @@ -6,7 +6,6 @@ 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.IndexTreeEditor; 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; diff -r a2598139df64 -r 550f51183d8a src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java Fri Mar 06 10:59:34 2015 +0900 @@ -11,7 +11,6 @@ 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.IndexTreeEditor; 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; diff -r a2598139df64 -r 550f51183d8a src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/ReplaceRootNodeAt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/ReplaceRootNodeAt.java Fri Mar 06 10:59:34 2015 +0900 @@ -0,0 +1,39 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor; + +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.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; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +import junit.framework.Assert; + +import org.junit.Test; + +public class ReplaceRootNodeAt { + + @Test + public void ReplaceRootNodeAtTest() { + System.out.println("start"); + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + + TreeNode oldRoot = tree.getRootNode(); + Either either = editor.replaceNewRootNode(); + Assert.assertTrue(either.isB()); + JungleTreeEditor newTreeEditor = either.b(); + Assert.assertTrue(newTreeEditor.success().isB()); + TreeNode newRoot = tree.getRootNode(); + Assert.assertFalse(oldRoot.equals(newRoot)); + + Either childrenEither = newRoot.getChildren().at(0); + Assert.assertTrue(childrenEither.isB()); + TreeNode newRootChildren = childrenEither.b(); + Assert.assertEquals(oldRoot, newRootChildren); + } +} diff -r a2598139df64 -r 550f51183d8a src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java Fri Mar 06 10:59:34 2015 +0900 @@ -10,7 +10,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesTest; 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.DefaultTreeNodeAttribute; import junit.framework.TestCase; import junit.framework.TestSuite; diff -r a2598139df64 -r 550f51183d8a src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexFormTest.java --- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexFormTest.java Mon Feb 16 12:08:47 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexFormTest.java Fri Mar 06 10:59:34 2015 +0900 @@ -5,7 +5,6 @@ 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.transaction.DefaultTreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;