Class: Dbsketch::Rendering::Meta::TableRenderer

Inherits:
Object
  • Object
show all
Defined in:
lib/dbsketch/rendering/meta/table_renderer.rb

Instance Method Summary collapse

Constructor Details

#initialize(column_renderer: nil, fk_renderer: nil, options: {}, keywords: {}) ⇒ TableRenderer

Returns a new instance of TableRenderer.

Raises:

  • (ArgumentError)


16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 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

Instance Method Details

#alter(table_diff) ⇒ Object

Raises:

  • (ArgumentError)


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# 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) ⇒ Object

Raises:

  • (ArgumentError)


35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 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) ⇒ Object

Raises:

  • (ArgumentError)


50
51
52
53
54
55
# 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