class Polo::Translator

Public Class Methods

new(selects, configuration=Configuration.new) click to toggle source

Public: Creates a new Polo::Collector

selects - An array of SELECT queries

# File lib/polo/translator.rb, line 11
def initialize(selects, configuration=Configuration.new)
  @selects = selects
  @configuration = configuration
end

Public Instance Methods

instances() click to toggle source
# File lib/polo/translator.rb, line 22
def instances
  active_record_instances = @selects.flat_map do |select|
    select[:klass].find_by_sql(select[:sql]).to_a
  end

  if fields = @configuration.blacklist
    obfuscate!(active_record_instances, fields)
  end

  active_record_instances
end
translate() click to toggle source

Public: Translates SELECT queries into INSERTS.

# File lib/polo/translator.rb, line 18
def translate
  SqlTranslator.new(instances, @configuration).to_sql.uniq
end

Private Instance Methods

field_name(field) click to toggle source
# File lib/polo/translator.rb, line 56
def field_name(field)
  field.to_s.include?('.') ? field.split('.').last : field.to_s
end
intersection(attrs, fields) click to toggle source
# File lib/polo/translator.rb, line 64
def intersection(attrs, fields)
  attrs & fields.map { |pair| field_name(pair.first) }
end
new_field_value(field, strategy, instance) click to toggle source
# File lib/polo/translator.rb, line 68
def new_field_value(field, strategy, instance)
  value = instance.attributes[field]
  if strategy.nil?
    value.split("").shuffle.join
  else
    strategy.arity == 1 ? strategy.call(value) : strategy.call(value, instance)
  end
end
obfuscate!(instances, fields) click to toggle source
# File lib/polo/translator.rb, line 36
def obfuscate!(instances, fields)
  instances.each do |instance|
    next if intersection(instance.attributes.keys, fields).empty?

    fields.each do |field, strategy|
      field = field.to_s

      if table = table_name(field)
        field = field_name(field)
      end

      correct_table = table.nil? || instance.class.table_name == table

      if correct_table && instance.attributes[field]
        instance.send("#{field}=", new_field_value(field, strategy, instance))
      end
    end
  end
end
table_name(field) click to toggle source
# File lib/polo/translator.rb, line 60
def table_name(field)
  field.to_s.include?('.') ? field.split('.').first : nil
end