Mercurial > hg > Members > tatsuki > bench > jungle-core
view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java @ 188:868a746996ad
minner change
author | tatsuki |
---|---|
date | Fri, 17 Apr 2015 22:12:44 +0900 |
parents | 209df7faa37c |
children |
line wrap: on
line source
package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; import java.util.Iterator; import java.util.Optional; import fj.data.List; import jp.ac.u_ryukyu.ie.cr.tatsuki.TreeMap.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIterator; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.Query; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexCreater; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public class InterfaceTraverser { TreeNode root; TreeMap<String, TreeMap<String, List<TreeNode>>> indexList; ParentIndex parentIndex; boolean parentUpdateFlag; boolean useIndex; public InterfaceTraverser(TreeNode root, boolean indexFlag) { this(root, new TreeMap<>(), new ParentIndex(), indexFlag); } public InterfaceTraverser(TreeNode root, TreeMap<String, TreeMap<String, List<TreeNode>>> index, ParentIndex parentIndex, boolean useIndex) { this.root = root; this.indexList = index; this.parentIndex = parentIndex; if (parentIndex.isEmpty()) parentUpdateFlag = true; else parentUpdateFlag = false; this.useIndex = useIndex; } public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { return indexList; } public void commit() { parentUpdateFlag = false; } public ParentIndex getParentIndex() { return parentIndex; } public void createIndex() { // long t1 = System.currentTimeMillis(); IndexCreater creater = new IndexCreater(root); // long t2 = System.currentTimeMillis(); // System.out.println("createIndex time = " + (t2 - t1)); indexList = creater.getIndex(); parentIndex = creater.getParentIndex(); } /** * subTree以下のNodeに対してKey,Valueのペアでindexを使って探索を行う * * @param query * @param subTree * @param key * @param searchValue * @return */ // public Iterator<TreeNode> findInSubTree(final Query query, TreeNode // subTree, String key, String searchValue) { // /* // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す // */ // Iterator<TreeNode> nodeIterator = index.get(key, searchValue); // if (nodeIterator.hasNext() && useIndex) { // // // ここでNode以下にあるか調べる // List<TreeNode> 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<TreeNode>() { // // 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を使って探索する */ // public Iterator<TreeNode> 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<TreeNode> NodeIterator = index.getAll(key); // if (NodeIterator != null && useIndex) { // List<TreeNode> 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<TreeNode>() { // // 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<TreeNode> find(final Query query, final String key, String searchValue) { Iterator<TreeNode> nodeIterator = get(key, searchValue); if (nodeIterator != null && useIndex) { return nodeIterator; } else { final PathNodeIterator itNode = new PathNodeIterator(root); return new Iterator<TreeNode>() { 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<TreeNode> findAll(final Query query, final String key) { // // Iterator<TreeNode> nodeList = index.getAll(key); // if (nodeList != null && useIndex) { // // return nodeList; // // } else { // // final PathNodeIterator itNode = new PathNodeIterator(node); // return new Iterator<TreeNode>() { // // 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<TreeNode> get(String key, String value) { Optional<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); if (!indexOp.isPresent()) return null; Optional<List<TreeNode>> nodeListOp = indexOp.get().get(value); if (!nodeListOp.isPresent()) return new NulIterator<TreeNode>(); return nodeListOp.get().iterator(); } }