# HG changeset patch # User one # Date 1414445734 -32400 # Node ID ec166c8ff079c2a8e91c21076cf1f2d7d03309ed # Parent b998fdc99bc005919da6cca2a3e4f4ed55ef98d5 add findAll and findInSubTreeAll diff -r b998fdc99bc0 -r ec166c8ff079 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 Oct 27 19:04:59 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java Tue Oct 28 06:35:34 2014 +0900 @@ -1,23 +1,14 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; import java.util.Iterator; -import java.util.concurrent.atomic.AtomicReference; 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.JungleTree; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; 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.transaction.AtomicReservableReference; -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.IndexJungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; 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; @@ -25,207 +16,374 @@ public class InterfaceTraverser { - //InterfaceTraverser traverser; - TreeNode node; - TreeMap>>> index; - IndexManager indexManager; + // InterfaceTraverser traverser; + TreeNode node; + TreeMap>>> index; + IndexManager indexManager; + + public InterfaceTraverser(TreeNode _root, IndexManager indexManager) { + this.node = _root; + this.index = TreeMap.empty(Ord.stringOrd); + this.indexManager = indexManager; + } + + public InterfaceTraverser(TreeNode _root, TreeMap>>> index, + IndexManager indexManager) { + this.node = _root; + this.index = index; + this.indexManager = indexManager; + } + + public void commitIndex() { + indexManager.commit(index); + } + + public TreeMap>>> getIndex() { + return index; + } - public InterfaceTraverser(TreeNode _root, IndexManager indexManager) { - this.node = _root; - this.index = TreeMap.empty(Ord.stringOrd); - this.indexManager = indexManager; - } + public void setIndex(TreeMap>>> index) { + this.index = index; + } - public InterfaceTraverser( - TreeNode _root, - TreeMap>>> index, - IndexManager indexManager) { - this.node = _root; - this.index = index; - this.indexManager = indexManager; - } + /** + * subTree以下のNodeに対してKey,Valueのペアでindexを使って探索を行う + * + * @param query + * @param subTree + * @param key + * @param searchValue + * @return + */ + public Iterator> findInSubTree(Query query, Pair subTree, String key, + String searchValue) { + /* + * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 + * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す + */ + + if (index.get(key).isSome()) { + + TreeMap>> innerIndex = this.index.get(key).some(); + + Option>> opList = innerIndex.get(searchValue); - public void commitIndex(){ - indexManager.commit(index); - } + if (opList.isNone()) + return null;// 空のIteratorを返す + + List> list = opList.some(); + NodePath targetNodePath = subTree.right(); + List> filteredList = List.nil(); + for (Pair pair : list) { + NodePath compareNodePath = pair.right(); + if (targetNodePath.compare(compareNodePath)) + filteredList = filteredList.cons(pair); + + } + + return filteredList.iterator(); + + } else { + final PathNodeIterator itNode = new PathNodeIterator(subTree.left()); + return new Iterator>() { + + private Pair matchPair = nextmatch(itNode); + + private Pair nextmatch(PathNodeIterator itNode) { - public TreeMap>>> getIndex() { - return index; - } + for (; itNode.hasNext();) { + Pair pathNode = itNode.next(); + if (query.condition(pathNode.left())) + return pathNode; + } + return null; + } - public void setIndex( - TreeMap>>> index) { - this.index = index; + @Override + public boolean hasNext() { + if (matchPair == null) { + return false; + } + return true; + } + + @Override + public Pair next() { + Pair currentPair = matchPair; + matchPair = nextmatch(itNode); + return currentPair; + } + + @Override + public void remove() { + } + + }; } - - - - /* public InterfaceTraverser getTraverser(JungleTree tree) { - return new InterfaceTraverser(tree.getRootNode(), tree.getIndex(), - tree.getIndexTreeEditor()); - }*/ - - public void set(TreeNode root) { - this.node = root; - } - + } - /** - * subTree以下のNodeに対してKey,Valueのペアでindexを使って探索を行う - * @param query - * @param subTree - * @param key - * @param searchValue - * @return + /** + * subTree以下のNodeに対してKeyに対応する値をindexを使って探索する + * + * @param query + * @param subTree + * @param key + * @param searchValue + * @return + */ + public Iterator> findInSubTreeAllValue(Query query, Pair subTree, + String key) { + /* + * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得 + * そのKeyを保有するNodeとNodeのPathを取得する + * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 + * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す */ - public Iterator> findInSubTree(Query query, TreeNode subTree, String key, String searchValue){ - /* - * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 - * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す - */ - final PathNodeIterator itNode = new PathNodeIterator(subTree); - return new Iterator>() { + + if (index.get(key).isSome()) { + + TreeMap>> innerIndex = this.index.get(key).some(); + List searchValues = innerIndex.keys(); + List> filteredList = List.nil(); + NodePath targetNodePath = subTree.right(); + + for (String searchValue : searchValues) { + Option>> opList = innerIndex.get(searchValue); + + if (opList.isNone()) + continue; + + List> list = opList.some(); + for (Pair pair : list) { + NodePath compareNodePath = pair.right(); + if (targetNodePath.compare(compareNodePath)) + filteredList = filteredList.cons(pair); + + } + } + return filteredList.iterator(); - private Pair matchPair = nextmatch(itNode); + } else { + final PathNodeIterator itNode = new PathNodeIterator(subTree.left()); + return new Iterator>() { + + private Pair matchPair = nextmatch(itNode); + + private Pair nextmatch(PathNodeIterator itNode) { - private Pair nextmatch( - PathNodeIterator itNode) { + for (; itNode.hasNext();) { + Pair pathNode = itNode.next(); + if (query.condition(pathNode.left())) + return pathNode; + } + return null; + } + + @Override + public boolean hasNext() { + if (matchPair == null) { + return false; + } + return true; + } - for (; itNode.hasNext();) { - Pair pathNode = itNode.next(); - if (query.condition(pathNode.left())) - return pathNode; - } - return null; - } + @Override + public Pair next() { + Pair currentPair = matchPair; + matchPair = nextmatch(itNode); + return currentPair; + } + + @Override + public void remove() { + } + + }; + } + } + + public Iterator> find(Query query, String key, String searchValue) { + + if (index.get(key).isSome()) { + + TreeMap>> innerIndex = this.index.get(key).some(); + Option>> opList = innerIndex.get(searchValue); + + if (opList.isNone()) + return null;// 空のIteratorを返す + + final List> list = opList.some(); + return list.iterator(); + + } else { + + final PathNodeIterator itNode = new PathNodeIterator(node); + return new Iterator>() { - @Override - public boolean hasNext() { - if (matchPair == null) { - // index = itNode.getIndex(); - return false; + private Pair matchPair = nextmatch(itNode); + + private Pair nextmatch(PathNodeIterator itNode) { + + for (; itNode.hasNext();) { + Pair pathNode = itNode.next(); + String value = pathNode.left().getAttributes().getString(key); + Option>>> innerIndexOp = index.get(key); + + if (value != null) { + if (innerIndexOp.isNone()) { + + TreeMap>> innerIndex = TreeMap.empty(Ord.stringOrd); + List> list = List.nil(); + list = list.cons(pathNode); + innerIndex = innerIndex.set(value, list); + index = index.set(key, innerIndex); + + } else { + + TreeMap>> innerIndex = innerIndexOp.some(); + Option>> opList = innerIndex.get(value); + + if (opList.isNone()) { + + List> list = List.nil(); + list = list.cons(pathNode); + innerIndex = innerIndex.set(value, list); + + } else { + + List> list = opList.some(); + list = list.cons(pathNode); + innerIndex = innerIndex.set(value, list); + } - return true; - } + index = index.set(key, innerIndex); - @Override - public Pair next() { - Pair currentPair = matchPair; - matchPair = nextmatch(itNode); - return currentPair; - } - - @Override - public void remove() { - // TODO Auto-generated method stub - + } } - }; - - } - - - public Iterator> find(Query query, String key, - String searchValue) { - - if (index.get(key).isSome()) { + if (query.condition(pathNode.left())) + return pathNode; + } + return null; + } - TreeMap>> innerIndex = this.index - .get(key).some(); - Option>> opList = innerIndex - .get(searchValue); + @Override + public boolean hasNext() { + if (matchPair == null) { + // index = itNode.getIndex(); + return false; + } + return true; + } - if (opList.isNone()) - return null;// 空のIteratorを返す - - final List> list = opList.some(); - return list.iterator(); - - } else { + @Override + public Pair next() { + Pair currentPair = matchPair; + matchPair = nextmatch(itNode); + return currentPair; + } - final PathNodeIterator itNode = new PathNodeIterator(node); - return new Iterator>() { + @Override + public void remove() { + } - private Pair matchPair = nextmatch(itNode); + }; + } + } - private Pair nextmatch( - PathNodeIterator itNode) { + + public Iterator> findAll(Query query, String key) { - for (; itNode.hasNext();) { - Pair pathNode = itNode.next(); - String value = pathNode.left().getAttributes() - .getString(key); - Option>>> innerIndexOp = index - .get(key); + if (index.get(key).isSome()) { - if (value != null) { - if (innerIndexOp.isNone()) { + TreeMap>> innerIndex = this.index.get(key).some(); + List searchValues = innerIndex.keys(); + List> valueList = List.nil(); - TreeMap>> innerIndex = TreeMap - .empty(Ord.stringOrd); - List> list = List - .nil(); - list = list.cons(pathNode); - innerIndex = innerIndex.set(value, list); - index = index.set(key, innerIndex); + for (String searchValue : searchValues) { + Option>> opList = innerIndex.get(searchValue); - } else { + if (opList.isNone()) + continue; - TreeMap>> innerIndex = innerIndexOp - .some(); - Option>> opList = innerIndex - .get(value); + List> list = opList.some(); + valueList = valueList.append(list); + } + return valueList.iterator(); - if (opList.isNone()) { + } else { - List> list = List - .nil(); - list = list.cons(pathNode); - innerIndex = innerIndex.set(value, list); + final PathNodeIterator itNode = new PathNodeIterator(node); + return new Iterator>() { - } else { + private Pair matchPair = nextmatch(itNode); + + private Pair nextmatch(PathNodeIterator itNode) { - List> list = opList - .some(); - list = list.cons(pathNode); - innerIndex = innerIndex.set(value, list); + for (; itNode.hasNext();) { + Pair pathNode = itNode.next(); + String value = pathNode.left().getAttributes().getString(key); + Option>>> innerIndexOp = index.get(key); - } - index = index.set(key, innerIndex); - - } - } + if (value != null) { + if (innerIndexOp.isNone()) { - if (query.condition(pathNode.left())) - return pathNode; - } - return null; - } + TreeMap>> innerIndex = TreeMap.empty(Ord.stringOrd); + List> list = List.nil(); + list = list.cons(pathNode); + innerIndex = innerIndex.set(value, list); + index = index.set(key, innerIndex); + + } else { + + TreeMap>> innerIndex = innerIndexOp.some(); + Option>> opList = innerIndex.get(value); - @Override - public boolean hasNext() { - if (matchPair == null) { - // index = itNode.getIndex(); - return false; - } - return true; - } + if (opList.isNone()) { + + List> list = List.nil(); + list = list.cons(pathNode); + innerIndex = innerIndex.set(value, list); - @Override - public Pair next() { - Pair currentPair = matchPair; - matchPair = nextmatch(itNode); - return currentPair; - } + } else { - @Override - public void remove() { - // TODO Auto-generated method stub + List> 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 next() { + Pair currentPair = matchPair; + matchPair = nextmatch(itNode); + return currentPair; + } + + @Override + public void remove() { + } + + }; } + } } diff -r b998fdc99bc0 -r ec166c8ff079 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java Mon Oct 27 19:04:59 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java Tue Oct 28 06:35:34 2014 +0900 @@ -40,7 +40,7 @@ public Pair next() { TreeNode now = node; NodePath currentPath = path; - System.out.println("path = " + currentPath.toString()); + // System.out.println("path = " + currentPath.toString()); if (node.getChildren().size() > 0) { // nodeStack.push(node); path = path.add(0); diff -r b998fdc99bc0 -r ec166c8ff079 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/AddNewChildrenIndexEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/AddNewChildrenIndexEditor.java Mon Oct 27 19:04:59 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/AddNewChildrenIndexEditor.java Tue Oct 28 06:35:34 2014 +0900 @@ -58,7 +58,7 @@ List> pairList = innerIndex.get(innerIndexKey).some(); List> list = checkPath(pairList); if (!list.isEmpty()){ - System.out.println(new String(list.head().left().getAttributes().get("KEY").array())); + //System.out.println(new String(list.head().left().getAttributes().get("KEY").array())); newInnerIndex = newInnerIndex.set(innerIndexKey, list); } } @@ -76,7 +76,7 @@ for (Pair pair : pairList) { NodePath path = pair.right(); - System.out.println("oldPath = " + path.toString()); + //System.out.println("oldPath = " + path.toString()); NodePath newPath = new DefaultNodePath(); @@ -112,7 +112,7 @@ } - System.out.println("newPath = " + newPath.toString()); + //System.out.println("newPath = " + newPath.toString()); Pair newPair = new Pair(pair.left(), newPath); list = list.cons(newPair); } diff -r b998fdc99bc0 -r ec166c8ff079 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java Mon Oct 27 19:04:59 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java Tue Oct 28 06:35:34 2014 +0900 @@ -58,7 +58,7 @@ list = list.cons(pathNode); innerIndex = innerIndex.set(attribute, list); TreeMap>>> newIndex = index.set(key, innerIndex); - return index; + return newIndex; } else { TreeMap>> innerIndex = innerIndexOp.some();