Skip to content

Commit

Permalink
Implementing support for traversing of any depth [#15 state:open]
Browse files Browse the repository at this point in the history
  • Loading branch information
andreasronge committed Jan 14, 2009
1 parent 973cd65 commit 1771806
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 6 deletions.
15 changes: 9 additions & 6 deletions lib/neo4j/relations/node_traverser.rb
Expand Up @@ -17,6 +17,15 @@ def initialize(internal_node)
@types_and_dirs = []
end

def depth(d)
if d == :all
@stop_evaluator = org.neo4j.api.core.StopEvaluator::END_OF_GRAPH
else
@stop_evaluator = DepthStopEvaluator.new(d)
end
self
end

def outgoing(*types)
types.each do |type|
@types_and_dirs << RelationshipType.instance(type)
Expand Down Expand Up @@ -61,12 +70,6 @@ def iterator
raise IllegalTraversalArguments.new "Unknown type of relationship. Needs to know which type(s) of relationship in order to traverse. Please use the outgoing, incoming or both method."
end

# create the traverser iterator
# @internal_node.traverse(org.neo4j.api.core.Traverser::Order::BREADTH_FIRST,
# @stop_evaluator,
# org.neo4j.api.core.ReturnableEvaluator::ALL_BUT_START_NODE,
# RelationshipType.instance(@type),
# @direction).iterator
@internal_node.traverse(org.neo4j.api.core.Traverser::Order::BREADTH_FIRST,
@stop_evaluator,
org.neo4j.api.core.ReturnableEvaluator::ALL_BUT_START_NODE,
Expand Down
58 changes: 58 additions & 0 deletions test/neo4j/node_traverser_spec.rb
Expand Up @@ -125,6 +125,64 @@ class TestNode
t2.traverse.incoming(:friends).to_a.should include(t1)
t3.traverse.incoming(:friends).to_a.should include(t1)
end

it "should find outgoing nodes of depth 2" do
# given
t = TestNode.new
t1 = TestNode.new
t11 = TestNode.new
t111 = TestNode.new
t12 = TestNode.new
t2 = TestNode.new

t.friends << t1 << t2
t1.friends << t12 << t11
t11.friends << t111

# when and then
t1_outgoing = t1.traverse.outgoing(:friends).depth(2).to_a
t1_outgoing.size.should == 3
t1_outgoing.should include(t11, t111, t12)
end

it "should find outgoing nodes of depth all" do
# given
t = TestNode.new
t1 = TestNode.new
t11 = TestNode.new
t111 = TestNode.new
t12 = TestNode.new
t2 = TestNode.new

t.friends << t1 << t2
t1.friends << t12 << t11
t11.friends << t111

# when and then
t_outgoing = t.traverse.outgoing(:friends).depth(:all).to_a
t_outgoing.size.should == 5
t_outgoing.should include(t1,t11, t111,t12,t2)
end

it "should find incoming nodes of depth 2" do
# given
t = TestNode.new
t1 = TestNode.new
t11 = TestNode.new
t111 = TestNode.new
t12 = TestNode.new
t2 = TestNode.new

t.friends << t1 << t2
t1.friends << t12 << t11
t11.friends << t111

# when and then
t11_incoming = t11.traverse.incoming(:friends).depth(2).to_a
t11_incoming.size.should == 2
t11_incoming.should include(t, t1)
end

end


Expand Down

0 comments on commit 1771806

Please sign in to comment.