Mercurial > hg > Members > kazuma > jungle-ormapper
view src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/query/PathNodeIterator.java @ 0:44465893e8b8
first Commit
author | Kazuma |
---|---|
date | Wed, 30 Nov 2016 01:47:55 +0900 |
parents | |
children |
line wrap: on
line source
package jp.ac.u_ryukyu.ie.cr.jungle.query; import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren; import java.util.Iterator; import java.util.Stack; public class PathNodeIterator implements Iterator<TreeNode> { TreeNode root; TreeNode node; int childNumber; private TreeNodeChildren children; private Stack<TreeNode> nodeStack = new Stack<>(); private Stack<Integer> searchStack = new Stack<>(); /* * get queryIndexCondition from query * if already index exists, use index * otherwise traverse tree and create index * * */ public PathNodeIterator(TreeNode root) { this.root = root; this.node = root; } @Override public boolean hasNext() { return node != null; } @Override public TreeNode next() { TreeNode now = node; if (node.getChildren().size() > 0) { nodeStack.push(node); children = node.getChildren(); node = children.at(0).b(); childNumber = 1; searchStack.push(childNumber); } else if (node == root) { node = null; // no more node children = null; return now; }else if (children != null && children.size() > childNumber) { childNumber = searchStack.pop(); node = children.at(childNumber).b(); searchStack.push(++childNumber); } else { node = nodeStack.pop(); children = node.getChildren(); childNumber = searchStack.pop(); for (; children.size() == childNumber;) { if (node == root) { node = null; // no more node children = null; return now; } node = nodeStack.pop(); children = node.getChildren(); childNumber = searchStack.pop(); } if (node != null && childNumber < children.size()) { nodeStack.push(node); node = children.at(childNumber).b(); searchStack.push(++childNumber); } } return now; } @Override public void remove() { // TODO Auto-generated method stub } }