masamune 0.12.3 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/masamune-dump +4 -0
- data/lib/masamune/schema/column.rb +2 -20
- data/lib/masamune/schema/dimension.rb +12 -11
- data/lib/masamune/schema/fact.rb +10 -1
- data/lib/masamune/schema/map.rb +3 -3
- data/lib/masamune/schema/row.rb +1 -1
- data/lib/masamune/schema/table.rb +55 -23
- data/lib/masamune/schema/table_reference.rb +5 -0
- data/lib/masamune/tasks/dump_thor.rb +58 -0
- data/lib/masamune/tasks/shell_thor.rb +0 -19
- data/lib/masamune/template.rb +1 -2
- data/lib/masamune/transform/define_foreign_key.psql.erb +39 -0
- data/lib/masamune/transform/define_index.psql.erb +7 -3
- data/lib/masamune/transform/define_schema.rb +3 -3
- data/lib/masamune/transform/define_table.psql.erb +24 -3
- data/lib/masamune/transform/define_table.rb +16 -2
- data/lib/masamune/transform/define_unique.psql.erb +1 -1
- data/lib/masamune/transform/denormalize_table.rb +5 -1
- data/lib/masamune/transform/replace_table.psql.erb +9 -13
- data/lib/masamune/transform/stage_fact.rb +16 -10
- data/lib/masamune/version.rb +1 -1
- data/spec/masamune/schema/map_spec.rb +1 -1
- data/spec/masamune/tasks/dump_thor_spec.rb +42 -0
- data/spec/masamune/tasks/shell_thor_spec.rb +0 -11
- data/spec/masamune/template_spec.rb +5 -0
- data/spec/masamune/transform/define_table.dimension_spec.rb +81 -52
- data/spec/masamune/transform/define_table.fact_spec.rb +27 -63
- data/spec/masamune/transform/define_table.table_spec.rb +397 -32
- data/spec/masamune/transform/denormalize_table_spec.rb +20 -0
- data/spec/masamune/transform/rollup_fact_spec.rb +54 -54
- data/spec/masamune/transform/stage_fact_spec.rb +57 -34
- metadata +9 -3
@@ -33,10 +33,12 @@ describe Masamune::Transform::DefineTable do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
dimension 'date', type: :date do
|
36
|
-
column 'date_id', type: :integer,
|
36
|
+
column 'date_id', type: :integer, natural_key: true
|
37
37
|
end
|
38
38
|
|
39
39
|
dimension 'user_agent', type: :mini do
|
40
|
+
references :cluster
|
41
|
+
|
40
42
|
column 'name', type: :string, unique: true, index: 'shared'
|
41
43
|
column 'version', type: :string, unique: true, index: 'shared', default: 'Unknown'
|
42
44
|
column 'description', type: :string, null: true, ignore: true
|
@@ -47,15 +49,21 @@ describe Masamune::Transform::DefineTable do
|
|
47
49
|
end
|
48
50
|
|
49
51
|
dimension 'tenant', type: :two do
|
50
|
-
|
52
|
+
references :cluster
|
53
|
+
|
54
|
+
column 'tenant_id', type: :integer, natural_key: true
|
51
55
|
end
|
52
56
|
|
53
57
|
dimension 'user', type: :two do
|
54
|
-
|
55
|
-
|
58
|
+
references :cluster
|
59
|
+
|
60
|
+
column 'tenant_id', type: :integer, natural_key: true
|
61
|
+
column 'user_id', type: :integer, natural_key: true
|
56
62
|
end
|
57
63
|
|
58
64
|
dimension 'group', type: :two do
|
65
|
+
references :cluster
|
66
|
+
|
59
67
|
column 'group_id', type: :integer, natural_key: true
|
60
68
|
end
|
61
69
|
|
@@ -125,57 +133,17 @@ describe Masamune::Transform::DefineTable do
|
|
125
133
|
is_expected.to eq <<-EOS.strip_heredoc
|
126
134
|
CREATE TABLE IF NOT EXISTS visits_fact
|
127
135
|
(
|
128
|
-
cluster_type_id INTEGER NOT NULL
|
129
|
-
date_dimension_id INTEGER NOT NULL
|
130
|
-
tenant_dimension_id INTEGER NOT NULL
|
131
|
-
user_dimension_id INTEGER NOT NULL
|
136
|
+
cluster_type_id INTEGER NOT NULL DEFAULT default_cluster_type_id(),
|
137
|
+
date_dimension_id INTEGER NOT NULL,
|
138
|
+
tenant_dimension_id INTEGER NOT NULL,
|
139
|
+
user_dimension_id INTEGER NOT NULL,
|
132
140
|
group_dimension_id INTEGER[] NOT NULL,
|
133
|
-
user_agent_type_id INTEGER NOT NULL
|
134
|
-
feature_type_id INTEGER NOT NULL
|
141
|
+
user_agent_type_id INTEGER NOT NULL,
|
142
|
+
feature_type_id INTEGER NOT NULL,
|
135
143
|
total INTEGER NOT NULL,
|
136
144
|
time_key INTEGER NOT NULL,
|
137
145
|
last_modified_at TIMESTAMP NOT NULL DEFAULT NOW()
|
138
146
|
);
|
139
|
-
|
140
|
-
DO $$ BEGIN
|
141
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'visits_fact_d6b9b38_index') THEN
|
142
|
-
CREATE INDEX visits_fact_d6b9b38_index ON visits_fact (cluster_type_id);
|
143
|
-
END IF; END $$;
|
144
|
-
|
145
|
-
DO $$ BEGIN
|
146
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'visits_fact_0a531a8_index') THEN
|
147
|
-
CREATE INDEX visits_fact_0a531a8_index ON visits_fact (date_dimension_id);
|
148
|
-
END IF; END $$;
|
149
|
-
|
150
|
-
DO $$ BEGIN
|
151
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'visits_fact_d3950d9_index') THEN
|
152
|
-
CREATE INDEX visits_fact_d3950d9_index ON visits_fact (tenant_dimension_id);
|
153
|
-
END IF; END $$;
|
154
|
-
|
155
|
-
DO $$ BEGIN
|
156
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'visits_fact_39f0fdd_index') THEN
|
157
|
-
CREATE INDEX visits_fact_39f0fdd_index ON visits_fact (user_dimension_id);
|
158
|
-
END IF; END $$;
|
159
|
-
|
160
|
-
DO $$ BEGIN
|
161
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'visits_fact_e0d2a9e_index') THEN
|
162
|
-
CREATE INDEX visits_fact_e0d2a9e_index ON visits_fact (group_dimension_id);
|
163
|
-
END IF; END $$;
|
164
|
-
|
165
|
-
DO $$ BEGIN
|
166
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'visits_fact_d8b1c3e_index') THEN
|
167
|
-
CREATE INDEX visits_fact_d8b1c3e_index ON visits_fact (user_agent_type_id);
|
168
|
-
END IF; END $$;
|
169
|
-
|
170
|
-
DO $$ BEGIN
|
171
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'visits_fact_33b68fd_index') THEN
|
172
|
-
CREATE INDEX visits_fact_33b68fd_index ON visits_fact (feature_type_id);
|
173
|
-
END IF; END $$;
|
174
|
-
|
175
|
-
DO $$ BEGIN
|
176
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'visits_fact_6444ed3_index') THEN
|
177
|
-
CREATE INDEX visits_fact_6444ed3_index ON visits_fact (time_key);
|
178
|
-
END IF; END $$;
|
179
147
|
EOS
|
180
148
|
end
|
181
149
|
end
|
@@ -206,12 +174,18 @@ describe Masamune::Transform::DefineTable do
|
|
206
174
|
COPY visits_file_fact_stage FROM 'output_3.csv' WITH (FORMAT 'csv', HEADER true);
|
207
175
|
|
208
176
|
CREATE INDEX visits_file_fact_stage_964dac1_index ON visits_file_fact_stage (date_dimension_date_id);
|
177
|
+
CREATE INDEX visits_file_fact_stage_5a187ed_index ON visits_file_fact_stage (feature_type_name);
|
209
178
|
CREATE INDEX visits_file_fact_stage_90fc13c_index ON visits_file_fact_stage (tenant_dimension_tenant_id);
|
210
|
-
CREATE INDEX
|
179
|
+
CREATE INDEX visits_file_fact_stage_6444ed3_index ON visits_file_fact_stage (time_key);
|
211
180
|
CREATE INDEX visits_file_fact_stage_99c433b_index ON visits_file_fact_stage (user_agent_type_name);
|
212
181
|
CREATE INDEX visits_file_fact_stage_d5d236f_index ON visits_file_fact_stage (user_agent_type_version);
|
213
|
-
CREATE INDEX
|
214
|
-
CREATE INDEX
|
182
|
+
CREATE INDEX visits_file_fact_stage_30f3cca_index ON visits_file_fact_stage (user_dimension_user_id);
|
183
|
+
CREATE INDEX visits_file_fact_stage_8608ecc_index ON visits_file_fact_stage (date_dimension_date_id, time_key);
|
184
|
+
CREATE INDEX visits_file_fact_stage_28291db_index ON visits_file_fact_stage (feature_type_name, time_key);
|
185
|
+
CREATE INDEX visits_file_fact_stage_69e4501_index ON visits_file_fact_stage (tenant_dimension_tenant_id, time_key);
|
186
|
+
CREATE INDEX visits_file_fact_stage_766cbfa_index ON visits_file_fact_stage (user_agent_type_name, time_key);
|
187
|
+
CREATE INDEX visits_file_fact_stage_0fe2101_index ON visits_file_fact_stage (user_agent_type_version, time_key);
|
188
|
+
CREATE INDEX visits_file_fact_stage_b0abfed_index ON visits_file_fact_stage (user_dimension_user_id, time_key);
|
215
189
|
|
216
190
|
ANALYZE visits_file_fact_stage;
|
217
191
|
EOS
|
@@ -256,16 +230,6 @@ describe Masamune::Transform::DefineTable do
|
|
256
230
|
time_key INTEGER NOT NULL,
|
257
231
|
last_modified_at TIMESTAMP NOT NULL DEFAULT NOW()
|
258
232
|
);
|
259
|
-
|
260
|
-
DO $$ BEGIN
|
261
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'visits_fact_2a6313d_index') THEN
|
262
|
-
CREATE INDEX visits_fact_2a6313d_index ON visits_fact (message_kind_type_id);
|
263
|
-
END IF; END $$;
|
264
|
-
|
265
|
-
DO $$ BEGIN
|
266
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'visits_fact_6444ed3_index') THEN
|
267
|
-
CREATE INDEX visits_fact_6444ed3_index ON visits_fact (time_key);
|
268
|
-
END IF; END $$;
|
269
233
|
EOS
|
270
234
|
end
|
271
235
|
end
|
@@ -23,7 +23,10 @@
|
|
23
23
|
require 'spec_helper'
|
24
24
|
|
25
25
|
describe Masamune::Transform::DefineTable do
|
26
|
-
|
26
|
+
let(:files) { [] }
|
27
|
+
let(:options) { {} }
|
28
|
+
|
29
|
+
subject { transform.define_table(target, files, options).to_s }
|
27
30
|
|
28
31
|
context 'for postgres table with columns' do
|
29
32
|
before do
|
@@ -41,10 +44,15 @@ describe Masamune::Transform::DefineTable do
|
|
41
44
|
is_expected.to eq <<-EOS.strip_heredoc
|
42
45
|
CREATE TABLE IF NOT EXISTS user_table
|
43
46
|
(
|
44
|
-
id SERIAL
|
47
|
+
id SERIAL,
|
45
48
|
tenant_id INTEGER NOT NULL,
|
46
49
|
user_id INTEGER NOT NULL
|
47
50
|
);
|
51
|
+
|
52
|
+
DO $$ BEGIN
|
53
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
54
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
55
|
+
END IF; END $$;
|
48
56
|
EOS
|
49
57
|
end
|
50
58
|
end
|
@@ -65,11 +73,16 @@ describe Masamune::Transform::DefineTable do
|
|
65
73
|
is_expected.to eq <<-EOS.strip_heredoc
|
66
74
|
CREATE TABLE IF NOT EXISTS user_table
|
67
75
|
(
|
68
|
-
id SERIAL
|
76
|
+
id SERIAL,
|
69
77
|
tenant_id INTEGER NOT NULL,
|
70
78
|
user_id INTEGER NOT NULL
|
71
79
|
);
|
72
80
|
|
81
|
+
DO $$ BEGIN
|
82
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
83
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
84
|
+
END IF; END $$;
|
85
|
+
|
73
86
|
DO $$ BEGIN
|
74
87
|
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_3854361_index') THEN
|
75
88
|
CREATE INDEX user_table_3854361_index ON user_table (tenant_id);
|
@@ -99,11 +112,16 @@ describe Masamune::Transform::DefineTable do
|
|
99
112
|
is_expected.to eq <<-EOS.strip_heredoc
|
100
113
|
CREATE TABLE IF NOT EXISTS user_table
|
101
114
|
(
|
102
|
-
id SERIAL
|
115
|
+
id SERIAL,
|
103
116
|
tenant_id INTEGER NOT NULL,
|
104
117
|
user_id INTEGER NOT NULL
|
105
118
|
);
|
106
119
|
|
120
|
+
DO $$ BEGIN
|
121
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
122
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
123
|
+
END IF; END $$;
|
124
|
+
|
107
125
|
DO $$ BEGIN
|
108
126
|
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_3854361_index') THEN
|
109
127
|
CREATE INDEX user_table_3854361_index ON user_table (tenant_id);
|
@@ -138,11 +156,16 @@ describe Masamune::Transform::DefineTable do
|
|
138
156
|
is_expected.to eq <<-EOS.strip_heredoc
|
139
157
|
CREATE TABLE IF NOT EXISTS user_table
|
140
158
|
(
|
141
|
-
id SERIAL
|
159
|
+
id SERIAL,
|
142
160
|
tenant_id INTEGER NOT NULL,
|
143
161
|
user_id INTEGER NOT NULL
|
144
162
|
);
|
145
163
|
|
164
|
+
DO $$ BEGIN
|
165
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
166
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
167
|
+
END IF; END $$;
|
168
|
+
|
146
169
|
DO $$ BEGIN
|
147
170
|
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_e8701ad_key') THEN
|
148
171
|
ALTER TABLE user_table ADD CONSTRAINT user_table_e8701ad_key UNIQUE(user_id);
|
@@ -156,6 +179,201 @@ describe Masamune::Transform::DefineTable do
|
|
156
179
|
end
|
157
180
|
end
|
158
181
|
|
182
|
+
context 'for postgres table with auto reference' do
|
183
|
+
before do
|
184
|
+
catalog.schema :postgres do
|
185
|
+
table 'cluster' do
|
186
|
+
column 'id', surrogate_key: true, auto: true
|
187
|
+
end
|
188
|
+
table 'user' do
|
189
|
+
references :cluster
|
190
|
+
column 'tenant_id', natural_key: true
|
191
|
+
column 'user_id', natural_key: true
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
let(:target) { catalog.postgres.user_table }
|
197
|
+
|
198
|
+
it 'should render table template' do
|
199
|
+
is_expected.to eq <<-EOS.strip_heredoc
|
200
|
+
CREATE TABLE IF NOT EXISTS user_table
|
201
|
+
(
|
202
|
+
id SERIAL,
|
203
|
+
cluster_table_id INTEGER NOT NULL,
|
204
|
+
tenant_id INTEGER NOT NULL,
|
205
|
+
user_id INTEGER NOT NULL
|
206
|
+
);
|
207
|
+
|
208
|
+
DO $$ BEGIN
|
209
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
210
|
+
ALTER TABLE user_table ADD PRIMARY KEY (cluster_table_id, id);
|
211
|
+
END IF; END $$;
|
212
|
+
|
213
|
+
DO $$ BEGIN
|
214
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint c WHERE c.conname = 'user_table_8923fdb_fkey') THEN
|
215
|
+
ALTER TABLE user_table ADD CONSTRAINT user_table_8923fdb_fkey FOREIGN KEY (cluster_table_id) REFERENCES cluster_table(id);
|
216
|
+
END IF; END $$;
|
217
|
+
|
218
|
+
DO $$ BEGIN
|
219
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_9f1c0d7_key') THEN
|
220
|
+
ALTER TABLE user_table ADD CONSTRAINT user_table_9f1c0d7_key UNIQUE(cluster_table_id, tenant_id, user_id);
|
221
|
+
END IF; END $$;
|
222
|
+
|
223
|
+
DO $$ BEGIN
|
224
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_3854361_index') THEN
|
225
|
+
CREATE INDEX user_table_3854361_index ON user_table (tenant_id);
|
226
|
+
END IF; END $$;
|
227
|
+
|
228
|
+
DO $$ BEGIN
|
229
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_e8701ad_index') THEN
|
230
|
+
CREATE INDEX user_table_e8701ad_index ON user_table (user_id);
|
231
|
+
END IF; END $$;
|
232
|
+
|
233
|
+
DO $$ BEGIN
|
234
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_e0e4295_index') THEN
|
235
|
+
CREATE INDEX user_table_e0e4295_index ON user_table (tenant_id, user_id);
|
236
|
+
END IF; END $$;
|
237
|
+
EOS
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
context 'for postgres table with natural_key auto reference' do
|
242
|
+
before do
|
243
|
+
catalog.schema :postgres do
|
244
|
+
table 'cluster' do
|
245
|
+
column 'id', surrogate_key: true, auto: true
|
246
|
+
end
|
247
|
+
table 'user' do
|
248
|
+
references :cluster, natural_key: true
|
249
|
+
column 'tenant_id', natural_key: true
|
250
|
+
column 'user_id', natural_key: true
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
let(:target) { catalog.postgres.user_table }
|
256
|
+
|
257
|
+
it 'should render table template' do
|
258
|
+
is_expected.to eq <<-EOS.strip_heredoc
|
259
|
+
CREATE TABLE IF NOT EXISTS user_table
|
260
|
+
(
|
261
|
+
id SERIAL,
|
262
|
+
cluster_table_id INTEGER NOT NULL,
|
263
|
+
tenant_id INTEGER NOT NULL,
|
264
|
+
user_id INTEGER NOT NULL
|
265
|
+
);
|
266
|
+
|
267
|
+
DO $$ BEGIN
|
268
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
269
|
+
ALTER TABLE user_table ADD PRIMARY KEY (cluster_table_id, id);
|
270
|
+
END IF; END $$;
|
271
|
+
|
272
|
+
DO $$ BEGIN
|
273
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint c WHERE c.conname = 'user_table_8923fdb_fkey') THEN
|
274
|
+
ALTER TABLE user_table ADD CONSTRAINT user_table_8923fdb_fkey FOREIGN KEY (cluster_table_id) REFERENCES cluster_table(id);
|
275
|
+
END IF; END $$;
|
276
|
+
|
277
|
+
DO $$ BEGIN
|
278
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_9f1c0d7_key') THEN
|
279
|
+
ALTER TABLE user_table ADD CONSTRAINT user_table_9f1c0d7_key UNIQUE(cluster_table_id, tenant_id, user_id);
|
280
|
+
END IF; END $$;
|
281
|
+
|
282
|
+
DO $$ BEGIN
|
283
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_8923fdb_index') THEN
|
284
|
+
CREATE INDEX user_table_8923fdb_index ON user_table (cluster_table_id);
|
285
|
+
END IF; END $$;
|
286
|
+
|
287
|
+
DO $$ BEGIN
|
288
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_3854361_index') THEN
|
289
|
+
CREATE INDEX user_table_3854361_index ON user_table (tenant_id);
|
290
|
+
END IF; END $$;
|
291
|
+
|
292
|
+
DO $$ BEGIN
|
293
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_e8701ad_index') THEN
|
294
|
+
CREATE INDEX user_table_e8701ad_index ON user_table (user_id);
|
295
|
+
END IF; END $$;
|
296
|
+
|
297
|
+
DO $$ BEGIN
|
298
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_9f1c0d7_index') THEN
|
299
|
+
CREATE UNIQUE INDEX user_table_9f1c0d7_index ON user_table (cluster_table_id, tenant_id, user_id);
|
300
|
+
END IF; END $$;
|
301
|
+
EOS
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
context 'for postgres table with nested auto reference' do
|
306
|
+
before do
|
307
|
+
catalog.schema :postgres do
|
308
|
+
table 'cluster' do
|
309
|
+
column 'id', surrogate_key: true, auto: true
|
310
|
+
end
|
311
|
+
|
312
|
+
table 'department' do
|
313
|
+
references :cluster
|
314
|
+
column 'department_id', natural_key: true
|
315
|
+
end
|
316
|
+
|
317
|
+
table 'user' do
|
318
|
+
references :cluster
|
319
|
+
references :department
|
320
|
+
column 'tenant_id', natural_key: true
|
321
|
+
column 'user_id', natural_key: true
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
let(:target) { catalog.postgres.user_table }
|
327
|
+
|
328
|
+
it 'should render table template' do
|
329
|
+
is_expected.to eq <<-EOS.strip_heredoc
|
330
|
+
CREATE TABLE IF NOT EXISTS user_table
|
331
|
+
(
|
332
|
+
id SERIAL,
|
333
|
+
cluster_table_id INTEGER NOT NULL,
|
334
|
+
department_table_id INTEGER NOT NULL,
|
335
|
+
tenant_id INTEGER NOT NULL,
|
336
|
+
user_id INTEGER NOT NULL
|
337
|
+
);
|
338
|
+
|
339
|
+
DO $$ BEGIN
|
340
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
341
|
+
ALTER TABLE user_table ADD PRIMARY KEY (cluster_table_id, id);
|
342
|
+
END IF; END $$;
|
343
|
+
|
344
|
+
DO $$ BEGIN
|
345
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint c WHERE c.conname = 'user_table_8923fdb_fkey') THEN
|
346
|
+
ALTER TABLE user_table ADD CONSTRAINT user_table_8923fdb_fkey FOREIGN KEY (cluster_table_id) REFERENCES cluster_table(id);
|
347
|
+
END IF; END $$;
|
348
|
+
|
349
|
+
DO $$ BEGIN
|
350
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint c WHERE c.conname = 'user_table_9000538_fkey') THEN
|
351
|
+
ALTER TABLE user_table ADD CONSTRAINT user_table_9000538_fkey FOREIGN KEY (cluster_table_id, department_table_id) REFERENCES department_table(cluster_table_id, id);
|
352
|
+
END IF; END $$;
|
353
|
+
|
354
|
+
DO $$ BEGIN
|
355
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_9f1c0d7_key') THEN
|
356
|
+
ALTER TABLE user_table ADD CONSTRAINT user_table_9f1c0d7_key UNIQUE(cluster_table_id, tenant_id, user_id);
|
357
|
+
END IF; END $$;
|
358
|
+
|
359
|
+
DO $$ BEGIN
|
360
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_3854361_index') THEN
|
361
|
+
CREATE INDEX user_table_3854361_index ON user_table (tenant_id);
|
362
|
+
END IF; END $$;
|
363
|
+
|
364
|
+
DO $$ BEGIN
|
365
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_e8701ad_index') THEN
|
366
|
+
CREATE INDEX user_table_e8701ad_index ON user_table (user_id);
|
367
|
+
END IF; END $$;
|
368
|
+
|
369
|
+
DO $$ BEGIN
|
370
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_e0e4295_index') THEN
|
371
|
+
CREATE INDEX user_table_e0e4295_index ON user_table (tenant_id, user_id);
|
372
|
+
END IF; END $$;
|
373
|
+
EOS
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
159
377
|
context 'for postgres table with enum column' do
|
160
378
|
before do
|
161
379
|
catalog.schema :postgres do
|
@@ -178,11 +396,16 @@ describe Masamune::Transform::DefineTable do
|
|
178
396
|
|
179
397
|
CREATE TABLE IF NOT EXISTS user_table
|
180
398
|
(
|
181
|
-
id SERIAL
|
399
|
+
id SERIAL,
|
182
400
|
tenant_id INTEGER NOT NULL,
|
183
401
|
user_id INTEGER NOT NULL,
|
184
402
|
state USER_STATE_TYPE NOT NULL DEFAULT 'active'::USER_STATE_TYPE
|
185
403
|
);
|
404
|
+
|
405
|
+
DO $$ BEGIN
|
406
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
407
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
408
|
+
END IF; END $$;
|
186
409
|
EOS
|
187
410
|
end
|
188
411
|
end
|
@@ -203,9 +426,14 @@ describe Masamune::Transform::DefineTable do
|
|
203
426
|
is_expected.to eq <<-EOS.strip_heredoc
|
204
427
|
CREATE TABLE IF NOT EXISTS user_table
|
205
428
|
(
|
206
|
-
identifier UUID
|
429
|
+
identifier UUID DEFAULT uuid_generate_v4(),
|
207
430
|
name VARCHAR NOT NULL
|
208
431
|
);
|
432
|
+
|
433
|
+
DO $$ BEGIN
|
434
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
435
|
+
ALTER TABLE user_table ADD PRIMARY KEY (identifier);
|
436
|
+
END IF; END $$;
|
209
437
|
EOS
|
210
438
|
end
|
211
439
|
end
|
@@ -228,11 +456,16 @@ describe Masamune::Transform::DefineTable do
|
|
228
456
|
is_expected.to eq <<-EOS.strip_heredoc
|
229
457
|
CREATE TABLE IF NOT EXISTS user_table
|
230
458
|
(
|
231
|
-
id SERIAL
|
459
|
+
id SERIAL,
|
232
460
|
name VARCHAR NOT NULL,
|
233
461
|
description VARCHAR NOT NULL
|
234
462
|
);
|
235
463
|
|
464
|
+
DO $$ BEGIN
|
465
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
466
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
467
|
+
END IF; END $$;
|
468
|
+
|
236
469
|
INSERT INTO user_table (name, description)
|
237
470
|
SELECT 'registered', 'Registered'
|
238
471
|
WHERE NOT EXISTS (SELECT 1 FROM user_table WHERE name = 'registered' AND description = 'Registered');
|
@@ -262,11 +495,16 @@ describe Masamune::Transform::DefineTable do
|
|
262
495
|
is_expected.to eq <<-EOS.strip_heredoc
|
263
496
|
CREATE TABLE IF NOT EXISTS user_table
|
264
497
|
(
|
265
|
-
id SERIAL
|
498
|
+
id SERIAL,
|
266
499
|
tenant_id INTEGER NOT NULL,
|
267
500
|
user_id INTEGER NOT NULL
|
268
501
|
);
|
269
502
|
|
503
|
+
DO $$ BEGIN
|
504
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
505
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
506
|
+
END IF; END $$;
|
507
|
+
|
270
508
|
DO $$ BEGIN
|
271
509
|
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_e0e4295_key') THEN
|
272
510
|
ALTER TABLE user_table ADD CONSTRAINT user_table_e0e4295_key UNIQUE(tenant_id, user_id);
|
@@ -298,16 +536,36 @@ describe Masamune::Transform::DefineTable do
|
|
298
536
|
is_expected.to eq <<-EOS.strip_heredoc
|
299
537
|
CREATE TABLE IF NOT EXISTS user_table
|
300
538
|
(
|
301
|
-
id SERIAL
|
539
|
+
id SERIAL,
|
302
540
|
tenant_id INTEGER NOT NULL,
|
303
541
|
user_id INTEGER NOT NULL
|
304
542
|
);
|
305
543
|
|
544
|
+
DO $$ BEGIN
|
545
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
546
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
547
|
+
END IF; END $$;
|
548
|
+
|
306
549
|
DO $$ BEGIN
|
307
550
|
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_e0e4295_key') THEN
|
308
551
|
ALTER TABLE user_table ADD CONSTRAINT user_table_e0e4295_key UNIQUE(tenant_id, user_id);
|
309
552
|
END IF; END $$;
|
310
553
|
|
554
|
+
DO $$ BEGIN
|
555
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_3854361_index') THEN
|
556
|
+
CREATE INDEX user_table_3854361_index ON user_table (tenant_id);
|
557
|
+
END IF; END $$;
|
558
|
+
|
559
|
+
DO $$ BEGIN
|
560
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_e8701ad_index') THEN
|
561
|
+
CREATE INDEX user_table_e8701ad_index ON user_table (user_id);
|
562
|
+
END IF; END $$;
|
563
|
+
|
564
|
+
DO $$ BEGIN
|
565
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_e0e4295_index') THEN
|
566
|
+
CREATE UNIQUE INDEX user_table_e0e4295_index ON user_table (tenant_id, user_id);
|
567
|
+
END IF; END $$;
|
568
|
+
|
311
569
|
INSERT INTO user_table (tenant_id, user_id)
|
312
570
|
SELECT default_tenant_id(), -1
|
313
571
|
WHERE NOT EXISTS (SELECT 1 FROM user_table WHERE tenant_id = default_tenant_id() AND user_id = -1);
|
@@ -318,9 +576,9 @@ describe Masamune::Transform::DefineTable do
|
|
318
576
|
|
319
577
|
ANALYZE user_table;
|
320
578
|
|
321
|
-
CREATE OR REPLACE FUNCTION
|
579
|
+
CREATE OR REPLACE FUNCTION default_user_table_user_id()
|
322
580
|
RETURNS INTEGER IMMUTABLE AS $$
|
323
|
-
SELECT -1;
|
581
|
+
SELECT CAST(-1 AS INTEGER);
|
324
582
|
$$ LANGUAGE SQL;
|
325
583
|
|
326
584
|
CREATE OR REPLACE FUNCTION default_user_table_id()
|
@@ -328,9 +586,9 @@ describe Masamune::Transform::DefineTable do
|
|
328
586
|
SELECT id FROM user_table WHERE tenant_id = default_tenant_id() AND user_id = -1;
|
329
587
|
$$ LANGUAGE SQL;
|
330
588
|
|
331
|
-
CREATE OR REPLACE FUNCTION
|
589
|
+
CREATE OR REPLACE FUNCTION unknown_user_table_user_id()
|
332
590
|
RETURNS INTEGER IMMUTABLE AS $$
|
333
|
-
SELECT -2;
|
591
|
+
SELECT CAST(-2 AS INTEGER);
|
334
592
|
$$ LANGUAGE SQL;
|
335
593
|
|
336
594
|
CREATE OR REPLACE FUNCTION unknown_user_table_id()
|
@@ -365,14 +623,19 @@ describe Masamune::Transform::DefineTable do
|
|
365
623
|
is_expected.to eq <<-EOS.strip_heredoc
|
366
624
|
CREATE TABLE IF NOT EXISTS user_table
|
367
625
|
(
|
368
|
-
id SERIAL
|
369
|
-
user_account_state_table_id INTEGER NOT NULL
|
626
|
+
id SERIAL,
|
627
|
+
user_account_state_table_id INTEGER NOT NULL DEFAULT default_user_account_state_table_id(),
|
370
628
|
name VARCHAR NOT NULL
|
371
629
|
);
|
372
630
|
|
373
631
|
DO $$ BEGIN
|
374
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = '
|
375
|
-
|
632
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
633
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
634
|
+
END IF; END $$;
|
635
|
+
|
636
|
+
DO $$ BEGIN
|
637
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint c WHERE c.conname = 'user_table_bd2027e_fkey') THEN
|
638
|
+
ALTER TABLE user_table ADD CONSTRAINT user_table_bd2027e_fkey FOREIGN KEY (user_account_state_table_id) REFERENCES user_account_state_table(id);
|
376
639
|
END IF; END $$;
|
377
640
|
EOS
|
378
641
|
end
|
@@ -401,20 +664,25 @@ describe Masamune::Transform::DefineTable do
|
|
401
664
|
is_expected.to eq <<-EOS.strip_heredoc
|
402
665
|
CREATE TABLE IF NOT EXISTS user_table
|
403
666
|
(
|
404
|
-
id SERIAL
|
405
|
-
user_account_state_table_id INTEGER NOT NULL
|
406
|
-
hr_user_account_state_table_id INTEGER
|
667
|
+
id SERIAL,
|
668
|
+
user_account_state_table_id INTEGER NOT NULL DEFAULT default_user_account_state_table_id(),
|
669
|
+
hr_user_account_state_table_id INTEGER,
|
407
670
|
name VARCHAR NOT NULL
|
408
671
|
);
|
409
672
|
|
410
673
|
DO $$ BEGIN
|
411
|
-
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = '
|
412
|
-
|
674
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
675
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
676
|
+
END IF; END $$;
|
677
|
+
|
678
|
+
DO $$ BEGIN
|
679
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint c WHERE c.conname = 'user_table_bd2027e_fkey') THEN
|
680
|
+
ALTER TABLE user_table ADD CONSTRAINT user_table_bd2027e_fkey FOREIGN KEY (user_account_state_table_id) REFERENCES user_account_state_table(id);
|
413
681
|
END IF; END $$;
|
414
682
|
|
415
683
|
DO $$ BEGIN
|
416
|
-
IF NOT EXISTS (SELECT 1 FROM
|
417
|
-
|
684
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint c WHERE c.conname = 'user_table_074da4a_fkey') THEN
|
685
|
+
ALTER TABLE user_table ADD CONSTRAINT user_table_074da4a_fkey FOREIGN KEY (hr_user_account_state_table_id) REFERENCES user_account_state_table(id);
|
418
686
|
END IF; END $$;
|
419
687
|
EOS
|
420
688
|
end
|
@@ -450,9 +718,6 @@ describe Masamune::Transform::DefineTable do
|
|
450
718
|
hr_user_account_state_table_id INTEGER,
|
451
719
|
name VARCHAR
|
452
720
|
);
|
453
|
-
|
454
|
-
CREATE INDEX user_table_stage_bd2027e_index ON user_table_stage (user_account_state_table_id);
|
455
|
-
CREATE INDEX user_table_stage_074da4a_index ON user_table_stage (hr_user_account_state_table_id);
|
456
721
|
EOS
|
457
722
|
end
|
458
723
|
end
|
@@ -468,9 +733,6 @@ describe Masamune::Transform::DefineTable do
|
|
468
733
|
user_account_state_table_id INTEGER,
|
469
734
|
name VARCHAR
|
470
735
|
);
|
471
|
-
|
472
|
-
CREATE INDEX user_table_stage_074da4a_index ON user_table_stage (hr_user_account_state_table_id);
|
473
|
-
CREATE INDEX user_table_stage_bd2027e_index ON user_table_stage (user_account_state_table_id);
|
474
736
|
EOS
|
475
737
|
end
|
476
738
|
end
|
@@ -514,11 +776,16 @@ describe Masamune::Transform::DefineTable do
|
|
514
776
|
|
515
777
|
CREATE TABLE IF NOT EXISTS user_table
|
516
778
|
(
|
517
|
-
id INTEGER
|
779
|
+
id INTEGER DEFAULT nextval('user_table_id_seq'),
|
518
780
|
tenant_id INTEGER NOT NULL,
|
519
781
|
user_id INTEGER NOT NULL
|
520
782
|
);
|
521
783
|
|
784
|
+
DO $$ BEGIN
|
785
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
786
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
787
|
+
END IF; END $$;
|
788
|
+
|
522
789
|
DO $$ BEGIN
|
523
790
|
IF NOT EXISTS (SELECT 1 WHERE sequence_owner('user_table_id_seq') = 'user_table.id') THEN
|
524
791
|
ALTER SEQUENCE user_table_id_seq OWNED BY user_table.id;
|
@@ -526,4 +793,102 @@ describe Masamune::Transform::DefineTable do
|
|
526
793
|
EOS
|
527
794
|
end
|
528
795
|
end
|
796
|
+
|
797
|
+
context 'for postgres table with index columns and with_index: false' do
|
798
|
+
before do
|
799
|
+
catalog.schema :postgres do
|
800
|
+
table 'user' do
|
801
|
+
column 'tenant_id', index: true
|
802
|
+
column 'user_id', index: true
|
803
|
+
end
|
804
|
+
end
|
805
|
+
end
|
806
|
+
|
807
|
+
let(:options) { { with_index: false } }
|
808
|
+
let(:target) { catalog.postgres.user_table }
|
809
|
+
|
810
|
+
it 'should render table template' do
|
811
|
+
is_expected.to eq <<-EOS.strip_heredoc
|
812
|
+
CREATE TABLE IF NOT EXISTS user_table
|
813
|
+
(
|
814
|
+
id SERIAL,
|
815
|
+
tenant_id INTEGER NOT NULL,
|
816
|
+
user_id INTEGER NOT NULL
|
817
|
+
);
|
818
|
+
|
819
|
+
DO $$ BEGIN
|
820
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
821
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
822
|
+
END IF; END $$;
|
823
|
+
EOS
|
824
|
+
end
|
825
|
+
end
|
826
|
+
|
827
|
+
context 'for postgres table with referenced tables and with_foreign_key: false' do
|
828
|
+
before do
|
829
|
+
catalog.schema :postgres do
|
830
|
+
table 'user_account_state' do
|
831
|
+
column 'name', type: :string, unique: true
|
832
|
+
column 'description', type: :string
|
833
|
+
row name: 'registered', description: 'Registered'
|
834
|
+
row name: 'active', description: 'Active', attributes: { default: true }
|
835
|
+
row name: 'inactive', description: 'Inactive'
|
836
|
+
end
|
837
|
+
|
838
|
+
table 'user' do
|
839
|
+
references :user_account_state
|
840
|
+
column 'name', type: :string
|
841
|
+
end
|
842
|
+
end
|
843
|
+
end
|
844
|
+
|
845
|
+
let(:options) { { with_foreign_key: false } }
|
846
|
+
let(:target) { catalog.postgres.user_table }
|
847
|
+
|
848
|
+
it 'should render table template' do
|
849
|
+
is_expected.to eq <<-EOS.strip_heredoc
|
850
|
+
CREATE TABLE IF NOT EXISTS user_table
|
851
|
+
(
|
852
|
+
id SERIAL,
|
853
|
+
user_account_state_table_id INTEGER NOT NULL DEFAULT default_user_account_state_table_id(),
|
854
|
+
name VARCHAR NOT NULL
|
855
|
+
);
|
856
|
+
|
857
|
+
DO $$ BEGIN
|
858
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
859
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
860
|
+
END IF; END $$;
|
861
|
+
EOS
|
862
|
+
end
|
863
|
+
end
|
864
|
+
|
865
|
+
context 'for postgres table with unique columns and with_unique_constraint: false' do
|
866
|
+
before do
|
867
|
+
catalog.schema :postgres do
|
868
|
+
table 'user' do
|
869
|
+
column 'tenant_id', unique: true
|
870
|
+
column 'user_id'
|
871
|
+
end
|
872
|
+
end
|
873
|
+
end
|
874
|
+
|
875
|
+
let(:options) { { with_unique_constraint: false } }
|
876
|
+
let(:target) { catalog.postgres.user_table }
|
877
|
+
|
878
|
+
it 'should render table template' do
|
879
|
+
is_expected.to eq <<-EOS.strip_heredoc
|
880
|
+
CREATE TABLE IF NOT EXISTS user_table
|
881
|
+
(
|
882
|
+
id SERIAL,
|
883
|
+
tenant_id INTEGER NOT NULL,
|
884
|
+
user_id INTEGER NOT NULL
|
885
|
+
);
|
886
|
+
|
887
|
+
DO $$ BEGIN
|
888
|
+
IF NOT EXISTS (SELECT 1 FROM pg_class c WHERE c.relname = 'user_table_pkey') THEN
|
889
|
+
ALTER TABLE user_table ADD PRIMARY KEY (id);
|
890
|
+
END IF; END $$;
|
891
|
+
EOS
|
892
|
+
end
|
893
|
+
end
|
529
894
|
end
|