class Dbsketch::Rendering::Meta::TableRenderer

Public Class Methods

new(column_renderer: nil, fk_renderer: nil, options: {}) click to toggle source
# File lib/dbsketch/rendering/meta/table_renderer.rb, line 16
def initialize column_renderer: nil, fk_renderer: nil, options: {}, keywords: {}
        ### Preconditions
        raise ArgumentError, "options is not a Hash" unless options.is_a? Hash
        raise ArgumentError, "keywords is not a Hash" unless keywords.is_a? Hash
        ###
        @options = {
                :pretty   => false,
        }.merge options
        @keywords = {
                :check_constraint => "Dbsketch::Model::CheckConstraint.new",
                :primary_key              => "Dbsketch::Model::PrimaryKey.new",
                :foreign_key              => "Dbsketch::Model::ForeignKey.new",
                :table                            => "Dbsketch::Model::Table.new",
                :unique_constraint        => "Dbsketch::Model::UniqueConstraint.new"
        }.merge keywords
        @column_renderer = (nil == column_renderer ? ColumnRenderer.new(:keywords => @keywords) : column_renderer)
        @fk_renderer = (nil == fk_renderer ? ForeignKeyRenderer.new(:foreign_key_keyword => @keywords[:foreign_key] ) : fk_renderer)
end

Public Instance Methods

alter(table_diff) click to toggle source
# File lib/dbsketch/rendering/meta/table_renderer.rb, line 57
def alter table_diff
        ### Preconditions
        raise ArgumentError, "table_diff is not a Dbsketch::Comparison::TableDiff" unless table_diff.is_a? Dbsketch::Comparison::TableDiff
        ###
        queries = []

        # Columns
        deleted_columns = table_diff.columns.select { |d| d.deletion? }
        if not deleted_columns.empty?
                queries << "Table.alter #{table_diff.new_table.name} drop column\n\t#{deleted_columns.map { |d| d.old_column.name }.join("\n\t")}"
        end
        added_columns = table_diff.columns.select { |d| d.addition? }
        if not added_columns.empty?
                queries << "Table.alter #{table_diff.new_table.name} add column\n\t#{added_columns.map { |d| @column_renderer.create d.new_column }.join("\n\t")}"
        end
        changed_columns = table_diff.columns.select { |d| d.change? }
        if not changed_columns.empty?
                queries << "Table.alter #{table_diff.new_table.name} alter column\n\t#{changed_columns.map { |d| @column_renderer.create d.new_column }.join("\n\t")}"
        end

        # Primary key
        if nil != table_diff.primary_key
                queries << "Table.alter #{table_diff.new_table.name} drop primary key #{table_diff.primary_key.old_key.name}" if table_diff.primary_key.deletion?
                queries << "Table.alter #{table_diff.new_table.name} alter #{create_primary_key table_diff.new_table, table_diff.primary_key.new_key}" if table_diff.primary_key.change?
                queries << "Table.alter #{table_diff.new_table.name} add #{create_primary_key table_diff.new_table, table_diff.primary_key.new_key}" if table_diff.primary_key.addition?
        end

        # Check constraints
        deleted = table_diff.check_constraints.select { |d| d.deletion? }
        if not deleted.empty?
                queries << "Table.alter #{table_diff.new_table.name} drop check constraint\n\t#{deleted.map { |d| d.old_constraint.name }.join("\n\t")}"
        end
        added = table_diff.check_constraints.select { |d| d.addition? }
        if not added.empty?
                queries << "Table.alter #{table_diff.new_table.name} add\n\t#{added.map { |d| create_check_constraint d.new_constraint }.join("\n\t")}"
        end
        changed = table_diff.check_constraints.select { |d| d.change? }
        if not changed.empty?
                queries << "Table.alter #{table_diff.new_table.name} alter\n\t#{changed.map { |d| create_check_constraint d.new_constraint }.join("\n\t")}"
        end
        queries.flatten.join("\n")

        # Foreign keys
        deleted = table_diff.foreign_keys.select { |d| d.deletion? }
        if not deleted.empty?
                queries << "Table.alter #{table_diff.new_table.name} drop foreign key\n\t#{deleted.map { |d| d.old_key.name }.join("\n\t")}"
        end
        added = table_diff.foreign_keys.select { |d| d.addition? }
        if not added.empty?
                queries << "Table.alter #{table_diff.new_table.name} add\n\t#{added.map { |d| @fk_renderer.create d.new_key }.join("\n\t")}"
        end
        changed = table_diff.foreign_keys.select { |d| d.change? }
        if not changed.empty?
                queries << "Table.alter #{table_diff.new_table.name} alter\n\t#{changed.map { |d| @fk_renderer.create d.new_key }.join("\n\t")}"
        end
        queries.flatten.join("\n")

        # Unique constraints
        deleted = table_diff.unique_constraints.select { |d| d.deletion? }
        if not deleted.empty?
                queries << "Table.alter #{table_diff.new_table.name} drop unique constraint\n\t#{deleted.map { |d| d.old_constraint.name }.join("\n\t")}"
        end
        added = table_diff.unique_constraints.select { |d| d.addition? }
        if not added.empty?
                queries << "Table.alter #{table_diff.new_table.name} add\n\t#{added.map { |d| create_unique_constraint d.new_constraint, table_diff.new_table }.join("\n\t")}"
        end
        changed = table_diff.unique_constraints.select { |d| d.change? }
        if not changed.empty?
                queries << "Table.alter #{table_diff.new_table.name} alter\n\t#{changed.map { |d| create_unique_constraint d.new_constraint, table_diff.new_table }.join("\n\t")}"
        end
        queries.flatten.join("\n")
