Class: NoBrainer::Document::Index::Synchronizer
- Inherits:
-
Object
- Object
- NoBrainer::Document::Index::Synchronizer
- Defined in:
- lib/no_brainer/document/index/synchronizer.rb
Defined Under Namespace
Classes: Op
Instance Method Summary collapse
- #_generate_plan_for(model, wanted_indexes) ⇒ Object
- #generate_plan ⇒ Object
-
#initialize(models) ⇒ Synchronizer
constructor
A new instance of Synchronizer.
- #meta_store ⇒ Object
- #sync_indexes(options = {}) ⇒ Object
Constructor Details
#initialize(models) ⇒ Synchronizer
Returns a new instance of Synchronizer.
2 3 4 5 6 |
# File 'lib/no_brainer/document/index/synchronizer.rb', line 2 def initialize(models) @models_indexes_map = Hash[models.map do |model| [model, model.indexes.values.reject { |index| index.name == model.pk_name }] end] end |
Instance Method Details
#_generate_plan_for(model, wanted_indexes) ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/no_brainer/document/index/synchronizer.rb', line 18 def _generate_plan_for(model, wanted_indexes) current_indexes = NoBrainer.run(model.rql_table.index_status).map do |s| = .select { |i| i.table_name == model.table_name && i.index_name == s['index'] }.last NoBrainer::Document::Index::Index.new( model, s['index'], s['index'], nil, nil, nil, s['geo'], s['multi'], ) end all_aliased_names = (wanted_indexes + current_indexes).map(&:aliased_name).uniq all_aliased_names.map do |aliased_name| wanted_index = wanted_indexes.select { |i| i.aliased_name == aliased_name }.first current_index = current_indexes.select { |i| i.aliased_name == aliased_name }.first next if wanted_index.try(:external) case [!wanted_index.nil?, !current_index.nil?] when [true, false] then Op.new(wanted_index, :create) when [false, true] then Op.new(current_index, :delete) when [true, true] then case wanted_index.same_definition?(current_index) when true then nil # up to date when false then Op.new(current_index, :update, [wanted_index]) end end end.compact end |
#generate_plan ⇒ Object
44 45 46 |
# File 'lib/no_brainer/document/index/synchronizer.rb', line 44 def generate_plan @models_indexes_map.flat_map { |model, indexes| _generate_plan_for(model, indexes) } end |
#meta_store ⇒ Object
8 9 10 |
# File 'lib/no_brainer/document/index/synchronizer.rb', line 8 def ||= NoBrainer::Document::Index::MetaStore.to_a end |
#sync_indexes(options = {}) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/no_brainer/document/index/synchronizer.rb', line 48 def sync_indexes(={}) lock = NoBrainer::Lock.new('nobrainer:sync_indexes') lock.synchronize do generate_plan.each { |op| op.run() } end unless [:wait] == false # Waiting on all models due to possible races @models_indexes_map.each_key do |model| NoBrainer.run(model.rql_table.index_wait()) end end true end |