class Dbsketch::Rendering::SQL::TableRenderer

Public Class Methods

new(column_renderer: nil, fk_renderer: nil, options: {}) click to toggle source
# File lib/dbsketch/rendering/sql/table_renderer.rb, line 16
def initialize column_renderer: nil, fk_renderer: nil, options: {}
        ### Preconditions
        raise ArgumentError, "options is not a Hash" unless options.is_a? Hash
        ###
        @options = {
                :pretty   => false
        }.merge options
        @column_renderer = (nil == column_renderer ? ColumnRenderer.new(:options => options) : column_renderer)
        @fk_renderer = (nil == fk_renderer ? ForeignKeyRenderer.new : fk_renderer)
end

Public Instance Methods

alter(table_diff) click to toggle source
# File lib/dbsketch/rendering/sql/table_renderer.rb, line 45
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 << "alter table #{table_diff.new_table.name} drop column #{deleted_columns.map { |d| d.old_column.name }.join(", ")}"
        end
        added_columns = table_diff.columns.select { |d| d.addition? }
        if not added_columns.empty?
                queries << "alter table #{table_diff.new_table.name} add #{added_columns.map { |d| @column_renderer.create d.new_column }.join(", ")}"
        end
        queries << table_diff.columns.select { |d| d.change? }.map { |d| "alter table #{table_diff.new_table.name} alter column #{@column_renderer.create d.new_column}" }

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

        # Check constraints
        deleted_and_changed = table_diff.check_constraints.select { |chk_diff| chk_diff.deletion? or chk_diff.change? }
        if not deleted_and_changed.empty?
                queries << "alter table #{table_diff.new_table.name} drop constraint #{deleted_and_changed.map { |d| d.old_constraint.name }.join(", ")}"
        end
        added_and_changed = table_diff.check_constraints.select { |chk_diff| chk_diff.addition? or chk_diff.change? }
        if not added_and_changed.empty?
                queries << "alter table #{table_diff.new_table.name} add #{added_and_changed.map { |d| create_check_constraint d.new_constraint }.join(", ")}"
        end
        queries.flatten.join("\n")

        # Foreign keys
        deleted_and_changed = table_diff.foreign_keys.select { |d| d.deletion? or d.change? }
        if not deleted_and_changed.empty?
                queries << "alter table #{table_diff.new_table.name} drop constraint #{deleted_and_changed.map { |d| d.old_key.name }.join(", ")}"
        end
        added_and_changed = table_diff.foreign_keys.select { |d| d.addition? or d.change? }
        if not added_and_changed.empty?
                queries << "alter table #{table_diff.new_table.name} add #{added_and_changed.map { |d| @fk_renderer.create d.new_key }.join(", ")}"
        end
        queries.flatten.join("\n")

        # Unique constraints
        deleted_and_changed = table_diff.unique_constraints.select { |d| d.deletion? or d.change? }
        if not deleted_and_changed.empty?
                queries << "alter table #{table_diff.new_table.name} drop constraint #{deleted_and_changed.map { |d| d.old_constraint.name }.join(", ")}"
        end
        added_and_changed = table_diff.unique_constraints.select { |d| d.addition? or d.change? }
        if not added_and_changed.empty?
                queries << "alter table #{table_diff.new_table.name} add #{added_and_changed.map { |d| create_unique_constraint d.new_constraint }.join(", ")}"
        end
        queries.flatten.join("\n")
end
create(table) click to toggle source
# File lib/dbsketch/rendering/sql/table_renderer.rb, line 27
def create table
        ### Preconditions
        raise ArgumentError, "table is not a Dbsketch::Model::Table" unless table.is_a? Dbsketch::Model::Table
        ###
        if @options[:pretty]
                create_pretty table
        else
                create_brief table
        end
end
drop(table) click to toggle source
# File lib/dbsketch/rendering/sql/table_renderer.rb, line 38
def drop table
        ### Preconditions
        raise ArgumentError, "table is not a Dbsketch::Model::Table" unless table.is_a? Dbsketch::Model::Table
        ###
        "if object_id('#{table.name}', 'U') is not null drop table #{table.name}"
end

Private Instance Methods

collect_items(table) click to toggle source
# File lib/dbsketch/rendering/sql/table_renderer.rb, line 116
def collect_items table
        items = table.columns.sort { |a,b| a.order <=> b.order }.map { |c| @column_renderer.create c }
        if nil != table.primary_key then items << create_primary_key(table.primary_key) end
        items << table.check_constraints.map { |c| create_check_constraint c }
        items << table.unique_constraints.map { |c| create_unique_constraint c }
        items << table.foreign_keys.map { |k| @fk_renderer.create k }
        items.flatten
end
create_brief(table) click to toggle source
# File lib/dbsketch/rendering/sql/table_renderer.rb, line 125
def create_brief table
        items = collect_items table
        "create table #{table.name} (#{items.join(', ')})"
end
create_check_constraint(constraint) click to toggle source
# File lib/dbsketch/rendering/sql/table_renderer.rb, line 108
def create_check_constraint constraint
        "constraint #{constraint.name} check (#{constraint.condition})"
end
create_pretty(table) click to toggle source
# File lib/dbsketch/rendering/sql/table_renderer.rb, line 130
def create_pretty table
        items = collect_items table
        sql = ""
        if nil != table.meaning or nil != table.comment
                sql << "-- "
                sql << table.meaning if nil != table.meaning
                sql << "\n-- " if nil != table.meaning and nil != table.comment
                sql << table.comment if nil != table.comment
                sql << "\n"
        end
        sql << "create table #{table.name} (\n\t#{items.join(",\n\t")}\n)"
        sql
end
create_primary_key(primary_key) click to toggle source
# File lib/dbsketch/rendering/sql/table_renderer.rb, line 104
def create_primary_key primary_key
        "constraint #{primary_key.name} primary key (#{primary_key.columns.map {|c| c.name }.join(", ")})"
end
create_unique_constraint(constraint) click to toggle source
# File lib/dbsketch/rendering/sql/table_renderer.rb, line 112
def create_unique_constraint constraint
        "constraint #{constraint.name} unique (#{constraint.columns.map {|c| c.name }.join(", ")})"
end