Class: NoBrainer::Document::Index::Synchronizer

Inherits:
Object
  • Object
show all
Defined in:
lib/no_brainer/document/index/synchronizer.rb

Defined Under Namespace

Classes: Op

Instance Method Summary collapse

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|
    meta = meta_store.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'], meta)
  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_planObject



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_storeObject



8
9
10
# File 'lib/no_brainer/document/index/synchronizer.rb', line 8

def meta_store
  @meta_store ||= 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(options={})
  lock = NoBrainer::Lock.new('nobrainer:sync_indexes')

  lock.synchronize do
    generate_plan.each { |op| op.run(options) }
  end

  unless options[: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