package org.neo4j.kernel.impl.traversal; import org.junit.Before; import org.junit.Test; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Path; import org.neo4j.graphdb.traversal.Evaluation; import org.neo4j.graphdb.traversal.Evaluator; import org.neo4j.graphdb.traversal.TraversalDescription; import org.neo4j.kernel.Traversal; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class EvaluatorStateTest extends AbstractTestBase { @Before public void clearGraph() { removeAllNodes( false ); } @Test public void shouldIncludeStateFromPreviousSteps() { createGraph( "a TO b", "b TO c" ); final Node nodeA = getNodeWithName( "a" ); final Node nodeB = getNodeWithName( "b" ); final Node nodeC = getNodeWithName( "c" ); TraversalDescription desc = Traversal.description().evaluator( new Evaluator() { @Override public Evaluation evaluate( Path path, Map<Object, Object> state ) { if ( path.endNode().equals( nodeB ) ) { state.put( "key", "value" ); } else if ( path.endNode().equals( nodeC ) ) { assertEquals( "value", state.get( "key" ) ); } return Evaluation.INCLUDE_AND_CONTINUE; } } ); for ( Path path : desc.traverse( nodeA ) ) { } } @Test public void shouldNotRememberStateFromOtherBranches() { createGraph( "a TO b1", "a TO b2" ); final Node nodeA = getNodeWithName( "a" ); final Node nodeB1 = getNodeWithName( "b1" ); final Node nodeB2 = getNodeWithName( "b2" ); TraversalDescription desc = Traversal.description().evaluator( new Evaluator() { @Override public Evaluation evaluate( Path path, Map<Object, Object> state ) { if ( path.endNode().equals( nodeB1 ) ) { state.put( "b1", "value" ); assertFalse( state.containsKey( "b2" ) ); } else if ( path.endNode().equals( nodeB2 ) ) { state.put( "b2", "value" ); assertFalse( state.containsKey( "b1" ) ); } return Evaluation.INCLUDE_AND_CONTINUE; } } ); for ( Path path : desc.traverse( nodeA ) ) { } } @Test public void shouldLetMultipleEvaluatorsChangeState() { createGraph( "a TO b" ); final Node nodeA = getNodeWithName( "a" ); final Node nodeB = getNodeWithName( "b" ); TraversalDescription desc = Traversal.description().evaluator( new Evaluator() { @Override public Evaluation evaluate( Path path, Map<Object, Object> state ) { if ( path.endNode().equals( nodeB ) ) { assertTrue( state.containsKey( "k1" ) ); assertTrue( state.containsKey( "k2" ) ); } return Evaluation.INCLUDE_AND_CONTINUE; } } ).evaluator( new Evaluator() { @Override public Evaluation evaluate( Path path, Map<Object, Object> state ) { if ( path.endNode().equals( nodeA ) ) { state.put( "k1", "k1" ); } return Evaluation.INCLUDE_AND_CONTINUE; } } ).evaluator( new Evaluator() { @Override public Evaluation evaluate( Path path, Map<Object, Object> state ) { if ( path.endNode().equals( nodeA ) ) { state.put( "k2", "k2" ); } return Evaluation.INCLUDE_AND_CONTINUE; } } ); for ( Path path : desc.traverse( nodeA ) ) { } } }