class HecksAdapters::SQLDatabase::SchemaFactory

Build a Schema Factory

Public Class Methods

new(domain_spec) click to toggle source
# File lib/schema_factory.rb, line 5
def initialize(domain_spec)
  @domain_spec = domain_spec
  @tables = Table.factory(domain_objects)
  @join_tables = []
end

Public Instance Methods

build() click to toggle source
# File lib/schema_factory.rb, line 11
def build
  @tables.each do |table|
    swap_domain_references(table)
    build_join_tables(table)
    remove_domain_columns(table)
  end

  Schema.new(@tables + @join_tables)
end

Private Instance Methods

add_db_reference(column, table) click to toggle source
# File lib/schema_factory.rb, line 47
def add_db_reference(column, table)
  table.columns << foreign_key_column(column.referenced_object)
end
build_join_tables(table) click to toggle source
# File lib/schema_factory.rb, line 33
def build_join_tables(table)
  table.join_table_columns.each do |column|
    @join_tables << JoinTable.new(table, column)
  end
end
domain_objects() click to toggle source
# File lib/schema_factory.rb, line 23
def domain_objects
  @domain_spec.domain_modules.values.flat_map(&:objects)
end
foreign_key_column(column_name, is_list = false) click to toggle source
# File lib/schema_factory.rb, line 51
def foreign_key_column(column_name, is_list = false)
  Column.new(name: column_name + '_id', type: 'String', is_list: is_list)
end
remove_domain_columns(table) click to toggle source
# File lib/schema_factory.rb, line 39
def remove_domain_columns(table)
  (table.foreign_key_columns + table.join_table_columns).each do |column|
    table.columns = table.columns.select do |table_column|
      table_column != column
    end
  end
end
swap_domain_references(table) click to toggle source
# File lib/schema_factory.rb, line 27
def swap_domain_references(table)
  table.foreign_key_columns.each do |column|
    add_db_reference(column, table)
  end
end