end
create(table) click to toggle source
# File lib/dbsketch/rendering/meta/table_renderer.rb, line 35
def create table
        ### Preconditions
        raise ArgumentError, "table is not a Dbsketch::Model::Table" unless table.is_a? Dbsketch::Model::Table
        ###
        columns = collect_columns table
        str = "#{@keywords[:table]}(\"#{table.name}\""
        str << ", :meaning => \"#{table.meaning}\"" if nil != table.meaning
        str << ", :comment => \"#{table.comment}\"" if nil != table.comment
        str << ", #{columns}" if not columns.empty?
        str << ")"
        constraints = collect_constraints table
        str << "\n#{constraints.join("\n")}" if not constraints.empty?
        str
end
drop(table) click to toggle source
# File lib/dbsketch/rendering/meta/table_renderer.rb, line 50
def drop table
        ### Preconditions
        raise ArgumentError, "table is not a Dbsketch::Model::Table" unless table.is_a? Dbsketch::Model::Table
        ###
        "Table.drop #{table.name}"
end

Private Instance Methods

collect_columns(table) click to toggle source
# File lib/dbsketch/rendering/meta/table_renderer.rb, line 149
def collect_columns table
        columns = table.columns.sort { |a,b| a.order <=> b.order }.map { |c| @column_renderer.create c }
        if columns.count > 1
                if @options[:pretty]
                        ":columns => [\n\t#{columns.join(",\n\t")}\n]"
                else
                        ":columns => [#{columns.join(", ")}]"
                end
        elsif columns.count > 0
                ":columns => #{columns.first}"
        else
                ""
        end
end
collect_constraints(table) click to toggle source
# File lib/dbsketch/rendering/meta/table_renderer.rb, line 164
def collect_constraints table
        items = []
        if nil != table.primary_key then items << "#{table.name.downcase}.add(#{create_primary_key(table)})" end
        items << table.check_constraints.map { |c| "#{table.name.downcase}.add(#{create_check_constraint c})" }
        items << table.unique_constraints.map { |c| "#{table.name.downcase}.add(#{create_unique_constraint c, table})" }
        items << table.foreign_keys.map { |k| "#{table.name.downcase}.add(#{@fk_renderer.create k})" }
        items.flatten.compact
end
create_check_constraint(constraint) click to toggle source
# File lib/dbsketch/rendering/meta/table_renderer.rb, line 139
def create_check_constraint constraint
        "#{@keywords[:check_constraint]}(\"#{constraint.name}\", \"#{constraint.condition}\")"
end
create_primary_key(table, primary_key = nil) click to toggle source
# File lib/dbsketch/rendering/meta/table_renderer.rb, line 132
def create_primary_key table, primary_key = nil
        primary_key = table.primary_key if nil == primary_key
        columns = primary_key.columns.map {|c| "#{table.name.downcase}['#{c.name}']" }
        columns = columns.count > 1 ? "[#{columns.join(", ")}]" : columns.first
        "#{@keywords[:primary_key]}(\"#{primary_key.name}\", #{columns})"
end
create_unique_constraint(constraint, table) click to toggle source
# File lib/dbsketch/rendering/meta/table_renderer.rb, line 143
def create_unique_constraint constraint, table
        columns = constraint.columns.map {|c| "#{table.name.downcase}['#{c.name}']" }
        columns = columns.count > 1 ? "[#{columns.join(", ")}]" : columns.first
        "#{@keywords[:unique_constraint]}(\"#{constraint.name}\", #{columns})"
end