Class: Dslimple::QueryBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/dslimple/query_builder.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(current_zones, expected_zones, options = {}) ⇒ QueryBuilder

Returns a new instance of QueryBuilder.



9
10
11
12
13
# File 'lib/dslimple/query_builder.rb', line 9

def initialize(current_zones, expected_zones, options = {})
  @current_zones = Hash[*current_zones.map { |zone| [zone.name, zone] }.flatten]
  @expected_zones = Hash[*expected_zones.map { |zone| [zone.name, zone] }.flatten]
  @options = options
end

Instance Attribute Details

#append_recordsObject (readonly)

Returns the value of attribute append_records.



7
8
9
# File 'lib/dslimple/query_builder.rb', line 7

def append_records
  @append_records
end

#change_recordsObject (readonly)

Returns the value of attribute change_records.



7
8
9
# File 'lib/dslimple/query_builder.rb', line 7

def change_records
  @change_records
end

#current_zonesObject (readonly)

Returns the value of attribute current_zones.



6
7
8
# File 'lib/dslimple/query_builder.rb', line 6

def current_zones
  @current_zones
end

#delete_recordsObject (readonly)

Returns the value of attribute delete_records.



7
8
9
# File 'lib/dslimple/query_builder.rb', line 7

def delete_records
  @delete_records
end

#expected_zonesObject (readonly)

Returns the value of attribute expected_zones.



6
7
8
# File 'lib/dslimple/query_builder.rb', line 6

def expected_zones
  @expected_zones
end

#optionsObject (readonly)

Returns the value of attribute options.



5
6
7
# File 'lib/dslimple/query_builder.rb', line 5

def options
  @options
end

#queriesObject (readonly)

Returns the value of attribute queries.



5
6
7
# File 'lib/dslimple/query_builder.rb', line 5

def queries
  @queries
end

Instance Method Details

#append_zonesObject



15
16
17
# File 'lib/dslimple/query_builder.rb', line 15

def append_zones
  @append_zones ||= expected_zones.values.reject { |zone| current_zones.key?(zone.name) }
end

#build_queriesObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/dslimple/query_builder.rb', line 55

def build_queries
  @queries = []

  append_zones.each do |zone|
    @queries << Dslimple::Query.new(:addition, :zone, zone)
  end

  append_records.each do |record|
    @queries << Dslimple::Query.new(:addition, :record, record.zone, record.to_params)
  end

  change_records.each do |old, new|
    @queries << Dslimple::Query.new(:modification, :record, new.zone, new.to_params.merge(id: old.id))
  end

  delete_records.each do |record|
    @queries << Dslimple::Query.new(:deletion, :record, record.zone, record.to_params)
  end

  delete_zones.each do |zone|
    @queries << Dslimple::Query.new(:deletion, :zone, zone)
  end

  @queries
end

#delete_zonesObject



19
20
21
# File 'lib/dslimple/query_builder.rb', line 19

def delete_zones
  @delete_zones ||= current_zones.values.reject { |zone| expected_zones.key?(zone.name) }
end

#executeObject



23
24
25
26
27
28
29
30
31
32
33
# File 'lib/dslimple/query_builder.rb', line 23

def execute
  @append_records = append_zones.map { |z| z.clean_records(options[:ignore]) }.flatten
  @change_records = []
  @delete_records = delete_zones.map { |z| z.clean_records(options[:ignore]) }.flatten

  expected_zones.each_pair do |name, zone|
    execute_records(name, zone)
  end

  build_queries
end

#execute_records(zone_name, zone) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/dslimple/query_builder.rb', line 35

def execute_records(zone_name, zone)
  current_zone = current_zones[zone_name]
  return unless current_zone

  current_records = current_zone.clean_records(options[:ignore]).dup
  zone.clean_records(options[:ignore]).each do |record|
    at = current_records.index { |current| current == record }
    current_record = at ? current_records.slice!(at) : nil
    like_record = current_records.find { |current| current === record }

    if !like_record && !current_record
      @append_records << record
    elsif like_record
      @change_records << [like_record, record]
      current_records.delete(like_record)
    end
  end
  @delete_records.concat(current_records)
end

#filtered_queries(options) ⇒ Object



81
82
83
84
85
86
87
# File 'lib/dslimple/query_builder.rb', line 81

def filtered_queries(options)
  queries.select do |query|
    (query.addition? && options[:addition]) ||
      (query.modification? && options[:modification]) ||
      (query.deletion? && options[:deletion])
  end
end