neo4j 1.0.0.beta.1 → 1.0.0.beta.2
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/lib/neo4j/event_handler.rb
CHANGED
@@ -20,6 +20,8 @@ module Neo4j
|
|
20
20
|
data.assigned_node_properties.each { |tx_data| property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, tx_data.value) }
|
21
21
|
data.removed_node_properties.each { |tx_data| property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, nil) unless data.deleted_nodes.include?(tx_data.entity) }
|
22
22
|
data.deleted_nodes.each { |node| node_deleted(node, deleted_properties_for(node,data))}
|
23
|
+
data.created_relationships.each {|rel| relationship_created(rel)}
|
24
|
+
data.deleted_relationships.each {|rel| relationship_deleted(rel)}
|
23
25
|
# TODO Add relationship properties callbacks
|
24
26
|
end
|
25
27
|
|
data/lib/neo4j/index.rb
CHANGED
@@ -31,6 +31,36 @@ module Neo4j
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
class WrappedQuery
|
35
|
+
include Enumerable
|
36
|
+
|
37
|
+
def initialize(index, query)
|
38
|
+
@index = index
|
39
|
+
@query = query
|
40
|
+
end
|
41
|
+
|
42
|
+
def each
|
43
|
+
hits.each{|n| yield n.wrapper}
|
44
|
+
end
|
45
|
+
|
46
|
+
def close
|
47
|
+
@hits.close if @hits
|
48
|
+
end
|
49
|
+
|
50
|
+
def empty?
|
51
|
+
hits.size == 0
|
52
|
+
end
|
53
|
+
|
54
|
+
def size
|
55
|
+
hits.size
|
56
|
+
end
|
57
|
+
|
58
|
+
def hits
|
59
|
+
@hits ||= @index.query(@query)
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
34
64
|
class Indexer
|
35
65
|
attr_reader :index_name
|
36
66
|
|
@@ -65,18 +95,20 @@ module Neo4j
|
|
65
95
|
index_for_field(field).remove(entity, field, value)
|
66
96
|
end
|
67
97
|
|
68
|
-
def find(query,
|
98
|
+
def find(query, params = {})
|
99
|
+
type = params[:type] || :exact
|
69
100
|
index = index_for_type(type)
|
70
|
-
|
101
|
+
query = (params[:wrapped].nil? || params[:wrapped]) ? WrappedQuery.new(index, query) : index.query(query)
|
102
|
+
|
71
103
|
if block_given?
|
72
104
|
begin
|
73
|
-
ret = yield
|
105
|
+
ret = yield query
|
74
106
|
ensure
|
75
|
-
|
107
|
+
query.close
|
76
108
|
end
|
77
109
|
ret
|
78
110
|
else
|
79
|
-
|
111
|
+
query
|
80
112
|
end
|
81
113
|
end
|
82
114
|
|
@@ -2,12 +2,24 @@ module Neo4j::Mapping
|
|
2
2
|
module ClassMethods
|
3
3
|
class Rules
|
4
4
|
class << self
|
5
|
-
def add(clazz, field, &block)
|
5
|
+
def add(clazz, field, props, &block)
|
6
6
|
clazz = clazz.to_s
|
7
7
|
@rules ||= {}
|
8
8
|
@rules[clazz] ||= {}
|
9
|
-
filter = block.nil? ? Proc.new{|*| true} : block
|
9
|
+
filter = block.nil? ? Proc.new { |*| true } : block
|
10
10
|
@rules[clazz][field] = filter
|
11
|
+
@triggers ||= {}
|
12
|
+
@triggers[clazz] ||= {}
|
13
|
+
trigger = props[:trigger].nil? ? [] : props[:trigger]
|
14
|
+
@triggers[clazz][field] = trigger.respond_to?(:each) ? trigger : [trigger]
|
15
|
+
end
|
16
|
+
|
17
|
+
def trigger_other_rules(node, field)
|
18
|
+
clazz = node[:_classname]
|
19
|
+
rel_types = @triggers[clazz][field]
|
20
|
+
rel_types.each do |rel_type|
|
21
|
+
node.incoming(rel_type).each { |n| n.trigger_rules }
|
22
|
+
end
|
11
23
|
end
|
12
24
|
|
13
25
|
def fields_for(clazz)
|
@@ -31,7 +43,7 @@ module Neo4j::Mapping
|
|
31
43
|
|
32
44
|
def create_rules
|
33
45
|
@rules.each_key do |clazz|
|
34
|
-
# check if rule nodes exist, if
|
46
|
+
# check if rule nodes exist, if not create them
|
35
47
|
if !Neo4j.ref_node.rel?(clazz)
|
36
48
|
Neo4j::Transaction.run do
|
37
49
|
node = Neo4j::Node.new
|
@@ -52,28 +64,52 @@ module Neo4j::Mapping
|
|
52
64
|
end
|
53
65
|
|
54
66
|
|
55
|
-
def
|
56
|
-
|
67
|
+
def on_relationship_created(rel)
|
68
|
+
trigger_start_node = trigger?(rel.start_node)
|
69
|
+
trigger_end_node = trigger?(rel.end_node)
|
70
|
+
# end or start node must be triggered by this event
|
71
|
+
return unless trigger_start_node || trigger_end_node
|
72
|
+
on_property_changed(trigger_start_node ? rel.start_node : rel.end_node)
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
def on_property_changed(node, *)
|
77
|
+
trigger_rules(node) if trigger?(node)
|
78
|
+
end
|
79
|
+
|
80
|
+
def trigger_rules(node)
|
57
81
|
clazz = node[:_classname]
|
58
82
|
return if @rules[clazz].nil?
|
83
|
+
|
59
84
|
agg_node = rule_for(node[:_classname])
|
60
|
-
@rules[clazz].each_pair do |field,
|
61
|
-
if
|
85
|
+
@rules[clazz].each_pair do |field, rule|
|
86
|
+
if run_rule(rule, node)
|
62
87
|
# is this node already included ?
|
63
88
|
if !node.rel?(field)
|
64
89
|
agg_node.outgoing(field) << node
|
90
|
+
trigger_other_rules(node, field)
|
65
91
|
end
|
66
92
|
else
|
67
93
|
# remove old ?
|
68
94
|
node.rels(field).incoming.each { |x| x.del }
|
95
|
+
trigger_other_rules(node, field)
|
69
96
|
end
|
70
97
|
end
|
71
98
|
end
|
99
|
+
|
100
|
+
def run_rule(rule, node)
|
101
|
+
if rule.arity != 1
|
102
|
+
wrapper = Neo4j::Node.load_wrapper(node)
|
103
|
+
wrapper.instance_eval(&rule)
|
104
|
+
else
|
105
|
+
rule.call(node)
|
106
|
+
end
|
107
|
+
end
|
72
108
|
end
|
73
109
|
end
|
74
110
|
|
75
111
|
|
76
|
-
module
|
112
|
+
module Rule
|
77
113
|
|
78
114
|
# Creates an rule node attached to the Neo4j.ref_node
|
79
115
|
# Can be used to rule all instances of a specific Ruby class.
|
@@ -93,7 +129,7 @@ module Neo4j::Mapping
|
|
93
129
|
# Person.young # => [p1,p2]
|
94
130
|
# p1.young? # => true
|
95
131
|
#
|
96
|
-
def rule(name, &block)
|
132
|
+
def rule(name, props = {}, &block)
|
97
133
|
singelton = class << self;
|
98
134
|
self;
|
99
135
|
end
|
@@ -116,18 +152,25 @@ module Neo4j::Mapping
|
|
116
152
|
instance_eval &block
|
117
153
|
end
|
118
154
|
|
119
|
-
Rules.add(self, name, &block)
|
155
|
+
Rules.add(self, name, props, &block)
|
120
156
|
end
|
121
157
|
|
122
158
|
# This is typically used for RSpecs to clean up rule nodes created by the #rule method.
|
123
159
|
# It also remove the given class method.
|
124
160
|
def delete_rules
|
125
|
-
singelton = class << self;
|
161
|
+
singelton = class << self;
|
162
|
+
self;
|
163
|
+
end
|
126
164
|
Rules.fields_for(self).each do |name|
|
127
165
|
singelton.send(:remove_method, name)
|
128
166
|
end
|
129
167
|
Rules.delete(self)
|
130
168
|
end
|
169
|
+
|
170
|
+
def trigger_rules(node)
|
171
|
+
Rules.trigger_rules(node)
|
172
|
+
end
|
173
|
+
|
131
174
|
end
|
132
175
|
|
133
176
|
Neo4j.unstarted_db.event_handler.add(Rules)
|
@@ -6,7 +6,7 @@ module Neo4j::Mapping
|
|
6
6
|
|
7
7
|
def_delegators :@_java_node, :[]=, :[], :property?, :props, :attributes, :update, :neo_id, :id, :rels, :rel?, :to_param, :getId,
|
8
8
|
:rel, :del, :list?, :print, :print_sub, :outgoing, :incoming, :both,
|
9
|
-
:equal?, :eql?, :==, :exist
|
9
|
+
:equal?, :eql?, :==, :exist?, :getRelationships
|
10
10
|
|
11
11
|
|
12
12
|
# --------------------------------------------------------------------------
|
@@ -35,10 +35,11 @@ module Neo4j::Mapping
|
|
35
35
|
@_java_node
|
36
36
|
end
|
37
37
|
|
38
|
-
def
|
39
|
-
|
38
|
+
def trigger_rules
|
39
|
+
self.class.trigger_rules(self)
|
40
40
|
end
|
41
41
|
|
42
|
+
|
42
43
|
def self.included(c) # :nodoc:
|
43
44
|
c.instance_eval do
|
44
45
|
# these constants are used in the Neo4j::RelClassMethods and Neo4j::PropertyClassMethods
|
@@ -49,13 +50,14 @@ module Neo4j::Mapping
|
|
49
50
|
const_set(:DECL_RELATIONSHIPS, {})
|
50
51
|
const_set(:PROPERTIES_INFO, {})
|
51
52
|
end
|
53
|
+
|
52
54
|
class << self
|
53
55
|
alias_method :orig_new, :new
|
54
56
|
end
|
55
57
|
end
|
56
58
|
c.extend ClassMethods::Property
|
57
59
|
c.extend ClassMethods::Relationship
|
58
|
-
c.extend ClassMethods::
|
60
|
+
c.extend ClassMethods::Rule
|
59
61
|
c.extend Neo4j::Index::ClassMethods
|
60
62
|
def c.inherited(subclass)
|
61
63
|
subclass.indexer subclass
|
data/lib/neo4j/node.rb
CHANGED
@@ -23,6 +23,13 @@ module Neo4j
|
|
23
23
|
def wrapped_entity
|
24
24
|
self
|
25
25
|
end
|
26
|
+
|
27
|
+
# Loads the Ruby wrapper for this node
|
28
|
+
# If there is no _classname property for this node then it will simply return itself.
|
29
|
+
# Same as Neo4j::Node.load_wrapper(node)
|
30
|
+
def wrapper
|
31
|
+
self.class.load_wrapper(self)
|
32
|
+
end
|
26
33
|
|
27
34
|
def class
|
28
35
|
Neo4j::Node
|
data/lib/neo4j/version.rb
CHANGED
metadata
CHANGED
@@ -7,8 +7,8 @@ version: !ruby/object:Gem::Version
|
|
7
7
|
- 0
|
8
8
|
- 0
|
9
9
|
- beta
|
10
|
-
-
|
11
|
-
version: 1.0.0.beta.
|
10
|
+
- 2
|
11
|
+
version: 1.0.0.beta.2
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Andreas Ronge
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-09-
|
19
|
+
date: 2010-09-23 00:00:00 +02:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|