class Dslimple::QueryBuilder

Attributes

append_records[R]
change_records[R]
current_zones[R]
delete_records[R]
expected_zones[R]
options[R]
queries[R]

Public Class Methods

new(current_zones, expected_zones, options = {}) click to toggle source
# 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

Public Instance Methods

append_zones() click to toggle source
# 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_queries() click to toggle source
# 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_zones() click to toggle source
# File lib/dslimple/query_builder.rb, line 19
def delete_zones
  @delete_zones ||= current_zones.values.reject { |zone| expected_zones.key?(zone.name) }
end
execute() click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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