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