From 8b20bea283b73ee7efe6f9374954d2f20a41030e Mon Sep 17 00:00:00 2001 From: maxdemarzi Date: Wed, 8 Dec 2010 20:31:50 -0800 Subject: [PATCH] Adding methods to node traverser --- lib/neography.rb | 1 - lib/neography/node_traverser.rb | 105 +++++++++++++++++++++++++++++--- 2 files changed, 97 insertions(+), 9 deletions(-) diff --git a/lib/neography.rb b/lib/neography.rb index 9e03d19..3d53fe1 100644 --- a/lib/neography.rb +++ b/lib/neography.rb @@ -17,7 +17,6 @@ def find_and_require_user_defined_code DIRECTIONS = ["incoming", "in", "outgoing", "out", "all", "both"] - require 'httparty' require 'json' require 'logger' diff --git a/lib/neography/node_traverser.rb b/lib/neography/node_traverser.rb index 0ee4a51..b9c020a 100644 --- a/lib/neography/node_traverser.rb +++ b/lib/neography/node_traverser.rb @@ -2,22 +2,111 @@ module Neography class NodeTraverser include Enumerable - attr_accessor :order, :uniqueness, :depth, :prune, :filter + attr_accessor :order, :uniqueness, :depth, :prune, :filter, :relationships - def initialize(from, types = nil, dir=nil) + def initialize(from, types = nil, dir = "all" ) @from = from - @depth = 1 @order = "depth first" @uniqueness = "none" - if types.nil? || dir.nil? -# @td = org.neo4j.kernel.impl.traversal.TraversalDescriptionImpl.new.breadth_first() + @relationships = Array.new + types.each do |type| + @relationships << {"type" => type.to_s, "direction" => dir.to_s } + end unless types.nil? + end + + def <<(other_node) + create(other_node) + self + end + + def create(other_node) + case @relationships.first["direction"] + when "outgoing", "out" + rel = Neography::Relationship.new(@from.neo_server.create_relationship(@relationships.first["type"], @from, other_node)) + when "incoming", "in" + rel = Neography::Relationship.new(@from.neo_server.create_relationship(@relationships.first["type"], other_node, @from)) + else + rel << @from.neo_server.create_relationship(@relationships.first["type"], @from, other_node) + rel << @from.neo_server.create_relationship(@relationships.first["type"], other_node, @from) + end + rel + end + + def both(type) + @relationships << {"type" => type.to_s, "direction" => "all"} + self + end + + def outgoing(type) + @relationships << {"type" => type.to_s, "direction" => "out"} + self + end + + def incoming(type) + @relationships << {"type" => type.to_s, "direction" => "in"} + self + end + + def filter(language, name) + @filter["language"] = language + if language == "builtin" + @filter["name"] = name else -# @types = type_to_java(type) -# @dir = dir_to_java(dir) -# @td = org.neo4j.kernel.impl.traversal.TraversalDescriptionImpl.new.breadth_first().relationships(@type, @dir) + @filter["body"] = name + end + self + end + + def prune(language, body) + @prune["language"] = language + @prune["body"] = body + self + end + + def depth(d) + @depth = d + self + end + + def include_start_node + @filter["language"] = "builtin" + @filter["name"] = "all" + self + end + + def size + [*self].size + end + + alias_method :length, :size + + def [](index) + each_with_index {|node,i| break node if index == i} + end + + def empty? + first == nil + end + + def each + iterator.each do |i| + node = Neography::Node.new(i) + node.neo_server = @from.neo_server + yield node end end + def iterator + options = Hash.new + options["order"] = @order + options["uniqueness"] = @uniqueness + options["relationships"] = @relationships + options["prune evaluator"] = @prune unless @prune.nil? + options["return filter"] = @filter unless @filter.nil? + options["depth"] = @depth unless @depth.nil? + @from.neo_server.traverse(@from, "nodes", options) + end + end end \ No newline at end of file