nobrainer 0.27.0 → 0.28.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/no_brainer/config.rb +36 -8
- data/lib/no_brainer/connection.rb +16 -19
- data/lib/no_brainer/connection_manager.rb +10 -10
- data/lib/no_brainer/criteria.rb +1 -1
- data/lib/no_brainer/criteria/eager_load.rb +1 -1
- data/lib/no_brainer/criteria/find.rb +1 -1
- data/lib/no_brainer/criteria/first.rb +2 -2
- data/lib/no_brainer/criteria/first_or_create.rb +32 -19
- data/lib/no_brainer/criteria/join.rb +62 -0
- data/lib/no_brainer/criteria/where.rb +25 -14
- data/lib/no_brainer/document.rb +1 -1
- data/lib/no_brainer/document/association/belongs_to.rb +4 -3
- data/lib/no_brainer/document/association/eager_loader.rb +26 -25
- data/lib/no_brainer/document/association/has_many.rb +3 -2
- data/lib/no_brainer/document/association/has_many_through.rb +1 -2
- data/lib/no_brainer/document/association/has_one.rb +4 -0
- data/lib/no_brainer/document/atomic_ops.rb +31 -4
- data/lib/no_brainer/document/attributes.rb +12 -9
- data/lib/no_brainer/document/core.rb +18 -18
- data/lib/no_brainer/document/criteria.rb +3 -2
- data/lib/no_brainer/document/dirty.rb +3 -3
- data/lib/no_brainer/document/index.rb +3 -3
- data/lib/no_brainer/document/index/index.rb +5 -5
- data/lib/no_brainer/document/index/meta_store.rb +1 -1
- data/lib/no_brainer/document/index/synchronizer.rb +5 -17
- data/lib/no_brainer/document/missing_attributes.rb +7 -2
- data/lib/no_brainer/document/primary_key.rb +14 -8
- data/lib/no_brainer/document/table_config.rb +118 -0
- data/lib/no_brainer/document/table_config/synchronizer.rb +21 -0
- data/lib/no_brainer/document/timestamps.rb +4 -0
- data/lib/no_brainer/document/validation/core.rb +1 -1
- data/lib/no_brainer/document/validation/uniqueness.rb +1 -1
- data/lib/no_brainer/lock.rb +4 -4
- data/lib/no_brainer/profiler/logger.rb +1 -1
- data/lib/no_brainer/query_runner/database_on_demand.rb +1 -1
- data/lib/no_brainer/query_runner/reconnect.rb +37 -21
- data/lib/no_brainer/query_runner/table_on_demand.rb +12 -5
- data/lib/no_brainer/railtie/database.rake +14 -4
- data/lib/no_brainer/rql.rb +3 -2
- data/lib/no_brainer/symbol_decoration.rb +1 -1
- data/lib/no_brainer/system.rb +17 -0
- data/lib/no_brainer/system/cluster_config.rb +5 -0
- data/lib/no_brainer/system/db_config.rb +5 -0
- data/lib/no_brainer/system/document.rb +24 -0
- data/lib/no_brainer/system/issue.rb +10 -0
- data/lib/no_brainer/system/job.rb +10 -0
- data/lib/no_brainer/system/log.rb +11 -0
- data/lib/no_brainer/system/server_config.rb +7 -0
- data/lib/no_brainer/system/server_status.rb +9 -0
- data/lib/no_brainer/system/stat.rb +11 -0
- data/lib/no_brainer/system/table_config.rb +10 -0
- data/lib/no_brainer/system/table_status.rb +8 -0
- data/lib/nobrainer.rb +7 -6
- data/lib/rails/generators/templates/nobrainer.rb +11 -2
- metadata +17 -3
- data/lib/no_brainer/document/store_in.rb +0 -33
data/lib/no_brainer/document.rb
CHANGED
@@ -4,7 +4,7 @@ module NoBrainer::Document
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
extend NoBrainer::Autoload
|
6
6
|
|
7
|
-
autoload_and_include :Core, :
|
7
|
+
autoload_and_include :Core, :TableConfig, :InjectionLayer, :Attributes, :Readonly,
|
8
8
|
:Persistance, :Callbacks, :Validation, :Types, :Dirty, :PrimaryKey,
|
9
9
|
:Association, :Serialization, :Criteria, :Polymorphic, :Index, :Aliases,
|
10
10
|
:MissingAttributes, :LazyFetch, :AtomicOps
|
@@ -4,7 +4,7 @@ class NoBrainer::Document::Association::BelongsTo
|
|
4
4
|
class Metadata
|
5
5
|
VALID_OPTIONS = [:primary_key, :foreign_key, :class_name, :foreign_key_store_as, :index, :validates, :required]
|
6
6
|
include NoBrainer::Document::Association::Core::Metadata
|
7
|
-
|
7
|
+
include NoBrainer::Document::Association::EagerLoader::Generic
|
8
8
|
|
9
9
|
def foreign_key
|
10
10
|
options[:foreign_key].try(:to_sym) || :"#{target_name}_#{primary_key}"
|
@@ -34,7 +34,7 @@ class NoBrainer::Document::Association::BelongsTo
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def base_criteria
|
37
|
-
target_model.unscoped
|
37
|
+
target_model.without_ordering.unscoped
|
38
38
|
end
|
39
39
|
|
40
40
|
def hook
|
@@ -68,7 +68,8 @@ class NoBrainer::Document::Association::BelongsTo
|
|
68
68
|
add_callback_for(:after_validation)
|
69
69
|
end
|
70
70
|
|
71
|
-
|
71
|
+
def eager_load_owner_key; foreign_key; end
|
72
|
+
def eager_load_target_key; primary_key; end
|
72
73
|
end
|
73
74
|
|
74
75
|
# Note:
|
@@ -1,31 +1,32 @@
|
|
1
|
-
|
1
|
+
module NoBrainer::Document::Association::EagerLoader
|
2
|
+
extend self
|
3
|
+
|
2
4
|
module Generic
|
3
5
|
# Used in associations to declare generic eager loading capabilities
|
4
|
-
# The association should implement loaded
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
owner_keys = unloaded_docs.map(&owner_key).compact.uniq
|
16
|
-
if owner_keys.present?
|
17
|
-
targets = criteria.where(target_key.in => owner_keys)
|
18
|
-
.map { |target| [target.read_attribute(target_key), target] }
|
19
|
-
.each_with_object(Hash.new { |k,v| k[v] = [] }) { |(k,v),h| h[k] << v }
|
20
|
-
|
21
|
-
unloaded_docs.each do |doc|
|
22
|
-
doc_targets = targets[doc.read_attribute(owner_key)]
|
23
|
-
doc.associations[self].preload(doc_targets)
|
24
|
-
end
|
25
|
-
end
|
6
|
+
# The association should implement loaded?, preload,
|
7
|
+
# eager_load_owner_key and eager_load_target_key.
|
8
|
+
def eager_load(docs, additional_criteria=nil)
|
9
|
+
owner_key = eager_load_owner_key
|
10
|
+
target_key = eager_load_target_key
|
11
|
+
|
12
|
+
criteria = base_criteria
|
13
|
+
criteria = criteria.merge(additional_criteria) if additional_criteria
|
14
|
+
|
15
|
+
unloaded_docs = docs.reject { |doc| doc.associations[self].loaded? }
|
26
16
|
|
27
|
-
|
17
|
+
owner_keys = unloaded_docs.map(&owner_key).compact.uniq
|
18
|
+
if owner_keys.present?
|
19
|
+
targets = criteria.where(target_key.in => owner_keys)
|
20
|
+
.map { |target| [target.read_attribute(target_key), target] }
|
21
|
+
.each_with_object(Hash.new { |k,v| k[v] = [] }) { |(k,v),h| h[k] << v }
|
22
|
+
|
23
|
+
unloaded_docs.each do |doc|
|
24
|
+
doc_targets = targets[doc.read_attribute(owner_key)]
|
25
|
+
doc.associations[self].preload(doc_targets)
|
26
|
+
end
|
28
27
|
end
|
28
|
+
|
29
|
+
docs.map { |doc| doc.associations[self].read }.flatten.compact.uniq
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
@@ -40,7 +41,7 @@ class NoBrainer::Document::Association::EagerLoader
|
|
40
41
|
|
41
42
|
def eager_load(docs, what)
|
42
43
|
case what
|
43
|
-
when Hash
|
44
|
+
when Hash then what.each do |k,v|
|
44
45
|
if v.is_a?(NoBrainer::Criteria)
|
45
46
|
v = v.dup
|
46
47
|
nested_preloads, v.options[:eager_load] = v.options[:eager_load], []
|
@@ -4,7 +4,7 @@ class NoBrainer::Document::Association::HasMany
|
|
4
4
|
class Metadata
|
5
5
|
VALID_OPTIONS = [:primary_key, :foreign_key, :class_name, :dependent, :scope]
|
6
6
|
include NoBrainer::Document::Association::Core::Metadata
|
7
|
-
|
7
|
+
include NoBrainer::Document::Association::EagerLoader::Generic
|
8
8
|
|
9
9
|
def foreign_key
|
10
10
|
options[:foreign_key].try(:to_sym) || :"#{owner_model.name.split('::').last.underscore}_#{primary_key}"
|
@@ -53,7 +53,8 @@ class NoBrainer::Document::Association::HasMany
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
|
56
|
+
def eager_load_owner_key; primary_key; end
|
57
|
+
def eager_load_target_key; foreign_key; end
|
57
58
|
end
|
58
59
|
|
59
60
|
def target_criteria
|
@@ -17,7 +17,7 @@ class NoBrainer::Document::Association::HasManyThrough
|
|
17
17
|
def eager_load(docs, additional_criteria=nil)
|
18
18
|
criteria = target_model.instance_exec(&options[:scope]) if options[:scope]
|
19
19
|
criteria = criteria ? criteria.merge(additional_criteria) : additional_criteria if additional_criteria
|
20
|
-
NoBrainer::Document::Association::EagerLoader
|
20
|
+
NoBrainer::Document::Association::EagerLoader
|
21
21
|
.eager_load_association(through_association.eager_load(docs), target_name, criteria)
|
22
22
|
end
|
23
23
|
|
@@ -29,7 +29,6 @@ class NoBrainer::Document::Association::HasManyThrough
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def read
|
32
|
-
# TODO implement joins
|
33
32
|
@targets ||= metadata.eager_load([owner]).freeze
|
34
33
|
end
|
35
34
|
|
@@ -42,7 +42,7 @@ module NoBrainer::Document::AtomicOps
|
|
42
42
|
def to_s
|
43
43
|
"<`#{@field}' with #{@ops.size} pending atomic operations>"
|
44
44
|
end
|
45
|
-
|
45
|
+
def inspect; to_s; end
|
46
46
|
|
47
47
|
def method_missing(method, *a, &b)
|
48
48
|
if method == :<<
|
@@ -131,6 +131,18 @@ module NoBrainer::Document::AtomicOps
|
|
131
131
|
end
|
132
132
|
end
|
133
133
|
|
134
|
+
class PendingAtomicUnset < PendingAtomic
|
135
|
+
def to_s
|
136
|
+
"<unset `#{@field}'>"
|
137
|
+
end
|
138
|
+
|
139
|
+
undef_method(:method_missing)
|
140
|
+
|
141
|
+
def compile_rql_value(rql_doc)
|
142
|
+
RethinkDB::RQL.new.literal()
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
134
146
|
def clear_dirtiness(options={})
|
135
147
|
super
|
136
148
|
@_touched_attributes = Set.new
|
@@ -172,13 +184,18 @@ module NoBrainer::Document::AtomicOps
|
|
172
184
|
end
|
173
185
|
|
174
186
|
def _read_attribute(name)
|
187
|
+
return super if name == self.class.pk_name
|
188
|
+
|
175
189
|
ensure_exclusive_atomic!
|
176
|
-
|
177
|
-
|
190
|
+
return super unless in_atomic?
|
191
|
+
|
192
|
+
# If we are missing fields, it's okay, we'll assume nil.
|
193
|
+
value = missing_field?(name) ? nil : super
|
178
194
|
|
179
195
|
case value
|
180
196
|
when PendingAtomicContainer then value
|
181
|
-
when
|
197
|
+
when PendingAtomicUnset then raise "Attribute `#{name}' is unset"
|
198
|
+
when PendingAtomic then value.dup
|
182
199
|
else PendingAtomic._new(self, name, value, _is_attribute_touched?(name))
|
183
200
|
end
|
184
201
|
end
|
@@ -199,6 +216,11 @@ module NoBrainer::Document::AtomicOps
|
|
199
216
|
super
|
200
217
|
end
|
201
218
|
|
219
|
+
def unset(attr)
|
220
|
+
return queue_atomic { unset(attr) } unless in_atomic?
|
221
|
+
_write_attribute(attr, PendingAtomicUnset.new(self, attr, nil, true, nil))
|
222
|
+
end
|
223
|
+
|
202
224
|
def save?(options={})
|
203
225
|
# TODO allow reload => true as an option to save+reload in a single op.
|
204
226
|
raise NoBrainer::Error::AtomicBlock.new('You may persist documents only outside of queue_atomic blocks') if in_atomic?
|
@@ -212,6 +234,11 @@ module NoBrainer::Document::AtomicOps
|
|
212
234
|
end
|
213
235
|
end
|
214
236
|
|
237
|
+
def reload(*)
|
238
|
+
raise NoBrainer::Error::AtomicBlock.new('You may not reload fields within an atomic block') if in_atomic?
|
239
|
+
super
|
240
|
+
end
|
241
|
+
|
215
242
|
module ClassMethods
|
216
243
|
def persistable_value(k, v, options={})
|
217
244
|
v.is_a?(PendingAtomic) ? v.compile_rql_value(options[:rql_doc]) : super
|
@@ -49,8 +49,10 @@ module NoBrainer::Document::Attributes
|
|
49
49
|
|
50
50
|
def assign_defaults(options)
|
51
51
|
self.class.fields.each do |name, field_options|
|
52
|
-
|
53
|
-
|
52
|
+
# :default => nil will not set the value to nil, but :default => ->{ nil } will.
|
53
|
+
# This is useful to unset a default value.
|
54
|
+
|
55
|
+
next if field_options[:default].nil? || @_attributes.key?(name)
|
54
56
|
|
55
57
|
if opt = options[:missing_attributes]
|
56
58
|
if (opt[:pluck] && !opt[:pluck][name]) ||
|
@@ -113,8 +115,14 @@ module NoBrainer::Document::Attributes
|
|
113
115
|
super
|
114
116
|
end
|
115
117
|
|
118
|
+
# The different between _field and field is that field can set other options
|
119
|
+
# (c.f. primary key module). _field always receive an immutable options list.
|
116
120
|
def _field(attr, options={})
|
117
|
-
|
121
|
+
options.assert_valid_keys(*VALID_FIELD_OPTIONS)
|
122
|
+
if attr.in?(RESERVED_FIELD_NAMES)
|
123
|
+
raise "The field name `:#{attr}' is reserved. Please use another one."
|
124
|
+
end
|
125
|
+
|
118
126
|
attr = attr.to_s
|
119
127
|
inject_in_layer :attributes do
|
120
128
|
define_method("#{attr}=") { |value| _write_attribute(attr, value) }
|
@@ -125,11 +133,6 @@ module NoBrainer::Document::Attributes
|
|
125
133
|
def field(attr, options={})
|
126
134
|
attr = attr.to_sym
|
127
135
|
|
128
|
-
options.assert_valid_keys(*VALID_FIELD_OPTIONS)
|
129
|
-
if attr.in?(RESERVED_FIELD_NAMES)
|
130
|
-
raise "Cannot use a reserved field attr: #{attr}"
|
131
|
-
end
|
132
|
-
|
133
136
|
subclass_tree.each do |subclass|
|
134
137
|
subclass.fields[attr] ||= {}
|
135
138
|
subclass.fields[attr].deep_merge!(options)
|
@@ -161,7 +164,7 @@ module NoBrainer::Document::Attributes
|
|
161
164
|
|
162
165
|
def ensure_valid_key!(key)
|
163
166
|
return if has_field?(key) || has_index?(key)
|
164
|
-
raise NoBrainer::Error::UnknownAttribute, "`#{key}' is not a
|
167
|
+
raise NoBrainer::Error::UnknownAttribute, "`#{key}' is not a valid attribute of #{self}"
|
165
168
|
end
|
166
169
|
end
|
167
170
|
end
|
@@ -1,30 +1,30 @@
|
|
1
1
|
module NoBrainer::Document::Core
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
|
-
singleton_class.class_eval
|
5
|
-
attr_accessor :_all, :_all_nobrainer
|
6
|
-
|
7
|
-
def all
|
8
|
-
Rails.application.eager_load! if defined?(Rails.application.eager_load!)
|
9
|
-
@_all
|
10
|
-
end
|
11
|
-
end
|
4
|
+
singleton_class.class_eval { attr_accessor :_all }
|
12
5
|
self._all = []
|
13
|
-
self._all_nobrainer = []
|
14
|
-
|
15
|
-
include ActiveModel::Conversion
|
16
|
-
|
17
|
-
def to_key
|
18
|
-
# ActiveModel::Conversion stuff
|
19
|
-
[pk_value]
|
20
|
-
end
|
21
6
|
|
22
7
|
included do
|
23
8
|
# TODO test these includes
|
24
9
|
extend ActiveModel::Naming
|
25
10
|
extend ActiveModel::Translation
|
26
11
|
|
27
|
-
|
28
|
-
|
12
|
+
NoBrainer::Document::Core._all << self unless name =~ /^NoBrainer::/
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.all(options={})
|
16
|
+
(options[:types] || [:user]).map do |type|
|
17
|
+
case type
|
18
|
+
when :user
|
19
|
+
Rails.application.eager_load! if defined?(Rails.application.eager_load!)
|
20
|
+
_all
|
21
|
+
when :nobrainer
|
22
|
+
[NoBrainer::Document::Index::MetaStore, NoBrainer::Lock]
|
23
|
+
when :system
|
24
|
+
NoBrainer::System.constants
|
25
|
+
.map { |c| NoBrainer::System.const_get(c) }
|
26
|
+
.select { |m| m < NoBrainer::Document }
|
27
|
+
end
|
28
|
+
end.reduce([], &:+)
|
29
29
|
end
|
30
30
|
end
|
@@ -18,7 +18,7 @@ module NoBrainer::Document::Criteria
|
|
18
18
|
:limit, :offset, :skip, # Limit
|
19
19
|
:order_by, :reverse_order, :without_ordering, :order_by_indexed?, :order_by_index_name, # OrderBy
|
20
20
|
:unscoped, # Scope
|
21
|
-
:where, :where_indexed?, :where_index_name, :where_index_type, # Where
|
21
|
+
:_where, :where, :where_indexed?, :where_index_name, :where_index_type, # Where
|
22
22
|
:with_index, :without_index, :used_index, # Index
|
23
23
|
:with_cache, :without_cache, # Cache
|
24
24
|
:count, :empty?, :any?, # Count
|
@@ -26,12 +26,13 @@ module NoBrainer::Document::Criteria
|
|
26
26
|
:preload, :eager_load, # EagerLoad
|
27
27
|
:each, :to_a, # Enumerable
|
28
28
|
:first, :last, :first!, :last!, :sample, # First
|
29
|
-
:first_or_create, :first_or_create!, # FirstOrCreate
|
29
|
+
:upsert, :upsert!, :first_or_create, :first_or_create!, # FirstOrCreate
|
30
30
|
:min, :max, :sum, :avg, # Aggregate
|
31
31
|
:update_all, :replace_all, # Update
|
32
32
|
:changes, # Changes
|
33
33
|
:pluck, :without, :lazy_fetch, :without_plucking, # Pluck
|
34
34
|
:find_by?, :find_by, :find_by!, :find?, :find, :find!, # Find
|
35
|
+
:join, #Join
|
35
36
|
:to => :all
|
36
37
|
|
37
38
|
def all
|
@@ -56,7 +56,7 @@ module NoBrainer::Document::Dirty
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
unless @_old_attributes.
|
59
|
+
unless @_old_attributes.key?(attr)
|
60
60
|
@_old_attributes[attr] = current_value.deep_dup
|
61
61
|
end
|
62
62
|
end
|
@@ -81,7 +81,7 @@ module NoBrainer::Document::Dirty
|
|
81
81
|
|
82
82
|
inject_in_layer :dirty_tracking do
|
83
83
|
define_method("#{attr}_change") do
|
84
|
-
if @_old_attributes.
|
84
|
+
if @_old_attributes.key?(attr)
|
85
85
|
result = [@_old_attributes[attr], _read_attribute(attr)]
|
86
86
|
result if result.first != result.last || !@_old_attributes_keys.include?(attr)
|
87
87
|
end
|
@@ -92,7 +92,7 @@ module NoBrainer::Document::Dirty
|
|
92
92
|
end
|
93
93
|
|
94
94
|
define_method("#{attr}_was") do
|
95
|
-
@_old_attributes.
|
95
|
+
@_old_attributes.key?(attr) ? @_old_attributes[attr] : _read_attribute(attr)
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|
@@ -26,11 +26,11 @@ module NoBrainer::Document::Index
|
|
26
26
|
end
|
27
27
|
|
28
28
|
if name.in?(NoBrainer::Document::Attributes::RESERVED_FIELD_NAMES)
|
29
|
-
raise "
|
29
|
+
raise "The index name `:#{name}' is reserved. Please use another one."
|
30
30
|
end
|
31
31
|
|
32
32
|
if has_field?(name) && kind != :single
|
33
|
-
raise "
|
33
|
+
raise "The field `#{name}' is already declared. Please remove its definition first."
|
34
34
|
end
|
35
35
|
|
36
36
|
if kind == :compound && what.size < 2
|
@@ -56,7 +56,7 @@ module NoBrainer::Document::Index
|
|
56
56
|
|
57
57
|
def _field(attr, options={})
|
58
58
|
if has_index?(attr) && indexes[attr].kind != :single
|
59
|
-
raise "
|
59
|
+
raise "The index `#{attr}' is already declared. Please remove its definition first."
|
60
60
|
end
|
61
61
|
|
62
62
|
super
|
@@ -1,8 +1,6 @@
|
|
1
1
|
class NoBrainer::Document::Index::Index < Struct.new(
|
2
2
|
:model, :name, :aliased_name, :kind, :what, :external, :geo, :multi, :meta)
|
3
3
|
|
4
|
-
MetaStore = NoBrainer::Document::Index::MetaStore
|
5
|
-
|
6
4
|
def initialize(*args)
|
7
5
|
super
|
8
6
|
|
@@ -59,8 +57,9 @@ class NoBrainer::Document::Index::Index < Struct.new(
|
|
59
57
|
NoBrainer::RQL.reset_lambda_var_counter
|
60
58
|
NoBrainer.run(model.rql_table.index_create(aliased_name, opt, &rql_proc))
|
61
59
|
|
62
|
-
MetaStore.create(
|
63
|
-
|
60
|
+
NoBrainer::Document::Index::MetaStore.create(
|
61
|
+
:table_name => model.table_name, :index_name => aliased_name,
|
62
|
+
:rql_function => serialized_rql_proc)
|
64
63
|
end
|
65
64
|
|
66
65
|
def delete(options={})
|
@@ -68,7 +67,8 @@ class NoBrainer::Document::Index::Index < Struct.new(
|
|
68
67
|
|
69
68
|
NoBrainer.run(model.rql_table.index_drop(aliased_name))
|
70
69
|
|
71
|
-
MetaStore.where(
|
70
|
+
NoBrainer::Document::Index::MetaStore.where(
|
71
|
+
:table_name => model.table_name, :index_name => aliased_name).delete_all
|
72
72
|
end
|
73
73
|
|
74
74
|
def update(wanted_index, options={})
|
@@ -6,7 +6,7 @@ class NoBrainer::Document::Index::MetaStore
|
|
6
6
|
|
7
7
|
default_scope ->{ order_by(:created_at) }
|
8
8
|
|
9
|
-
|
9
|
+
table_config :name => 'nobrainer_index_meta'
|
10
10
|
|
11
11
|
field :table_name, :type => String, :required => true
|
12
12
|
field :index_name, :type => String, :required => true
|
@@ -1,7 +1,4 @@
|
|
1
1
|
class NoBrainer::Document::Index::Synchronizer
|
2
|
-
Index = NoBrainer::Document::Index::Index
|
3
|
-
MetaStore = NoBrainer::Document::Index::MetaStore
|
4
|
-
|
5
2
|
def initialize(models)
|
6
3
|
@models_indexes_map = Hash[models.map do |model|
|
7
4
|
[model, model.indexes.values.reject { |index| index.name == model.pk_name }]
|
@@ -9,7 +6,7 @@ class NoBrainer::Document::Index::Synchronizer
|
|
9
6
|
end
|
10
7
|
|
11
8
|
def meta_store
|
12
|
-
@meta_store ||= MetaStore.to_a
|
9
|
+
@meta_store ||= NoBrainer::Document::Index::MetaStore.to_a
|
13
10
|
end
|
14
11
|
|
15
12
|
class Op < Struct.new(:index, :op, :args)
|
@@ -21,7 +18,8 @@ class NoBrainer::Document::Index::Synchronizer
|
|
21
18
|
def _generate_plan_for(model, wanted_indexes)
|
22
19
|
current_indexes = NoBrainer.run(model.rql_table.index_status).map do |s|
|
23
20
|
meta = meta_store.select { |i| i.table_name == model.table_name && i.index_name == s['index'] }.last
|
24
|
-
Index.new(
|
21
|
+
NoBrainer::Document::Index::Index.new(
|
22
|
+
model, s['index'], s['index'], nil, nil, nil, s['geo'], s['multi'], meta)
|
25
23
|
end
|
26
24
|
|
27
25
|
all_aliased_names = (wanted_indexes + current_indexes).map(&:aliased_name).uniq
|
@@ -51,13 +49,11 @@ class NoBrainer::Document::Index::Synchronizer
|
|
51
49
|
lock = NoBrainer::Lock.new('nobrainer:sync_indexes')
|
52
50
|
|
53
51
|
lock.synchronize do
|
54
|
-
|
55
|
-
plan.each { |op| lock.refresh; op.run(options) }
|
52
|
+
generate_plan.each { |op| op.run(options) }
|
56
53
|
end
|
57
54
|
|
58
55
|
unless options[:wait] == false
|
59
|
-
# Waiting on all models due to possible races
|
60
|
-
# sync_indexes()
|
56
|
+
# Waiting on all models due to possible races
|
61
57
|
@models_indexes_map.each_key do |model|
|
62
58
|
NoBrainer.run(model.rql_table.index_wait())
|
63
59
|
end
|
@@ -65,12 +61,4 @@ class NoBrainer::Document::Index::Synchronizer
|
|
65
61
|
|
66
62
|
true
|
67
63
|
end
|
68
|
-
|
69
|
-
class << self
|
70
|
-
def instance
|
71
|
-
new(NoBrainer::Document.all)
|
72
|
-
end
|
73
|
-
|
74
|
-
delegate :sync_indexes, :to => :instance
|
75
|
-
end
|
76
64
|
end
|