Skip to content

Commit

Permalink
traverser impl: incoming/outgoing/to_other and rspecs
Browse files Browse the repository at this point in the history
  • Loading branch information
lordkada committed Oct 27, 2011
1 parent bd75b02 commit 413163d
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 19 deletions.
4 changes: 2 additions & 2 deletions lib/neology/relationship_mixin/class_methods.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ def load graph_rel_id
def _load graph_rel

if graph_rel["data"]["_classname"]
wrapper_class = Object.const_get(graph_rel["data"]["_classname"])
wrapper_class = Neology.const_get(graph_rel["data"]["_classname"].split('::').last)
else
wrapper_class = Neography::Relationship
wrapper_class = Neology::Relationship
end

wrapper_class.old_new(graph_rel,
Expand Down
2 changes: 1 addition & 1 deletion lib/neology/rels_mixin/rels_mixin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def rel direction, rel_name
end

def rels(*rel_name)
Traverser.new(relationships_values_hash, rel_name)
Traverser.new(self.inner_node, *rel_name)
end

private
Expand Down
75 changes: 64 additions & 11 deletions lib/neology/traverser/traverser.rb
Original file line number Diff line number Diff line change
@@ -1,10 +1,31 @@
require 'neology/relationship'

module Neology

class Traverser

def initialize relationship_values_hash, rel_names
@relationship_values_hash = relationship_values_hash
@rel_names = rel_names
def initialize from_node, *rel_names
@from_node = from_node
@all = rel_names
@to_other = nil
@incoming = []
@outgoing = []
@return = "relationships"
end

def to_other to_other
@to_other = to_other
self
end

def incoming rel_name
@incoming << rel_name
self
end

def outgoing rel_name
@outgoing << rel_name
self
end

def each &block
Expand Down Expand Up @@ -35,19 +56,51 @@ def rels

def calc_rels

keys = (@rel_names.size == 0) ? @relationship_values_hash.keys : @rel_names
options = { }

#relationships

keys.inject([]) { |memo, key|
relationships = @all.inject ([]) do |memo, rel_name|
memo << {
"type" => rel_name,
"direction" => "all"
}
end

rel = @relationship_values_hash[key]
relationships = @incoming.inject (relationships) do |memo, rel_name|
memo << {
"type" => rel_name,
"direction" => "in"
}
end

if (rel.respond_to?(:each))
memo.concat rel
else
memo<<rel
relationships = @outgoing.inject (relationships) do |memo, rel_name|
memo << {
"type" => rel_name,
"direction" => "out"
}
end

options["relationships"] = relationships if relationships

#filters
if @to_other

options["return filter"] = {
"body" => "position.endNode().id == #{@to_other.id}",
"language" => "javascript"

}

end

Neology::NeoServer.traverse(@from_node, @return, options).collect do |item|

if (item["data"]["_classname"])
Neology.const_get(item["data"]["_classname"].split('::').last)._load item
end

}
end

end

Expand Down
82 changes: 77 additions & 5 deletions spec/relationship_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,8 @@
voters.size.should == 4
voters.collect { |rel|
rel.end_node
}.should =~ [voter_1, voter_2, voter_3, voter_4]
rel.end_node.id
}.should =~ [voter_1.id, voter_2.id, voter_3.id, voter_4.id]
comment.del
user.del
Expand All @@ -142,11 +142,83 @@
user.del
end
it "should be only one relationship between comment and voter 3"
it "should be only one relationship between comment and voter 3" do
comment = NeologyComment.new
user = NeologyUser.new
voter_1 = NeologyUser.new
voter_2 = NeologyUser.new
voter_3 = NeologyUser.new
voter_4 = NeologyUser.new
comment.author= user
comment.voters<<[voter_1, voter_2, voter_3, voter_4]
rels = comment.rels(:voters).to_other(voter_3)
rels.size.should == 1
rels[0].start_node.id.should == comment.id
rels[0].end_node.id.should == voter_3.id
comment.del
user.del
voter_1.del
voter_2.del
voter_3.del
voter_4.del
end
it "should return all outgoing relationships" do
comment = NeologyComment.new
user = NeologyUser.new
voter_1 = NeologyUser.new
voter_2 = NeologyUser.new
voter_3 = NeologyUser.new
voter_4 = NeologyUser.new
comment.author= user
comment.voters<<[voter_1, voter_2, voter_3, voter_4]
rels = comment.rels.outgoing(:voters)
rels.size.should == 4
comment.del
user.del
voter_1.del
voter_2.del
voter_3.del
voter_4.del
end
it "should return all incoming relationships" do
it "should return all outgoing relationships"
comment = NeologyComment.new
user = NeologyUser.new
voter_1 = NeologyUser.new
voter_2 = NeologyUser.new
voter_3 = NeologyUser.new
voter_4 = NeologyUser.new
comment.author= user
comment.voters<<[user, voter_1, voter_2, voter_3, voter_4]
rels = user.rels.incoming(:author)
rels.size.should == 1
comment.del
user.del
voter_1.del
voter_2.del
voter_3.del
voter_4.del
it "should return all incoming relationships"
end
end
Expand Down

0 comments on commit 413163d

Please sign in to comment.