neo4j 2.0.0.alpha.5-java → 2.0.0.alpha.6-java
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +12 -0
- data/Gemfile +0 -4
- data/README.rdoc +106 -62
- data/lib/neo4j.rb +7 -33
- data/lib/neo4j/performance.rb +43 -0
- data/lib/neo4j/rails/accept_id.rb +19 -18
- data/lib/neo4j/rails/attributes.rb +366 -120
- data/lib/neo4j/rails/finders.rb +41 -15
- data/lib/neo4j/rails/has_n.rb +203 -0
- data/lib/neo4j/rails/identity.rb +25 -0
- data/lib/neo4j/rails/model.rb +65 -242
- data/lib/neo4j/rails/nested_attributes.rb +108 -0
- data/lib/neo4j/rails/node_persistance.rb +56 -0
- data/lib/neo4j/rails/observer.rb +0 -2
- data/lib/neo4j/rails/persistence.rb +32 -154
- data/lib/neo4j/rails/rack_middleware.rb +26 -2
- data/lib/neo4j/rails/rails.rb +9 -6
- data/lib/neo4j/rails/railtie.rb +1 -2
- data/lib/neo4j/rails/relationship.rb +18 -125
- data/lib/neo4j/rails/relationship_persistence.rb +107 -0
- data/lib/neo4j/rails/relationships/node_dsl.rb +72 -44
- data/lib/neo4j/rails/relationships/relationships.rb +187 -59
- data/lib/neo4j/rails/relationships/rels_dsl.rb +18 -17
- data/lib/neo4j/rails/relationships/storage.rb +19 -17
- data/lib/neo4j/rails/timestamps.rb +53 -51
- data/lib/neo4j/rails/transaction.rb +9 -1
- data/lib/neo4j/rails/validations/uniqueness.rb +1 -1
- data/lib/neo4j/rails/versioning/versioning.rb +2 -2
- data/lib/neo4j/version.rb +1 -1
- data/lib/orm_adapter/adapters/neo4j.rb +47 -46
- data/neo4j.gemspec +1 -1
- metadata +10 -69
- data/lib/neo4j/algo/algo.rb +0 -294
- data/lib/neo4j/batch/batch.rb +0 -4
- data/lib/neo4j/batch/indexer.rb +0 -109
- data/lib/neo4j/batch/inserter.rb +0 -179
- data/lib/neo4j/batch/rule_inserter.rb +0 -24
- data/lib/neo4j/batch/rule_node.rb +0 -72
- data/lib/neo4j/config.rb +0 -177
- data/lib/neo4j/core_ext/class/inheritable_attributes.rb +0 -12
- data/lib/neo4j/core_ext/class/rewrite_inheritable_attributes.rb +0 -170
- data/lib/neo4j/database.rb +0 -158
- data/lib/neo4j/equal.rb +0 -21
- data/lib/neo4j/event_handler.rb +0 -263
- data/lib/neo4j/has_list/class_methods.rb +0 -11
- data/lib/neo4j/has_list/has_list.rb +0 -3
- data/lib/neo4j/has_list/mapping.rb +0 -133
- data/lib/neo4j/has_n/class_methods.rb +0 -119
- data/lib/neo4j/has_n/decl_relationship_dsl.rb +0 -246
- data/lib/neo4j/has_n/has_n.rb +0 -3
- data/lib/neo4j/has_n/mapping.rb +0 -98
- data/lib/neo4j/identity_map.rb +0 -140
- data/lib/neo4j/index/class_methods.rb +0 -108
- data/lib/neo4j/index/index.rb +0 -39
- data/lib/neo4j/index/indexer.rb +0 -341
- data/lib/neo4j/index/indexer_registry.rb +0 -68
- data/lib/neo4j/index/lucene_query.rb +0 -256
- data/lib/neo4j/load.rb +0 -25
- data/lib/neo4j/migrations/class_methods.rb +0 -110
- data/lib/neo4j/migrations/extensions.rb +0 -58
- data/lib/neo4j/migrations/lazy_node_mixin.rb +0 -41
- data/lib/neo4j/migrations/migration.rb +0 -112
- data/lib/neo4j/migrations/migrations.rb +0 -6
- data/lib/neo4j/migrations/node_mixin.rb +0 -80
- data/lib/neo4j/migrations/ref_node_wrapper.rb +0 -32
- data/lib/neo4j/model.rb +0 -4
- data/lib/neo4j/neo4j.rb +0 -216
- data/lib/neo4j/node.rb +0 -270
- data/lib/neo4j/node_mixin/class_methods.rb +0 -51
- data/lib/neo4j/node_mixin/node_mixin.rb +0 -141
- data/lib/neo4j/paginated.rb +0 -23
- data/lib/neo4j/property/class_methods.rb +0 -79
- data/lib/neo4j/property/property.rb +0 -111
- data/lib/neo4j/rails/mapping/property.rb +0 -183
- data/lib/neo4j/rails/rel_persistence.rb +0 -237
- data/lib/neo4j/relationship.rb +0 -239
- data/lib/neo4j/relationship_mixin/class_methods.rb +0 -36
- data/lib/neo4j/relationship_mixin/relationship_mixin.rb +0 -142
- data/lib/neo4j/relationship_set.rb +0 -58
- data/lib/neo4j/rels/rels.rb +0 -110
- data/lib/neo4j/rels/traverser.rb +0 -102
- data/lib/neo4j/rule/class_methods.rb +0 -201
- data/lib/neo4j/rule/event_listener.rb +0 -66
- data/lib/neo4j/rule/functions/count.rb +0 -43
- data/lib/neo4j/rule/functions/function.rb +0 -74
- data/lib/neo4j/rule/functions/functions.rb +0 -3
- data/lib/neo4j/rule/functions/sum.rb +0 -29
- data/lib/neo4j/rule/rule.rb +0 -150
- data/lib/neo4j/rule/rule_node.rb +0 -217
- data/lib/neo4j/to_java.rb +0 -31
- data/lib/neo4j/transaction.rb +0 -73
- data/lib/neo4j/traversal/filter_predicate.rb +0 -25
- data/lib/neo4j/traversal/prune_evaluator.rb +0 -14
- data/lib/neo4j/traversal/rel_expander.rb +0 -31
- data/lib/neo4j/traversal/traversal.rb +0 -141
- data/lib/neo4j/traversal/traverser.rb +0 -284
- data/lib/neo4j/type_converters/type_converters.rb +0 -288
@@ -1,68 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Index
|
3
|
-
class IndexerRegistry #:nodoc:
|
4
|
-
class << self
|
5
|
-
|
6
|
-
def delete_all_indexes
|
7
|
-
@@indexers.values.each {|i| i.delete_index_type}
|
8
|
-
end
|
9
|
-
|
10
|
-
def create_for(this_clazz, using_other_clazz, type)
|
11
|
-
@@indexers ||= {}
|
12
|
-
index = Indexer.new(this_clazz, type)
|
13
|
-
index.inherit_fields_from(@@indexers[using_other_clazz.to_s]) if @@indexers[using_other_clazz.to_s]
|
14
|
-
@@indexers[this_clazz.to_s] = index
|
15
|
-
end
|
16
|
-
|
17
|
-
def find_by_class(classname)
|
18
|
-
@@indexers[classname]
|
19
|
-
end
|
20
|
-
|
21
|
-
def on_node_deleted(node, old_props, deleted_relationship_set, deleted_identity_map)
|
22
|
-
indexer = find_by_class(old_props['_classname'] || node.class.to_s)
|
23
|
-
indexer && indexer.remove_index_on_fields(node, old_props, deleted_relationship_set)
|
24
|
-
end
|
25
|
-
|
26
|
-
def on_property_changed(node, field, old_val, new_val)
|
27
|
-
classname = node['_classname'] || node.class.to_s
|
28
|
-
indexer = find_by_class(classname)
|
29
|
-
|
30
|
-
indexer && indexer.update_index_on(node, field, old_val, new_val)
|
31
|
-
end
|
32
|
-
|
33
|
-
def on_rel_property_changed(rel, field, old_val, new_val)
|
34
|
-
# works exactly like for nodes
|
35
|
-
on_property_changed(rel, field, old_val, new_val)
|
36
|
-
end
|
37
|
-
|
38
|
-
def on_relationship_created(rel,created_identity_map)
|
39
|
-
end_node = rel._end_node
|
40
|
-
# if end_node was created in this transaction then it will be handled in on_property_changed
|
41
|
-
created = created_identity_map.get(end_node.neo_id)
|
42
|
-
unless created
|
43
|
-
indexer = find_by_class(end_node['_classname'])
|
44
|
-
indexer && indexer.update_on_new_relationship(rel)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def on_relationship_deleted(rel, old_props, deleted_relationship_set, deleted_identity_map)
|
49
|
-
on_node_deleted(rel, old_props, deleted_relationship_set, deleted_identity_map)
|
50
|
-
# if only the relationship has been deleted then we have to remove the index
|
51
|
-
# if both the relationship and the node has been deleted then the index will be removed in the
|
52
|
-
# on_node_deleted callback
|
53
|
-
end_node = rel._end_node
|
54
|
-
deleted = deleted_identity_map.get(end_node.neo_id)
|
55
|
-
unless deleted
|
56
|
-
indexer = find_by_class(end_node['_classname'])
|
57
|
-
indexer && indexer.update_on_deleted_relationship(rel)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def on_neo4j_shutdown(*)
|
62
|
-
@@indexers.each_value {|indexer| indexer.on_neo4j_shutdown}
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
Neo4j.unstarted_db.event_handler.add(IndexerRegistry) unless Neo4j.read_only?
|
67
|
-
end
|
68
|
-
end
|
@@ -1,256 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Index
|
3
|
-
# == LuceneQuery
|
4
|
-
#
|
5
|
-
# This object is returned when you call the #find method on the Node, Relationship.
|
6
|
-
# The actual query is not executed until the first item is requested.
|
7
|
-
#
|
8
|
-
# You can perform a query in many different ways:
|
9
|
-
#
|
10
|
-
# ==== By Hash
|
11
|
-
#
|
12
|
-
# Example:
|
13
|
-
# Person.find(:name => 'foo', :age => 3)
|
14
|
-
#
|
15
|
-
# ==== By Range
|
16
|
-
#
|
17
|
-
# Example:
|
18
|
-
# Person.find(:age).between(15,35)
|
19
|
-
#
|
20
|
-
# ==== By Lucene Query Syntax
|
21
|
-
#
|
22
|
-
# Example
|
23
|
-
# Car.find('wheels:"4" AND colour: "blue")
|
24
|
-
#
|
25
|
-
# For more information about the syntax see http://lucene.apache.org/java/3_0_2/queryparsersyntax.html
|
26
|
-
#
|
27
|
-
# ==== By Compound Queries
|
28
|
-
#
|
29
|
-
# You can combine several queries by <tt>AND</tt>ing those together.
|
30
|
-
#
|
31
|
-
# Example:
|
32
|
-
# Vehicle.find(:weight).between(5.0, 100000.0).and(:name).between('a', 'd')
|
33
|
-
#
|
34
|
-
# === See Also
|
35
|
-
# * Neo4j::Index::Indexer#index
|
36
|
-
# * Neo4j::Index::Indexer#find - which returns an LuceneQuery
|
37
|
-
#
|
38
|
-
class LuceneQuery
|
39
|
-
include Enumerable
|
40
|
-
attr_accessor :left_and_query, :left_or_query, :right_not_query
|
41
|
-
|
42
|
-
def initialize(index, decl_props, query, params={})
|
43
|
-
@index = index
|
44
|
-
@query = query
|
45
|
-
@decl_props = decl_props
|
46
|
-
@params = params
|
47
|
-
|
48
|
-
if params.include?(:sort)
|
49
|
-
@order = {}
|
50
|
-
params[:sort].each_pair { |k, v| @order[k] = (v == :desc) }
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# Implements the Ruby +Enumerable+ interface
|
55
|
-
def each
|
56
|
-
hits.each { |x| yield x.wrapper }
|
57
|
-
end
|
58
|
-
|
59
|
-
# Close hits
|
60
|
-
#
|
61
|
-
# Closes the underlying search result. This method should be called whenever you've got what you wanted from the result and won't use it anymore.
|
62
|
-
# It's necessary to call it so that underlying indexes can dispose of allocated resources for this search result.
|
63
|
-
# You can however skip to call this method if you loop through the whole result, then close() will be called automatically.
|
64
|
-
# Even if you loop through the entire result and then call this method it will silently ignore any consequtive call (for convenience).
|
65
|
-
#
|
66
|
-
# This must be done according to the Neo4j Java Documentation:
|
67
|
-
def close
|
68
|
-
@hits.close if @hits
|
69
|
-
@hits = nil
|
70
|
-
end
|
71
|
-
|
72
|
-
# True if there is no search hits.
|
73
|
-
def empty?
|
74
|
-
hits.size == 0
|
75
|
-
end
|
76
|
-
|
77
|
-
# returns the n'th search item
|
78
|
-
# Does simply loop all search items till the n'th is found.
|
79
|
-
#
|
80
|
-
def [](index)
|
81
|
-
i = 0
|
82
|
-
each{|x| return x if i == index; i += 1}
|
83
|
-
nil # out of index
|
84
|
-
end
|
85
|
-
|
86
|
-
# Returns the number of search hits
|
87
|
-
def size
|
88
|
-
hits.size
|
89
|
-
end
|
90
|
-
|
91
|
-
def hits #:nodoc:
|
92
|
-
close
|
93
|
-
@hits = perform_query
|
94
|
-
end
|
95
|
-
|
96
|
-
# Performs a range query
|
97
|
-
# Notice that if you don't specify a type when declaring a property a String range query will be performed.
|
98
|
-
#
|
99
|
-
def between(lower, upper, lower_incusive=false, upper_inclusive=false)
|
100
|
-
raise "Expected a symbol. Syntax for range queries example: index(:weight).between(a,b)" unless Symbol === @query
|
101
|
-
raise "Can't only do range queries on Neo4j::NodeMixin, Neo4j::Model, Neo4j::RelationshipMixin" unless @decl_props
|
102
|
-
# check that we perform a range query on the same values as we have declared with the property :key, :type => ...
|
103
|
-
type = @decl_props[@query] && @decl_props[@query][:type]
|
104
|
-
raise "find(#{@query}).between(#{lower}, #{upper}): #{lower} not a #{type}" if type && !type === lower.class
|
105
|
-
raise "find(#{@query}).between(#{lower}, #{upper}): #{upper} not a #{type}" if type && !type === upper.class
|
106
|
-
|
107
|
-
# Make it possible to convert those values
|
108
|
-
@query = range_query(@query, lower, upper, lower_incusive, upper_inclusive)
|
109
|
-
self
|
110
|
-
end
|
111
|
-
|
112
|
-
def range_query(field, lower, upper, lower_incusive, upper_inclusive)
|
113
|
-
lower = TypeConverters.convert(lower)
|
114
|
-
upper = TypeConverters.convert(upper)
|
115
|
-
|
116
|
-
case lower
|
117
|
-
when Fixnum
|
118
|
-
org.apache.lucene.search.NumericRangeQuery.new_long_range(field.to_s, lower, upper, lower_incusive, upper_inclusive)
|
119
|
-
when Float
|
120
|
-
org.apache.lucene.search.NumericRangeQuery.new_double_range(field.to_s, lower, upper, lower_incusive, upper_inclusive)
|
121
|
-
else
|
122
|
-
org.apache.lucene.search.TermRangeQuery.new(field.to_s, lower, upper, lower_incusive, upper_inclusive)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
|
127
|
-
# Create a compound lucene query.
|
128
|
-
#
|
129
|
-
# ==== Parameters
|
130
|
-
# query2 :: the query that should be AND together
|
131
|
-
#
|
132
|
-
# ==== Example
|
133
|
-
#
|
134
|
-
# Person.find(:name=>'kalle').and(:age => 3)
|
135
|
-
#
|
136
|
-
def and(query2)
|
137
|
-
LuceneQuery.new(@index, @decl_props, query2).tap { |new_query| new_query.left_and_query = self }
|
138
|
-
end
|
139
|
-
|
140
|
-
# Create an OR lucene query.
|
141
|
-
#
|
142
|
-
# ==== Parameters
|
143
|
-
# query2 :: the query that should be OR together
|
144
|
-
#
|
145
|
-
# ==== Example
|
146
|
-
#
|
147
|
-
# Person.find(:name=>'kalle').or(:age => 3)
|
148
|
-
#
|
149
|
-
def or(query2)
|
150
|
-
LuceneQuery.new(@index, @decl_props, query2).tap { |new_query| new_query.left_or_query = self }
|
151
|
-
end
|
152
|
-
|
153
|
-
# Create a NOT lucene query.
|
154
|
-
#
|
155
|
-
# ==== Parameters
|
156
|
-
# query2 :: the query that should exclude matching results
|
157
|
-
#
|
158
|
-
# ==== Example
|
159
|
-
#
|
160
|
-
# Person.find(:age => 3).not(:name=>'kalle')
|
161
|
-
#
|
162
|
-
def not(query2)
|
163
|
-
LuceneQuery.new(@index, @decl_props, query2).tap { |new_query| new_query.right_not_query = self }
|
164
|
-
end
|
165
|
-
|
166
|
-
|
167
|
-
# Sort descending the given fields.
|
168
|
-
def desc(*fields)
|
169
|
-
@order = fields.inject(@order || {}) { |memo, field| memo[field] = true; memo }
|
170
|
-
self
|
171
|
-
end
|
172
|
-
|
173
|
-
# Sort ascending the given fields.
|
174
|
-
def asc(*fields)
|
175
|
-
@order = fields.inject(@order || {}) { |memo, field| memo[field] = false; memo }
|
176
|
-
self
|
177
|
-
end
|
178
|
-
|
179
|
-
def build_and_query(query) #:nodoc:
|
180
|
-
build_composite_query(@left_and_query.build_query, query, org.apache.lucene.search.BooleanClause::Occur::MUST)
|
181
|
-
end
|
182
|
-
|
183
|
-
def build_or_query(query) #:nodoc:
|
184
|
-
build_composite_query(@left_or_query.build_query, query, org.apache.lucene.search.BooleanClause::Occur::SHOULD)
|
185
|
-
end
|
186
|
-
|
187
|
-
def build_not_query(query) #:nodoc:
|
188
|
-
right_query = @right_not_query.build_query
|
189
|
-
composite_query = org.apache.lucene.search.BooleanQuery.new
|
190
|
-
composite_query.add(query, org.apache.lucene.search.BooleanClause::Occur::MUST_NOT)
|
191
|
-
composite_query.add(right_query, org.apache.lucene.search.BooleanClause::Occur::MUST)
|
192
|
-
composite_query
|
193
|
-
end
|
194
|
-
|
195
|
-
def build_composite_query(left_query, right_query, opeartor) #:nodoc:
|
196
|
-
composite_query = org.apache.lucene.search.BooleanQuery.new
|
197
|
-
composite_query.add(left_query, opeartor)
|
198
|
-
composite_query.add(right_query, opeartor)
|
199
|
-
composite_query
|
200
|
-
end
|
201
|
-
|
202
|
-
def build_sort_query(query) #:nodoc:
|
203
|
-
java_sort_fields = @order.keys.inject([]) do |memo, field|
|
204
|
-
decl_type = @decl_props && @decl_props[field] && @decl_props[field][:type]
|
205
|
-
type = case
|
206
|
-
when Float == decl_type
|
207
|
-
org.apache.lucene.search.SortField::DOUBLE
|
208
|
-
when Fixnum == decl_type || DateTime == decl_type || Date == decl_type || Time == decl_type
|
209
|
-
org.apache.lucene.search.SortField::LONG
|
210
|
-
else
|
211
|
-
org.apache.lucene.search.SortField::STRING
|
212
|
-
end
|
213
|
-
memo << org.apache.lucene.search.SortField.new(field.to_s, type, @order[field])
|
214
|
-
end
|
215
|
-
sort = org.apache.lucene.search.Sort.new(*java_sort_fields)
|
216
|
-
org.neo4j.index.lucene.QueryContext.new(query).sort(sort)
|
217
|
-
end
|
218
|
-
|
219
|
-
def build_hash_query(query) #:nodoc:
|
220
|
-
and_query = org.apache.lucene.search.BooleanQuery.new
|
221
|
-
|
222
|
-
query.each_pair do |key, value|
|
223
|
-
type = @decl_props && @decl_props[key.to_sym] && @decl_props[key.to_sym][:type]
|
224
|
-
if !type.nil? && type != String
|
225
|
-
if Range === value
|
226
|
-
and_query.add(range_query(key, value.first, value.last, true, !value.exclude_end?), org.apache.lucene.search.BooleanClause::Occur::MUST)
|
227
|
-
else
|
228
|
-
and_query.add(range_query(key, value, value, true, true), org.apache.lucene.search.BooleanClause::Occur::MUST)
|
229
|
-
end
|
230
|
-
else
|
231
|
-
conv_value = type ? TypeConverters.convert(value) : value.to_s
|
232
|
-
term = org.apache.lucene.index.Term.new(key.to_s, conv_value)
|
233
|
-
term_query = org.apache.lucene.search.TermQuery.new(term)
|
234
|
-
and_query.add(term_query, org.apache.lucene.search.BooleanClause::Occur::MUST)
|
235
|
-
end
|
236
|
-
end
|
237
|
-
and_query
|
238
|
-
end
|
239
|
-
|
240
|
-
def build_query #:nodoc:
|
241
|
-
query = @query
|
242
|
-
query = build_hash_query(query) if Hash === query
|
243
|
-
query = build_and_query(query) if @left_and_query
|
244
|
-
query = build_or_query(query) if @left_or_query
|
245
|
-
query = build_not_query(query) if @right_not_query
|
246
|
-
query = build_sort_query(query) if @order
|
247
|
-
query
|
248
|
-
end
|
249
|
-
|
250
|
-
def perform_query #:nodoc:
|
251
|
-
@index.query(build_query)
|
252
|
-
end
|
253
|
-
end
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
data/lib/neo4j/load.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
# === Mixin responsible for loading Ruby wrappers for Neo4j Nodes and Relationship.
|
4
|
-
#
|
5
|
-
module Load
|
6
|
-
def wrapper(entity) # :nodoc:
|
7
|
-
return entity unless entity.property?(:_classname)
|
8
|
-
existing_instance = Neo4j::IdentityMap.get(entity)
|
9
|
-
return existing_instance if existing_instance
|
10
|
-
new_instance = to_class(entity[:_classname]).load_wrapper(entity)
|
11
|
-
Neo4j::IdentityMap.add(entity, new_instance)
|
12
|
-
new_instance
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_class(class_name) # :nodoc:
|
16
|
-
class_name.split("::").inject(Kernel) {|container, name| container.const_get(name.to_s) }
|
17
|
-
end
|
18
|
-
|
19
|
-
# Checks if the given entity (node/relationship) or entity id (#neo_id) exists in the database.
|
20
|
-
def exist?(entity_or_entity_id, db = Neo4j.started_db)
|
21
|
-
id = entity_or_entity_id.kind_of?(Fixnum) ? entity_or_entity_id : entity_or_entity_id.id
|
22
|
-
_load(id, db) != nil
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,110 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Migrations
|
3
|
-
module ClassMethods
|
4
|
-
|
5
|
-
# Sets the the version we request to migrate to
|
6
|
-
# If not set will migrate to the highest possible migration
|
7
|
-
def migrate_to=(version)
|
8
|
-
@migrate_to = version
|
9
|
-
end
|
10
|
-
|
11
|
-
def migrate_to
|
12
|
-
@migrate_to
|
13
|
-
end
|
14
|
-
|
15
|
-
def latest_migration
|
16
|
-
migrations.keys.sort.reverse[0]
|
17
|
-
end
|
18
|
-
|
19
|
-
# contains all the migrations defined with the #migration DSL method
|
20
|
-
def migrations
|
21
|
-
@migrations ||= {}
|
22
|
-
end
|
23
|
-
|
24
|
-
# Remote all migration and set migrate_to = nil
|
25
|
-
# Does not change the version of nodes.
|
26
|
-
def reset_migrations!
|
27
|
-
@migrations = nil
|
28
|
-
@migrate_to = nil
|
29
|
-
end
|
30
|
-
|
31
|
-
|
32
|
-
# Specifies a migration to be performed.
|
33
|
-
# Updates the migrate_to variable so that it will migrate to the latest migration.
|
34
|
-
#
|
35
|
-
# === Example
|
36
|
-
#
|
37
|
-
# In the following example the up and down method will be evaluated in the context of a Person node.
|
38
|
-
#
|
39
|
-
# Person.migration 1, :my_first_migration do
|
40
|
-
# up { ... }
|
41
|
-
# down { ... }
|
42
|
-
# end
|
43
|
-
#
|
44
|
-
# See the Neo4j::Migrations::Migration which the DSL is evaluated in.
|
45
|
-
#
|
46
|
-
def migration(version, name, &block)
|
47
|
-
migration = Migration.new(version, name)
|
48
|
-
migration.instance_eval(&block)
|
49
|
-
migrations[version] = migration
|
50
|
-
self.migrate_to = latest_migration
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
def _migrate!(context, meta_node, version=nil) #:nodoc:
|
55
|
-
# set the version we want to migrate to if provided
|
56
|
-
self.migrate_to = version if version
|
57
|
-
|
58
|
-
# requested to migrate to a version ?
|
59
|
-
return if self.migrate_to.nil?
|
60
|
-
|
61
|
-
# which version are we on now ?
|
62
|
-
current_version = meta_node[:_db_version] || 0
|
63
|
-
|
64
|
-
# do we need to migrate ?
|
65
|
-
return if current_version == self.migrate_to
|
66
|
-
|
67
|
-
# ok, so we are running some migrations
|
68
|
-
if Neo4j::Config['migration_thread']
|
69
|
-
Thread.new { _upgrade_or_downgrade(current_version, context, meta_node) }
|
70
|
-
else
|
71
|
-
_upgrade_or_downgrade(current_version, context, meta_node)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def _upgrade_or_downgrade(current_version, context, meta_node) #:nodoc:
|
76
|
-
if (current_version < self.migrate_to)
|
77
|
-
upgrade((current_version+1).upto(self.migrate_to).collect { |ver| migrations[ver] }, context, meta_node)
|
78
|
-
else
|
79
|
-
downgrade(current_version.downto(self.migrate_to+1).collect { |ver| migrations[ver] }, context, meta_node)
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
|
85
|
-
# Running the up method on the given migrations.
|
86
|
-
#
|
87
|
-
# === Parameters
|
88
|
-
# migrations :: an enumerable of Migration objects
|
89
|
-
def upgrade(migrations, context, meta_node)
|
90
|
-
migrations.each do |m|
|
91
|
-
Neo4j.logger.info "Running upgrade: #{m}"
|
92
|
-
m.execute_up(context, meta_node)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
# Running the down method on the given migrations.
|
97
|
-
#
|
98
|
-
# === Parameters
|
99
|
-
# migrations:: an enumerable of Migration objects
|
100
|
-
def downgrade(migrations, context, meta_node)
|
101
|
-
migrations.each do |m|
|
102
|
-
Neo4j.logger.info "Running downgrade: #{m}"
|
103
|
-
m.execute_down(context, meta_node)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
end
|