nobrainer 0.27.0 → 0.28.0

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/lib/no_brainer/config.rb +36 -8
  3. data/lib/no_brainer/connection.rb +16 -19
  4. data/lib/no_brainer/connection_manager.rb +10 -10
  5. data/lib/no_brainer/criteria.rb +1 -1
  6. data/lib/no_brainer/criteria/eager_load.rb +1 -1
  7. data/lib/no_brainer/criteria/find.rb +1 -1
  8. data/lib/no_brainer/criteria/first.rb +2 -2
  9. data/lib/no_brainer/criteria/first_or_create.rb +32 -19
  10. data/lib/no_brainer/criteria/join.rb +62 -0
  11. data/lib/no_brainer/criteria/where.rb +25 -14
  12. data/lib/no_brainer/document.rb +1 -1
  13. data/lib/no_brainer/document/association/belongs_to.rb +4 -3
  14. data/lib/no_brainer/document/association/eager_loader.rb +26 -25
  15. data/lib/no_brainer/document/association/has_many.rb +3 -2
  16. data/lib/no_brainer/document/association/has_many_through.rb +1 -2
  17. data/lib/no_brainer/document/association/has_one.rb +4 -0
  18. data/lib/no_brainer/document/atomic_ops.rb +31 -4
  19. data/lib/no_brainer/document/attributes.rb +12 -9
  20. data/lib/no_brainer/document/core.rb +18 -18
  21. data/lib/no_brainer/document/criteria.rb +3 -2
  22. data/lib/no_brainer/document/dirty.rb +3 -3
  23. data/lib/no_brainer/document/index.rb +3 -3
  24. data/lib/no_brainer/document/index/index.rb +5 -5
  25. data/lib/no_brainer/document/index/meta_store.rb +1 -1
  26. data/lib/no_brainer/document/index/synchronizer.rb +5 -17
  27. data/lib/no_brainer/document/missing_attributes.rb +7 -2
  28. data/lib/no_brainer/document/primary_key.rb +14 -8
  29. data/lib/no_brainer/document/table_config.rb +118 -0
  30. data/lib/no_brainer/document/table_config/synchronizer.rb +21 -0
  31. data/lib/no_brainer/document/timestamps.rb +4 -0
  32. data/lib/no_brainer/document/validation/core.rb +1 -1
  33. data/lib/no_brainer/document/validation/uniqueness.rb +1 -1
  34. data/lib/no_brainer/lock.rb +4 -4
  35. data/lib/no_brainer/profiler/logger.rb +1 -1
  36. data/lib/no_brainer/query_runner/database_on_demand.rb +1 -1
  37. data/lib/no_brainer/query_runner/reconnect.rb +37 -21
  38. data/lib/no_brainer/query_runner/table_on_demand.rb +12 -5
  39. data/lib/no_brainer/railtie/database.rake +14 -4
  40. data/lib/no_brainer/rql.rb +3 -2
  41. data/lib/no_brainer/symbol_decoration.rb +1 -1
  42. data/lib/no_brainer/system.rb +17 -0
  43. data/lib/no_brainer/system/cluster_config.rb +5 -0
  44. data/lib/no_brainer/system/db_config.rb +5 -0
  45. data/lib/no_brainer/system/document.rb +24 -0
  46. data/lib/no_brainer/system/issue.rb +10 -0
  47. data/lib/no_brainer/system/job.rb +10 -0
  48. data/lib/no_brainer/system/log.rb +11 -0
  49. data/lib/no_brainer/system/server_config.rb +7 -0
  50. data/lib/no_brainer/system/server_status.rb +9 -0
  51. data/lib/no_brainer/system/stat.rb +11 -0
  52. data/lib/no_brainer/system/table_config.rb +10 -0
  53. data/lib/no_brainer/system/table_status.rb +8 -0
  54. data/lib/nobrainer.rb +7 -6
  55. data/lib/rails/generators/templates/nobrainer.rb +11 -2
  56. metadata +17 -3
  57. data/lib/no_brainer/document/store_in.rb +0 -33
@@ -4,7 +4,7 @@ module NoBrainer::Document
4
4
  extend ActiveSupport::Concern
5
5
  extend NoBrainer::Autoload
6
6
 
7
- autoload_and_include :Core, :StoreIn, :InjectionLayer, :Attributes, :Readonly,
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
- extend NoBrainer::Document::Association::EagerLoader::Generic
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
- eager_load_with :owner_key => ->{ foreign_key }, :target_key => ->{ primary_key }
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
- class NoBrainer::Document::Association::EagerLoader
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? and preload.
5
- def eager_load_with(options={})
6
- define_method(:eager_load) do |docs, additional_criteria=nil|
7
- owner_key = instance_exec(&options[:owner_key])
8
- target_key = instance_exec(&options[:target_key])
9
-
10
- criteria = base_criteria
11
- criteria = criteria.merge(additional_criteria) if additional_criteria
12
-
13
- unloaded_docs = docs.reject { |doc| doc.associations[self].loaded? }
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
- docs.map { |doc| doc.associations[self].read }.flatten.compact.uniq
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 then what.each do |k,v|
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
- extend NoBrainer::Document::Association::EagerLoader::Generic
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
- eager_load_with :owner_key => ->{ primary_key }, :target_key => ->{ foreign_key }
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.new
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
 
@@ -3,6 +3,10 @@ class NoBrainer::Document::Association::HasOne < NoBrainer::Document::Associatio
3
3
  def target_model
4
4
  get_model_by_name(options[:class_name] || target_name.to_s.camelize)
5
5
  end
6
+
7
+ def base_criteria
8
+ super.without_ordering
9
+ end
6
10
  end
7
11
 
8
12
  def read
@@ -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
- alias_method :inspect, :to_s
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
- value = super
177
- return value unless in_atomic?
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 PendingAtomic then value.dup
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
- next unless field_options.has_key?(:default) &&
53
- !@_attributes.has_key?(name)
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
- # Using a layer so the user can use super when overriding these methods
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 declared attribute of #{self}"
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 do
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
- list_name = self.name =~ /^NoBrainer::/ ? :_all_nobrainer : :_all
28
- NoBrainer::Document::Core.__send__(list_name) << self
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.has_key?(attr)
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.has_key?(attr)
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.has_key?(attr) ? @_old_attributes[attr] : _read_attribute(attr)
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 "Cannot use a reserved field name: #{name}"
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 "Cannot reuse field name #{name}"
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 "Cannot reuse index attr #{attr}"
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(:table_name => model.table_name, :index_name => aliased_name,
63
- :rql_function => serialized_rql_proc)
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(:table_name => model.table_name, :index_name => aliased_name).delete_all
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
- store_in :table => 'nobrainer_index_meta'
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(model, s['index'], s['index'], nil, nil, nil, s['geo'], s['multi'], meta)
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
- plan = generate_plan
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 when performing concurrent
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