forked from maxdemarzi/neography
/
node_traverser.rb
142 lines (120 loc) · 3.55 KB
/
node_traverser.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
module Neography
class NodeTraverser
include Enumerable
attr_accessor :order, :uniqueness, :depth, :prune, :filter, :relationships
def initialize(from, types = nil, dir = "all" )
@from = from
@order = "depth first"
@uniqueness = "none"
@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 = Array.new
rel << Neography::Relationship.new(@from.neo_server.create_relationship(@relationships.first["type"], @from, other_node))
rel << Neography::Relationship.new(@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 uniqueness(u)
@uniqueness = u
self
end
def order(o)
@order = o
self
end
def filter(body)
@filter = Hash.new
@filter["language"] = "javascript"
@filter["body"] = body
self
end
def prune(body)
@prune = Hash.new
@prune["language"] = "javascript"
@prune["body"] = body
self
end
def depth(d)
d = 2147483647 if d == :all
@depth = d
self
end
def include_start_node
@filter = Hash.new
@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 = @from.class.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?
if @relationships[0]["type"].empty?
rels = @from.neo_server.get_node_relationships(@from, @relationships[0]["direction"])
case @relationships[0]["direction"]
when "in"
rels.collect { |r| @from.neo_server.get_node(r["start"]) } #.uniq
when "out"
rels.collect { |r| @from.neo_server.get_node(r["end"]) } #.uniq
else
rels.collect { |r|
if @from.neo_id == r["start"].split('/').last
@from.neo_server.get_node(r["end"])
else
@from.neo_server.get_node(r["start"])
end
} #.uniq
end
else
@from.neo_server.traverse(@from, "nodes", options)
end
end
end
end