class Arison::Core

Public Class Methods

new(profile) click to toggle source
# File lib/arison/core.rb, line 10
def initialize(profile)
  @profile = profile
  ActiveRecord::Base.establish_connection(@profile)
  ActiveRecord::Base.default_timezone = :local
  @connection = ActiveRecord::Base.connection
  @logger = Logger.new(STDOUT)
end

Public Instance Methods

add_column_live(table_name, data) click to toggle source
# File lib/arison/core.rb, line 136
def add_column_live(table_name, data)
  data.each do |record|
    limits = get_limit_hash(get_class(table_name))
    diff_keys = (record.keys - limits.keys)

    diff_keys.each do |column|
      add_column_dsl = get_add_column_dsl(table_name, column, record)
      Arison::Migration.run_dsl(add_column_dsl)
    end
    ActiveRecord::Base.establish_connection(@profile)
  end
end
columns(klass) click to toggle source
# File lib/arison/core.rb, line 26
def columns(klass)
  klass.columns.map do |column|
    JSON.parse(column.to_json)
  end
end
columns_with_table_name(table_name) click to toggle source
# File lib/arison/core.rb, line 22
def columns_with_table_name(table_name)
  columns(get_class(table_name))
end
create_table(table_name, data) click to toggle source
# File lib/arison/core.rb, line 96
def create_table(table_name, data)
  first = data.class == Array ? data.first : data
  if ActiveRecord::Base.connection.data_source_exists?(table_name.to_sym)
    add_column_live(table_name, data)
    return 
  end
  create_table_dsl = get_create_table_dsl(table_name, first)
  Arison::Migration.run_dsl(create_table_dsl)
  add_column_live(table_name, data)
end
define_class(table_name) click to toggle source
# File lib/arison/core.rb, line 112
def define_class(table_name)
  klass_sym = table_name.camelcase.to_sym
  if Object.constants.include?(klass_sym)
    Object.send(:remove_const, klass_sym)
  end
  Object.const_set(table_name.camelcase, Class.new(ActiveRecord::Base) do
    self.table_name = table_name
  end)
end
get_add_column_dsl(table_name, column_name, record) click to toggle source
# File lib/arison/core.rb, line 90
def get_add_column_dsl(table_name, column_name, record)
  dsl = %Q{
  add_column "#{table_name}", "#{column_name}", :#{Util.get_type(column_name, record['column_name'])}
  }
end
get_add_index_dsl(table_name, uniq_columns) click to toggle source
# File lib/arison/core.rb, line 84
def get_add_index_dsl(table_name, uniq_columns)
  dsl = %Q{
  add_index(:#{table_name}, #{uniq_columns.map(&:to_sym)}, unique: true)
  }
end
get_class(table_name) click to toggle source
# File lib/arison/core.rb, line 107
def get_class(table_name)
  define_class(table_name)
  table_name.camelcase.constantize
end
get_column_schema(hash) click to toggle source
# File lib/arison/core.rb, line 122
def get_column_schema(hash)
  hash.map do |k, v|
    type = Util.get_type(k, v)
    %Q{t.#{type} "#{k}"} unless type.nil?
  end
end
get_create_table_dsl(table_name, hash) click to toggle source
# File lib/arison/core.rb, line 74
def get_create_table_dsl(table_name, hash)
  dsl = %Q{
  create_table "#{table_name}" do |t|
    #{get_column_schema(hash).join("\n")}
    t.datetime "created_at"
    t.datetime "updated_at"
  end
  }
end
get_limit_hash(klass) click to toggle source
# File lib/arison/core.rb, line 129
def get_limit_hash(klass)
  columns(klass).inject({}){ |result, column| 
    result[column['name']] = column['limit']
    result
  }
end
import(table_name, data) click to toggle source
# File lib/arison/core.rb, line 36
def import(table_name, data)
  create_table(table_name, data)
  klass = get_class(table_name)
  limits = get_limit_hash(klass)
  instances = []
  data.each do |record|
    instance = klass.new
    begin
      record = record.inject({}){ |result, (k, v)|
        length = limits[k]
        result[k] = if (v.class == Array || v.class == Hash)
          v.to_s
        elsif (length.nil? || v.nil? || v.class != String)
          v
        else
          v.slice(0, length)
        end
        result
      }
      instance.attributes = record
    rescue ActiveRecord::UnknownAttributeError => e
    rescue => e
      puts "\n#{e.message}\n#{e.backtrace.join("\n")}"
    ensure
      instances << instance
    end
  end
  instances.in_groups_of(10000, false) do |block|
    begin
      klass.import(block)
    rescue => e
      pp block
      @logger.error "\n#{e.message}\n#{e.backtrace.join("\n")}"
      raise
    end
  end
end
query(sql) click to toggle source
# File lib/arison/core.rb, line 18
def query(sql)
  @connection.exec_query(sql).to_a
end
tables() click to toggle source
# File lib/arison/core.rb, line 32
def tables
  @connection.tables
end