package org.neo4j.meta.model;
import java.util.Iterator;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.ReturnableEvaluator;
import org.neo4j.graphdb.StopEvaluator;
import org.neo4j.graphdb.TraversalPosition;
import org.neo4j.graphdb.Traverser.Order;
public class RecursiveInstanceTraverser implements Iterable<Node>
{
private final GraphDatabaseService graphDb;
private final Node node;
private final MetaModel model;
public RecursiveInstanceTraverser( GraphDatabaseService graphDb, Node node,
MetaModel model )
{
this.graphDb = graphDb;
this.node = node;
this.model = model;
}
public Iterator<Node> iterator()
{
ReturnableEvaluator eval = new ReturnableEvaluator()
{
public boolean isReturnableNode( TraversalPosition position )
{
if ( position.notStartNode() && position.lastRelationshipTraversed().isType(
MetaModelRelTypes.META_HAS_INSTANCE ) )
{
return true;
}
return false;
}
};
return node.traverse( Order.BREADTH_FIRST, StopEvaluator.END_OF_GRAPH, eval,
MetaModelRelTypes.META_HAS_INSTANCE, Direction.OUTGOING,
MetaModelRelTypes.META_IS_SUBCLASS_OF, Direction.INCOMING ).iterator();
}
}