package org.neo4j.kernel.impl.traversal; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.Path; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.traversal.PruneEvaluator; import org.neo4j.graphdb.traversal.TraversalDescription; import org.neo4j.kernel.Traversal; public class TestMultiPruneEvaluators extends AbstractTestBase { @BeforeClass public static void setupGraph() { createGraph( "a to b", "a to c", "a to d", "a to e", "b to f", "b to g", "b to h", "c to i", "d to j", "d to k", "d to l", "e to m", "e to n", "k to o", "k to p", "k to q", "k to r" ); } @Test public void testMaxDepthAndCustomPruneEvaluatorCombined() { TraversalDescription description = new TraversalDescriptionImpl().filter( Traversal.returnAll() ) .prune( Traversal.pruneAfterDepth( 1 ) ).prune( new PruneEvaluator() { public boolean pruneAfter( Path position ) { int counter = 0; for ( Iterator<Relationship> rels = position.endNode().getRelationships( Direction.OUTGOING ).iterator(); rels.hasNext(); ) { counter++; rels.next(); } return counter < 3; } } ); Set<String> expectedNodes = new HashSet<String>( Arrays.asList( "a", "b", "c", "d", "e" ) ); for ( Path position : description.traverse( referenceNode() ) ) { String name = (String) position.endNode().getProperty( "name" ); assertTrue( name + " shouldn't have been returned", expectedNodes.remove( name ) ); } assertTrue( expectedNodes.isEmpty() ); } }