neo4j 1.0.0.beta.9 → 1.0.0.beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +5 -1971
- data/lib/neo4j/mapping/class_methods/relationship.rb +2 -2
- data/lib/neo4j/mapping/decl_relationship_dsl.rb +6 -1
- data/lib/neo4j/mapping/has_n.rb +17 -1
- data/lib/neo4j/node_traverser.rb +14 -1
- data/lib/neo4j/rails/model.rb +127 -31
- data/lib/neo4j/rails/tx_methods.rb +11 -0
- data/lib/neo4j/rails/value.rb +44 -1
- data/lib/neo4j/version.rb +1 -1
- data/lib/neo4j.rb +1 -0
- metadata +4 -59
- data/lib/neo4j.old/batch_inserter.rb +0 -144
- data/lib/neo4j.old/config.rb +0 -138
- data/lib/neo4j.old/event_handler.rb +0 -73
- data/lib/neo4j.old/extensions/activemodel.rb +0 -158
- data/lib/neo4j.old/extensions/aggregate/aggregate_enum.rb +0 -40
- data/lib/neo4j.old/extensions/aggregate/ext/node_mixin.rb +0 -69
- data/lib/neo4j.old/extensions/aggregate/node_aggregate.rb +0 -8
- data/lib/neo4j.old/extensions/aggregate/node_aggregate_mixin.rb +0 -331
- data/lib/neo4j.old/extensions/aggregate/node_aggregator.rb +0 -216
- data/lib/neo4j.old/extensions/aggregate/node_group.rb +0 -43
- data/lib/neo4j.old/extensions/aggregate/prop_group.rb +0 -30
- data/lib/neo4j.old/extensions/aggregate/property_enum.rb +0 -24
- data/lib/neo4j.old/extensions/aggregate/props_aggregate.rb +0 -8
- data/lib/neo4j.old/extensions/aggregate/props_aggregate_mixin.rb +0 -31
- data/lib/neo4j.old/extensions/aggregate/props_aggregator.rb +0 -80
- data/lib/neo4j.old/extensions/aggregate.rb +0 -12
- data/lib/neo4j.old/extensions/find_path.rb +0 -117
- data/lib/neo4j.old/extensions/graph_algo/all_simple_paths.rb +0 -133
- data/lib/neo4j.old/extensions/graph_algo/neo4j-graph-algo-0.3.jar +0 -0
- data/lib/neo4j.old/extensions/graph_algo.rb +0 -1
- data/lib/neo4j.old/extensions/reindexer.rb +0 -104
- data/lib/neo4j.old/extensions/rest/rest.rb +0 -336
- data/lib/neo4j.old/extensions/rest/rest_mixin.rb +0 -193
- data/lib/neo4j.old/extensions/rest/server.rb +0 -50
- data/lib/neo4j.old/extensions/rest/stubs.rb +0 -141
- data/lib/neo4j.old/extensions/rest.rb +0 -21
- data/lib/neo4j.old/extensions/rest_master.rb +0 -34
- data/lib/neo4j.old/extensions/rest_slave.rb +0 -31
- data/lib/neo4j.old/extensions/tx_tracker.rb +0 -392
- data/lib/neo4j.old/indexer.rb +0 -187
- data/lib/neo4j.old/jars/geronimo-jta_1.1_spec-1.1.1.jar +0 -0
- data/lib/neo4j.old/jars/neo4j-kernel-1.0.jar +0 -0
- data/lib/neo4j.old/jars.rb +0 -6
- data/lib/neo4j.old/mixins/java_list_mixin.rb +0 -139
- data/lib/neo4j.old/mixins/java_node_mixin.rb +0 -205
- data/lib/neo4j.old/mixins/java_property_mixin.rb +0 -169
- data/lib/neo4j.old/mixins/java_relationship_mixin.rb +0 -60
- data/lib/neo4j.old/mixins/migration_mixin.rb +0 -157
- data/lib/neo4j.old/mixins/node_mixin.rb +0 -249
- data/lib/neo4j.old/mixins/property_class_methods.rb +0 -265
- data/lib/neo4j.old/mixins/rel_class_methods.rb +0 -167
- data/lib/neo4j.old/mixins/relationship_mixin.rb +0 -103
- data/lib/neo4j.old/neo.rb +0 -247
- data/lib/neo4j.old/node.rb +0 -49
- data/lib/neo4j.old/reference_node.rb +0 -15
- data/lib/neo4j.old/relationship.rb +0 -85
- data/lib/neo4j.old/relationships/decl_relationship_dsl.rb +0 -164
- data/lib/neo4j.old/relationships/has_list.rb +0 -101
- data/lib/neo4j.old/relationships/has_n.rb +0 -129
- data/lib/neo4j.old/relationships/node_traverser.rb +0 -138
- data/lib/neo4j.old/relationships/relationship_dsl.rb +0 -149
- data/lib/neo4j.old/relationships/traversal_position.rb +0 -50
- data/lib/neo4j.old/relationships/wrappers.rb +0 -51
- data/lib/neo4j.old/search_result.rb +0 -72
- data/lib/neo4j.old/transaction.rb +0 -254
- data/lib/neo4j.old/version.rb +0 -3
@@ -1,129 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Relationships
|
3
|
-
|
4
|
-
# Enables creating and traversal of nodes.
|
5
|
-
# Includes the Enumerable Mixin.
|
6
|
-
#
|
7
|
-
class HasN
|
8
|
-
include Enumerable
|
9
|
-
|
10
|
-
def initialize(node, dsl, &filter) # :nodoc:
|
11
|
-
@node = node
|
12
|
-
@traverser = NodeTraverser.new(node._java_node)
|
13
|
-
@outgoing = dsl.outgoing?
|
14
|
-
# returns the other DSL if it exists otherwise use this DSL for specifing incoming relationships
|
15
|
-
if @outgoing
|
16
|
-
@dsl = dsl
|
17
|
-
else
|
18
|
-
# which class specifies the incoming DSL ?
|
19
|
-
clazz = dsl.to_class || node.class
|
20
|
-
@dsl = clazz.decl_relationships[dsl.to_type]
|
21
|
-
raise "Unspecified outgoing relationship '#{dsl.to_type}' for incoming relationship '#{dsl.rel_id}' on class #{clazz}" if @dsl.nil?
|
22
|
-
end
|
23
|
-
|
24
|
-
if @outgoing
|
25
|
-
@traverser.outgoing(@dsl.namespace_type)
|
26
|
-
else
|
27
|
-
@traverser.incoming(@dsl.namespace_type)
|
28
|
-
end
|
29
|
-
|
30
|
-
@traverser.filter(&filter) unless filter.nil?
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
# Returns the relationships instead of the nodes.
|
35
|
-
#
|
36
|
-
# ==== Example
|
37
|
-
# # return the relationship objects between the folder and file nodes:
|
38
|
-
# folder.files.rels.each {|x| ...}
|
39
|
-
#
|
40
|
-
def rels
|
41
|
-
Neo4j::Relationships::RelationshipDSL.new(@node._java_node, (@outgoing)? :outgoing : :incoming, @dsl.namespace_type)
|
42
|
-
end
|
43
|
-
|
44
|
-
# Sets the depth of the traversal.
|
45
|
-
# Default is 1 if not specified.
|
46
|
-
#
|
47
|
-
# ==== Example
|
48
|
-
# morpheus.friends.depth(:all).each { ... }
|
49
|
-
# morpheus.friends.depth(3).each { ... }
|
50
|
-
#
|
51
|
-
# ==== Arguments
|
52
|
-
# d<Fixnum,Symbol>:: the depth or :all if traversing to the end of the network.
|
53
|
-
# ==== Return
|
54
|
-
# self
|
55
|
-
#
|
56
|
-
# :api: public
|
57
|
-
def depth(d)
|
58
|
-
@traverser.depth(d)
|
59
|
-
self
|
60
|
-
end
|
61
|
-
|
62
|
-
# Required by the Enumerable mixin.
|
63
|
-
def each(&block)
|
64
|
-
@traverser.each(&block)
|
65
|
-
end
|
66
|
-
|
67
|
-
|
68
|
-
# Returns true if there are no node in this type of relationship
|
69
|
-
def empty?
|
70
|
-
@traverser.empty?
|
71
|
-
end
|
72
|
-
|
73
|
-
# Return the first relationship or nil
|
74
|
-
def first
|
75
|
-
@traverser.first
|
76
|
-
end
|
77
|
-
|
78
|
-
# Creates a relationship instance between this and the other node.
|
79
|
-
def new(other)
|
80
|
-
create_rel(@node, other)
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
# Creates a relationship between this and the other node.
|
85
|
-
#
|
86
|
-
# ==== Example
|
87
|
-
#
|
88
|
-
# n1 = Node.new # Node has declared having a friend type of relationship
|
89
|
-
# n2 = Node.new
|
90
|
-
# n3 = Node.new
|
91
|
-
#
|
92
|
-
# n1 << n2 << n3
|
93
|
-
#
|
94
|
-
# This is the same as:
|
95
|
-
#
|
96
|
-
# n1.add_rel(:friends, n2)
|
97
|
-
# n1.add_rel(:friends, n3)
|
98
|
-
#
|
99
|
-
# ==== Returns
|
100
|
-
# self
|
101
|
-
#
|
102
|
-
# :api: public
|
103
|
-
def <<(other)
|
104
|
-
create_rel(@node, other)
|
105
|
-
self
|
106
|
-
end
|
107
|
-
|
108
|
-
|
109
|
-
def create_rel(node, other) # :nodoc:
|
110
|
-
# If the are creating an incoming relationship we need to swap incoming and outgoing nodes
|
111
|
-
if @outgoing
|
112
|
-
from, to = node, other
|
113
|
-
else
|
114
|
-
from, to = other, node
|
115
|
-
end
|
116
|
-
|
117
|
-
rel = from.add_rel(@dsl.namespace_type, to, @dsl.relationship_class)
|
118
|
-
|
119
|
-
# the from.neo_id is only used for cascade_delete_incoming since that node will be deleted when all the list items has been deleted.
|
120
|
-
# if cascade_delete_outgoing all nodes will be deleted when the root node is deleted
|
121
|
-
# if cascade_delete_incoming then the root node will be deleted when all root nodes' outgoing nodes are deleted
|
122
|
-
rel[@dsl.cascade_delete_prop_name] = node.neo_id if @dsl.cascade_delete?
|
123
|
-
rel
|
124
|
-
end
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
end
|
129
|
-
end
|
@@ -1,138 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Relationships
|
3
|
-
|
4
|
-
class IllegalTraversalArguments < StandardError;
|
5
|
-
end
|
6
|
-
|
7
|
-
# Enables traversing nodes
|
8
|
-
# Contains state about one specific traversal to be performed.
|
9
|
-
class NodeTraverser
|
10
|
-
include Enumerable
|
11
|
-
|
12
|
-
attr_accessor :raw
|
13
|
-
attr_reader :_java_node
|
14
|
-
|
15
|
-
def initialize(_java_node, raw = false)
|
16
|
-
@_java_node = _java_node
|
17
|
-
@raw = raw
|
18
|
-
@stop_evaluator = DepthStopEvaluator.new(1)
|
19
|
-
@types_and_dirs = [] # what types of relationships and which directions should be traversed
|
20
|
-
@traverser_order = org.neo4j.graphdb.Traverser::Order::BREADTH_FIRST
|
21
|
-
@returnable_evaluator = org.neo4j.graphdb.ReturnableEvaluator::ALL_BUT_START_NODE
|
22
|
-
end
|
23
|
-
|
24
|
-
# if raw == true then it will return raw Java object instead of wrapped JRuby object which can improve performance.
|
25
|
-
def raw(raw = true)
|
26
|
-
@raw = raw
|
27
|
-
self
|
28
|
-
end
|
29
|
-
|
30
|
-
# Sets the depth of the traversal.
|
31
|
-
# Default is 1 if not specified.
|
32
|
-
#
|
33
|
-
# ==== Example
|
34
|
-
# morpheus.outgoing(:friends).depth(:all).each { ... }
|
35
|
-
# morpheus.outgoing(:friends).depth(3).each { ... }
|
36
|
-
#
|
37
|
-
# ==== Arguments
|
38
|
-
# d<Fixnum,Symbol>:: the depth or :all if traversing to the end of the network.
|
39
|
-
# ==== Return
|
40
|
-
# self
|
41
|
-
#
|
42
|
-
# :api: public
|
43
|
-
def depth(d)
|
44
|
-
if d == :all
|
45
|
-
@stop_evaluator = org.neo4j.graphdb.StopEvaluator::END_OF_GRAPH
|
46
|
-
else
|
47
|
-
@stop_evaluator = DepthStopEvaluator.new(d)
|
48
|
-
end
|
49
|
-
self
|
50
|
-
end
|
51
|
-
|
52
|
-
def filter(&proc)
|
53
|
-
@returnable_evaluator = ReturnableEvaluator.new(proc, @raw)
|
54
|
-
self
|
55
|
-
end
|
56
|
-
|
57
|
-
def outgoing(*types)
|
58
|
-
types.each do |type|
|
59
|
-
@types_and_dirs << org.neo4j.graphdb.DynamicRelationshipType.withName(type.to_s)
|
60
|
-
@types_and_dirs << org.neo4j.graphdb.Direction::OUTGOING
|
61
|
-
end
|
62
|
-
self
|
63
|
-
end
|
64
|
-
|
65
|
-
def incoming(*types)
|
66
|
-
types.each do |type|
|
67
|
-
@types_and_dirs << org.neo4j.graphdb.DynamicRelationshipType.withName(type.to_s)
|
68
|
-
@types_and_dirs << org.neo4j.graphdb.Direction::INCOMING
|
69
|
-
end
|
70
|
-
self
|
71
|
-
end
|
72
|
-
|
73
|
-
def both(*types)
|
74
|
-
types.each do |type|
|
75
|
-
@types_and_dirs << org.neo4j.graphdb.DynamicRelationshipType.withName(type.to_s)
|
76
|
-
@types_and_dirs << org.neo4j.graphdb.Direction::BOTH
|
77
|
-
end
|
78
|
-
self
|
79
|
-
end
|
80
|
-
|
81
|
-
def empty?
|
82
|
-
!iterator.hasNext
|
83
|
-
end
|
84
|
-
|
85
|
-
def first
|
86
|
-
find {true}
|
87
|
-
end
|
88
|
-
|
89
|
-
def each
|
90
|
-
iter = iterator
|
91
|
-
if @raw
|
92
|
-
while (iter.hasNext) do
|
93
|
-
yield iter.next
|
94
|
-
end
|
95
|
-
else
|
96
|
-
while (iter.hasNext) do
|
97
|
-
yield iter.next.wrapper
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# Same as #each method but includes the TraversalPosition argument as a yield argument.
|
103
|
-
#
|
104
|
-
#
|
105
|
-
def each_with_position(&block)
|
106
|
-
traverser = create_traverser
|
107
|
-
iter = traverser.iterator
|
108
|
-
while (iter.hasNext) do
|
109
|
-
n = iter.next
|
110
|
-
tp = TraversalPosition.new(traverser.currentPosition(), @raw)
|
111
|
-
block.call Neo4j.load_node(n.get_id), tp
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
|
116
|
-
def create_traverser
|
117
|
-
# check that we know which type of relationship should be traversed
|
118
|
-
if @types_and_dirs.empty?
|
119
|
-
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."
|
120
|
-
end
|
121
|
-
|
122
|
-
@_java_node.traverse(@traverser_order, @stop_evaluator,
|
123
|
-
@returnable_evaluator, @types_and_dirs.to_java(:object))
|
124
|
-
end
|
125
|
-
|
126
|
-
def iterator
|
127
|
-
create_traverser.iterator
|
128
|
-
end
|
129
|
-
|
130
|
-
def to_s
|
131
|
-
"NodeTraverser [direction=#{@direction}, type=#{@type}]"
|
132
|
-
end
|
133
|
-
|
134
|
-
end
|
135
|
-
|
136
|
-
|
137
|
-
end
|
138
|
-
end
|
@@ -1,149 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Relationships
|
3
|
-
|
4
|
-
# Enables finding relationships for one node
|
5
|
-
#
|
6
|
-
class RelationshipDSL
|
7
|
-
include Enumerable
|
8
|
-
attr_reader :node
|
9
|
-
|
10
|
-
def initialize(node, direction = :outgoing, type = nil)
|
11
|
-
@raw = false
|
12
|
-
@type = type
|
13
|
-
@node = node
|
14
|
-
|
15
|
-
case direction
|
16
|
-
when :outgoing
|
17
|
-
outgoing(type)
|
18
|
-
when :incoming
|
19
|
-
incoming(type)
|
20
|
-
when :both
|
21
|
-
both(type)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# if raw == true then it will return raw Java object instead of wrapped JRuby object which can improve performance.
|
26
|
-
def raw(raw = true)
|
27
|
-
@raw = raw
|
28
|
-
self
|
29
|
-
end
|
30
|
-
|
31
|
-
def outgoing(type = nil)
|
32
|
-
@type = type
|
33
|
-
@direction = org.neo4j.graphdb.Direction::OUTGOING
|
34
|
-
self
|
35
|
-
end
|
36
|
-
|
37
|
-
def incoming(type = nil)
|
38
|
-
@type = type
|
39
|
-
@direction = org.neo4j.graphdb.Direction::INCOMING
|
40
|
-
self
|
41
|
-
end
|
42
|
-
|
43
|
-
def filter(&filter_proc)
|
44
|
-
@filter_proc = filter_proc
|
45
|
-
self
|
46
|
-
end
|
47
|
-
|
48
|
-
def both(type = nil)
|
49
|
-
@type = type
|
50
|
-
@direction = org.neo4j.graphdb.Direction::BOTH
|
51
|
-
self
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
|
-
# Creates a not declared relationship between this node and the given other_node with the given relationship type
|
56
|
-
# Use this method if you do not want to declare the relationship with the class methods has_one or has_n.
|
57
|
-
# Can be used at any time on any node.
|
58
|
-
#
|
59
|
-
# Only supports outgoing relationships.
|
60
|
-
#
|
61
|
-
# ==== Example
|
62
|
-
#
|
63
|
-
# node1 = Neo4j::Node.new
|
64
|
-
# node2 = Neo4j::Node.new
|
65
|
-
# node1.rels.outgoing(:some_relationship_type) << node2 << node3
|
66
|
-
#
|
67
|
-
# ==== Returns
|
68
|
-
# self - so that the << can be chained
|
69
|
-
#
|
70
|
-
# :api: public
|
71
|
-
def <<(other_node)
|
72
|
-
source, target = @node, other_node
|
73
|
-
source, target = target, source if @direction == org.neo4j.graphdb.Direction::INCOMING
|
74
|
-
source.add_rel(@type, target)
|
75
|
-
self
|
76
|
-
end
|
77
|
-
|
78
|
-
def empty?
|
79
|
-
!iterator.hasNext
|
80
|
-
end
|
81
|
-
|
82
|
-
# Return the first relationship or nil
|
83
|
-
def first
|
84
|
-
find {true}
|
85
|
-
end
|
86
|
-
|
87
|
-
#
|
88
|
-
# Returns the relationship object to the other node.
|
89
|
-
#
|
90
|
-
def [](other_node)
|
91
|
-
find {|r| r.end_node.neo_id == other_node.neo_id}
|
92
|
-
end
|
93
|
-
|
94
|
-
|
95
|
-
def each
|
96
|
-
iter = iterator
|
97
|
-
while (iter.hasNext) do
|
98
|
-
rel = @raw ? iter.next : iter.next.wrapper
|
99
|
-
next if @filter_proc && !rel.instance_eval(&@filter_proc)
|
100
|
-
yield rel
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def nodes
|
105
|
-
RelationshipsEnumeration.new(self, @raw)
|
106
|
-
end
|
107
|
-
|
108
|
-
def iterator
|
109
|
-
# if type is nil then we traverse all relationship types of depth one
|
110
|
-
return @node.getRelationships(@direction).iterator if @type.nil?
|
111
|
-
return @node.getRelationships(org.neo4j.graphdb.DynamicRelationshipType.withName(@type.to_s), @direction).iterator unless @type.nil?
|
112
|
-
end
|
113
|
-
|
114
|
-
def to_s
|
115
|
-
"RelationshipDSL [direction=#{@direction}, type=#{@type}]"
|
116
|
-
end
|
117
|
-
|
118
|
-
# Used from RelationshipDSL when traversing nodes instead of relationships.
|
119
|
-
#
|
120
|
-
class RelationshipsEnumeration #:nodoc:
|
121
|
-
include Enumerable
|
122
|
-
|
123
|
-
def initialize(relationships, raw)
|
124
|
-
@relationships = relationships
|
125
|
-
@raw = raw
|
126
|
-
end
|
127
|
-
|
128
|
-
def first
|
129
|
-
find {true}
|
130
|
-
end
|
131
|
-
|
132
|
-
def empty?
|
133
|
-
first.nil?
|
134
|
-
end
|
135
|
-
|
136
|
-
def each
|
137
|
-
if @raw
|
138
|
-
@relationships.each { |relationship| yield relationship.other_node(@relationships.node) }
|
139
|
-
else
|
140
|
-
@relationships.each { |relationship| yield relationship.other_node(@relationships.node).wrapper }
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
end
|
149
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Relationships
|
3
|
-
|
4
|
-
# Wrapper for org.neo4j.graphdb.TraversalPosition
|
5
|
-
# See Javadoc for org.neo4j.graphdb.TraversalPosition
|
6
|
-
# It can be used as a parameter in traversals filter functions.
|
7
|
-
#
|
8
|
-
# :api: public
|
9
|
-
class TraversalPosition
|
10
|
-
def initialize(traversal_position, raw = false)
|
11
|
-
@traversal_position = traversal_position
|
12
|
-
@raw = raw
|
13
|
-
end
|
14
|
-
|
15
|
-
# Return the current node.
|
16
|
-
def current_node
|
17
|
-
Neo4j.load_node(@traversal_position.currentNode.getId, @raw)
|
18
|
-
end
|
19
|
-
|
20
|
-
# Returns the previous node, may be nil.
|
21
|
-
def previous_node
|
22
|
-
return nil if @traversal_position.previousNode.nil?
|
23
|
-
Neo4j.load_node(@traversal_position.previousNode.getId, @raw)
|
24
|
-
end
|
25
|
-
|
26
|
-
# Return the last relationship traversed, may be nil.
|
27
|
-
def last_relationship_traversed
|
28
|
-
relationship = @traversal_position.lastRelationshipTraversed()
|
29
|
-
return nil if relationship.nil?
|
30
|
-
return relationship.wrapper unless @raw
|
31
|
-
relationship
|
32
|
-
end
|
33
|
-
|
34
|
-
# Returns the current traversal depth.
|
35
|
-
def depth
|
36
|
-
@traversal_position.depth
|
37
|
-
end
|
38
|
-
|
39
|
-
# Returns true if the current position is the start node, false otherwise.
|
40
|
-
def start_node?
|
41
|
-
@traversal_position.isStartNode
|
42
|
-
end
|
43
|
-
|
44
|
-
# Returns the number of nodes returned by traverser so far.
|
45
|
-
def returned_nodes_count
|
46
|
-
@traversal_position.returnedNodesCount
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Relationships
|
3
|
-
|
4
|
-
# Wrapper for org.neo4j.graphdb.ReturnableEvaluator
|
5
|
-
#
|
6
|
-
# :api: private
|
7
|
-
class ReturnableEvaluator #:nodoc:
|
8
|
-
include org.neo4j.graphdb.ReturnableEvaluator
|
9
|
-
|
10
|
-
def initialize(proc, raw = false)
|
11
|
-
@proc = proc
|
12
|
-
@raw = raw
|
13
|
-
end
|
14
|
-
|
15
|
-
def isReturnableNode( traversal_position )
|
16
|
-
# if the Proc takes one argument that we give it the traversal_position
|
17
|
-
result = if @proc.arity == 1
|
18
|
-
# wrap the traversal_position in the Neo4j.rb TraversalPostion object
|
19
|
-
@proc.call TraversalPosition.new(traversal_position, @raw)
|
20
|
-
else # otherwise we eval the proc in the context of the current node
|
21
|
-
# do not include the start node
|
22
|
-
return false if traversal_position.isStartNode()
|
23
|
-
eval_context = Neo4j::load_node(traversal_position.currentNode.getId, @raw)
|
24
|
-
eval_context.instance_eval(&@proc)
|
25
|
-
end
|
26
|
-
|
27
|
-
# java does not treat nil as false so we need to do it instead
|
28
|
-
(result)? true : false
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
# Wrapper for the neo4j org.neo4j.graphdb.StopEvalutor interface.
|
34
|
-
# Used in the Neo4j Traversers.
|
35
|
-
#
|
36
|
-
# :api: private
|
37
|
-
class DepthStopEvaluator #:nodoc:
|
38
|
-
include org.neo4j.graphdb.StopEvaluator
|
39
|
-
|
40
|
-
def initialize(depth)
|
41
|
-
@depth = depth
|
42
|
-
end
|
43
|
-
|
44
|
-
def isStopNode(pos)
|
45
|
-
pos.depth >= @depth
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
#
|
4
|
-
# Holds the search result and performs the query.
|
5
|
-
# The query is not performed until a search result item is requested.
|
6
|
-
# It is possible that one node is deleted,updated,created after the search is performed.
|
7
|
-
#
|
8
|
-
class SearchResult
|
9
|
-
include Enumerable
|
10
|
-
|
11
|
-
def initialize(index, query, query_for_nodes = true, &block)
|
12
|
-
@query = query
|
13
|
-
@query_for_nodes = query_for_nodes # if we are searching for nodes or relationships
|
14
|
-
@block = block
|
15
|
-
@index = index
|
16
|
-
@sort_by_fields = []
|
17
|
-
end
|
18
|
-
|
19
|
-
def hits
|
20
|
-
@hits ||= @index.find(query_params, &@block)
|
21
|
-
end
|
22
|
-
|
23
|
-
def query_params
|
24
|
-
unless @sort_by_fields.empty?
|
25
|
-
return case @query
|
26
|
-
when Hash
|
27
|
-
@query.merge({:sort_by => @sort_by_fields})
|
28
|
-
when String
|
29
|
-
[@query, { :sort_by => @sort_by_fields}]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
return @query
|
33
|
-
end
|
34
|
-
|
35
|
-
|
36
|
-
# Returns the first item in the search result
|
37
|
-
#
|
38
|
-
# :api: public
|
39
|
-
def first
|
40
|
-
return nil if empty?
|
41
|
-
self[0]
|
42
|
-
end
|
43
|
-
|
44
|
-
def empty?
|
45
|
-
size == 0
|
46
|
-
end
|
47
|
-
|
48
|
-
def each
|
49
|
-
hits.each do |doc|
|
50
|
-
|
51
|
-
node_or_rel = @query_for_nodes ? Neo4j.load_node(doc[:id]) : Neo4j.load_rel(doc[:id])
|
52
|
-
# can happen that another thread has deleted it
|
53
|
-
raise "lucene found node/rel #{id} but it does not exist in neo" if node_or_rel.nil?
|
54
|
-
yield node_or_rel
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def [](n)
|
59
|
-
doc = hits[n]
|
60
|
-
Neo4j.load_node(doc[:id])
|
61
|
-
end
|
62
|
-
|
63
|
-
def sort_by(*fields)
|
64
|
-
@sort_by_fields += fields
|
65
|
-
self
|
66
|
-
end
|
67
|
-
|
68
|
-
def size
|
69
|
-
hits.size
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|