masamune 0.12.1 → 0.12.2
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/lib/masamune/schema/column.rb +2 -3
- data/lib/masamune/transform/deduplicate_dimension.psql.erb +13 -2
- data/lib/masamune/transform/deduplicate_dimension.rb +20 -2
- data/lib/masamune/transform/denormalize_table.psql.erb +1 -1
- data/lib/masamune/transform/replace_table.psql.erb +67 -0
- data/lib/masamune/transform/rollup_fact.psql.erb +3 -40
- data/lib/masamune/transform/snapshot_dimension.rb +1 -1
- data/lib/masamune/transform/stage_fact.psql.erb +3 -40
- data/lib/masamune/version.rb +1 -1
- data/spec/masamune/schema/column_spec.rb +35 -1
- data/spec/masamune/transform/deduplicate_dimension_spec.rb +14 -2
- data/spec/masamune/transform/denormalize_table_spec.rb +8 -8
- data/spec/masamune/transform/rollup_fact_spec.rb +18 -3
- data/spec/masamune/transform/stage_fact_spec.rb +8 -3
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49cf069b1b8b08d4564094cbf3893fd9a5a96d6d
|
4
|
+
data.tar.gz: eae59d5b26dcc4b78db6e4024841b53bc48cac6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05f7ebbb93c6eeae7b5ede63c098da7d08fb1a5cc616cc0cf31ebfd7eaca7447b70e29d5f9b5e7c54b5217e8689d8270660e349a4e35fb4d4f26467da01aeac0
|
7
|
+
data.tar.gz: cd36f48081410e820ed5485820b186b6455ecf456eeec364830f53cd9eb0ff53b1500ac85fbc2dc03d964bd97bfd2f577a064939777a121f573b939b910c2b04
|
@@ -80,8 +80,6 @@ module Masamune::Schema
|
|
80
80
|
'uuid_generate_v4()'
|
81
81
|
when :sequence
|
82
82
|
"nextval('#{sequence_id}')"
|
83
|
-
when :enum
|
84
|
-
values.first
|
85
83
|
end
|
86
84
|
end
|
87
85
|
|
@@ -277,7 +275,7 @@ module Masamune::Schema
|
|
277
275
|
nil
|
278
276
|
end
|
279
277
|
when :integer
|
280
|
-
value.
|
278
|
+
value.blank? ? nil : value.to_i
|
281
279
|
when :yaml
|
282
280
|
case value
|
283
281
|
when Hash
|
@@ -470,6 +468,7 @@ module Masamune::Schema
|
|
470
468
|
def required_value?
|
471
469
|
return false if reference && (reference.null || !reference.default.nil?)
|
472
470
|
return false if null || !default.nil?
|
471
|
+
return false if !strict
|
473
472
|
true
|
474
473
|
end
|
475
474
|
|
@@ -20,6 +20,17 @@
|
|
20
20
|
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
21
|
-- THE SOFTWARE.
|
22
22
|
|
23
|
+
WITH consolidated AS (
|
24
|
+
SELECT
|
25
|
+
<%- target.insert_view_values(coalesce: true).each do |value| -%>
|
26
|
+
<%= value %><%= ',' %>
|
27
|
+
<%- end -%>
|
28
|
+
parent_id,
|
29
|
+
record_id,
|
30
|
+
start_at
|
31
|
+
FROM
|
32
|
+
<%= source.name %>
|
33
|
+
)
|
23
34
|
INSERT INTO
|
24
35
|
<%= target.name %> (<%= target.insert_columns.join(', ') %>, parent_id, record_id, start_at)
|
25
36
|
SELECT DISTINCT
|
@@ -38,13 +49,13 @@ FROM (
|
|
38
49
|
record_id,
|
39
50
|
start_at,
|
40
51
|
CASE
|
41
|
-
WHEN <%= target.
|
52
|
+
WHEN <%= target.duplicate_value_conditions('w').join(' AND ') %> THEN
|
42
53
|
1
|
43
54
|
ELSE
|
44
55
|
0
|
45
56
|
END AS duplicate
|
46
57
|
FROM
|
47
|
-
|
58
|
+
consolidated
|
48
59
|
WINDOW w AS (PARTITION BY <%= target.window.join(', ') %> ORDER BY start_at)
|
49
60
|
) tmp
|
50
61
|
WHERE
|
@@ -35,8 +35,26 @@ module Masamune::Transform
|
|
35
35
|
consolidated_columns.map { |_, column| column.name }
|
36
36
|
end
|
37
37
|
|
38
|
-
def insert_view_values
|
39
|
-
consolidated_columns.map
|
38
|
+
def insert_view_values(coalesce: false)
|
39
|
+
consolidated_columns.map do |_, column|
|
40
|
+
if !column.default.nil? && coalesce
|
41
|
+
"COALESCE(#{column.name}, #{column.sql_value(column.default)}) AS #{column.name}"
|
42
|
+
else
|
43
|
+
column.name
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def duplicate_value_conditions(window)
|
49
|
+
[].tap do |result|
|
50
|
+
consolidated_columns.map do |_, column|
|
51
|
+
if column.null
|
52
|
+
result << "((LAG(#{column.name}) OVER #{window} = #{column.name}) OR (LAG(#{column.name}) OVER #{window} IS NULL AND #{column.name} IS NULL))"
|
53
|
+
else
|
54
|
+
result << "(LAG(#{column.name}) OVER #{window} = #{column.name})"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
40
58
|
end
|
41
59
|
|
42
60
|
def window(*extra)
|
@@ -0,0 +1,67 @@
|
|
1
|
+
-- The MIT License (MIT)
|
2
|
+
--
|
3
|
+
-- Copyright (c) 2014-2015, VMware, Inc. All Rights Reserved.
|
4
|
+
--
|
5
|
+
-- Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
-- of this software and associated documentation files (the "Software"), to deal
|
7
|
+
-- in the Software without restriction, including without limitation the rights
|
8
|
+
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
-- copies of the Software, and to permit persons to whom the Software is
|
10
|
+
-- furnished to do so, subject to the following conditions:
|
11
|
+
--
|
12
|
+
-- The above copyright notice and this permission notice shall be included in
|
13
|
+
-- all copies or substantial portions of the Software.
|
14
|
+
--
|
15
|
+
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
-- THE SOFTWARE.
|
22
|
+
|
23
|
+
<%- target_tmp = target.stage_table(suffix: 'tmp') %>
|
24
|
+
|
25
|
+
SELECT pg_advisory_lock(ddl_advisory_lock());
|
26
|
+
|
27
|
+
DROP TABLE IF EXISTS <%= target_tmp.name %> CASCADE;
|
28
|
+
|
29
|
+
BEGIN;
|
30
|
+
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
31
|
+
|
32
|
+
ALTER TABLE <%= target.name %> DROP CONSTRAINT IF EXISTS <%= target.name %>_time_key_check;
|
33
|
+
<%- target.foreign_key_columns.each do |column| -%>
|
34
|
+
<%- if column.reference_constraint -%>
|
35
|
+
ALTER TABLE <%= target.name %> DROP CONSTRAINT IF EXISTS <%= target.name %>_<%= column.name %>_fkey CASCADE;
|
36
|
+
<%- end -%>
|
37
|
+
<%- end -%>
|
38
|
+
|
39
|
+
<%- target.index_columns.each do |column_names, unique, id| -%>
|
40
|
+
<%- index_name = "#{target.name}_#{id}_index" -%>
|
41
|
+
DROP INDEX IF EXISTS <%= index_name %>;
|
42
|
+
<%- end -%>
|
43
|
+
|
44
|
+
ALTER TABLE <%= target.name %> RENAME TO <%= target_tmp.name %>;
|
45
|
+
ALTER TABLE <%= source.name %> RENAME TO <%= target.name %>;
|
46
|
+
|
47
|
+
ALTER TABLE <%= target.name %> INHERIT <%= target.parent.name %>;
|
48
|
+
ALTER TABLE <%= target.name %> ADD CONSTRAINT <%= target.name %>_time_key_check <%= target.constraints %>;
|
49
|
+
<%- target.foreign_key_columns.each do |column| -%>
|
50
|
+
<%- if column.reference_constraint -%>
|
51
|
+
ALTER TABLE <%= target.name %> ADD CONSTRAINT <%= target.name %>_<%= column.name %>_fkey FOREIGN KEY (<%= column.name %>) <%= column.reference_constraint %> NOT VALID DEFERRABLE INITIALLY DEFERRED;
|
52
|
+
<%- end -%>
|
53
|
+
<%- end -%>
|
54
|
+
|
55
|
+
<%- target.index_columns.each do |column_names, unique, id| -%>
|
56
|
+
<%- index_name = "#{target.name}_#{id}_index" -%>
|
57
|
+
CREATE <%= unique ? 'UNIQUE INDEX' : 'INDEX' %> <%= index_name %> ON <%= target.name %> (<%= column_names.join(', ') %>);
|
58
|
+
<%- end -%>
|
59
|
+
|
60
|
+
ANALYZE <%= target.name %>;
|
61
|
+
|
62
|
+
COMMIT;
|
63
|
+
|
64
|
+
DROP TABLE IF EXISTS <%= target_tmp.name %> CASCADE;
|
65
|
+
DROP TABLE IF EXISTS <%= source.name %> CASCADE;
|
66
|
+
|
67
|
+
SELECT pg_advisory_unlock(ddl_advisory_lock());
|
@@ -25,11 +25,12 @@
|
|
25
25
|
SELECT pg_advisory_lock(<%= target_stage.lock_id %>);
|
26
26
|
|
27
27
|
DROP TABLE IF EXISTS <%= target_stage.name %> CASCADE;
|
28
|
-
DROP TABLE IF EXISTS <%= target_stage.name %>_tmp CASCADE;
|
29
28
|
|
30
29
|
CREATE TABLE IF NOT EXISTS <%= target.name %> (LIKE <%= target.parent.name %> INCLUDING ALL);
|
31
30
|
CREATE TABLE IF NOT EXISTS <%= target_stage.name %> (LIKE <%= target.parent.name %> INCLUDING ALL);
|
32
31
|
|
32
|
+
BEGIN;
|
33
|
+
|
33
34
|
INSERT INTO
|
34
35
|
<%= target_stage.name %> (<%= target.insert_columns(source).join(', ') %>)
|
35
36
|
SELECT
|
@@ -50,46 +51,8 @@ GROUP BY
|
|
50
51
|
<%- end -%>
|
51
52
|
;
|
52
53
|
|
53
|
-
SELECT pg_advisory_lock(ddl_advisory_lock());
|
54
|
-
|
55
|
-
BEGIN;
|
56
|
-
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
57
|
-
|
58
|
-
ALTER TABLE <%= target.name %> DROP CONSTRAINT IF EXISTS <%= target.name %>_time_key_check;
|
59
|
-
<%- target.foreign_key_columns.each do |column| -%>
|
60
|
-
<%- if column.reference_constraint -%>
|
61
|
-
ALTER TABLE <%= target.name %> DROP CONSTRAINT IF EXISTS <%= target.name %>_<%= column.name %>_fkey CASCADE;
|
62
|
-
<%- end -%>
|
63
|
-
<%- end -%>
|
64
|
-
|
65
|
-
<%- target.index_columns.each do |column_names, unique, id| -%>
|
66
|
-
<%- index_name = "#{target.name}_#{id}_index" -%>
|
67
|
-
DROP INDEX IF EXISTS <%= index_name %>;
|
68
|
-
<%- end -%>
|
69
|
-
|
70
|
-
ALTER TABLE <%= target.name %> RENAME TO <%= target_stage.name %>_tmp;
|
71
|
-
ALTER TABLE <%= target_stage.name %> RENAME TO <%= target.name %>;
|
72
|
-
|
73
|
-
ALTER TABLE <%= target.name %> INHERIT <%= target.parent.name %>;
|
74
|
-
ALTER TABLE <%= target.name %> ADD CONSTRAINT <%= target.name %>_time_key_check <%= target.constraints %>;
|
75
|
-
<%- target.foreign_key_columns.each do |column| -%>
|
76
|
-
<%- if column.reference_constraint -%>
|
77
|
-
ALTER TABLE <%= target.name %> ADD CONSTRAINT <%= target.name %>_<%= column.name %>_fkey FOREIGN KEY (<%= column.name %>) <%= column.reference_constraint %> NOT VALID DEFERRABLE INITIALLY DEFERRED;
|
78
|
-
<%- end -%>
|
79
|
-
<%- end -%>
|
80
|
-
|
81
|
-
<%- target.index_columns.each do |column_names, unique, id| -%>
|
82
|
-
<%- index_name = "#{target.name}_#{id}_index" -%>
|
83
|
-
CREATE <%= unique ? 'UNIQUE INDEX' : 'INDEX' %> <%= index_name %> ON <%= target.name %> (<%= column_names.join(', ') %>);
|
84
|
-
<%- end -%>
|
85
|
-
|
86
|
-
ANALYZE <%= target.name %>;
|
87
|
-
|
88
54
|
COMMIT;
|
89
55
|
|
90
|
-
|
91
|
-
DROP TABLE IF EXISTS <%= target_stage.name %> CASCADE;
|
92
|
-
|
93
|
-
SELECT pg_advisory_unlock(ddl_advisory_lock());
|
56
|
+
<%= render 'replace_table.psql.erb', source: target_stage, target: target %>
|
94
57
|
|
95
58
|
SELECT pg_advisory_unlock(<%= target_stage.lock_id %>);
|
@@ -42,7 +42,7 @@ module Masamune::Transform
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def insert_view_constraints
|
45
|
-
consolidated_columns.reject { |_, column| column.null }.map { |_, column| "#{column.name} IS NOT NULL" }
|
45
|
+
consolidated_columns.reject { |_, column| !column.default.nil? || column.null }.map { |_, column| "#{column.name} IS NOT NULL" }
|
46
46
|
end
|
47
47
|
method_with_last_element :insert_view_constraints
|
48
48
|
|
@@ -26,11 +26,12 @@
|
|
26
26
|
SELECT pg_advisory_lock(<%= target_partition.lock_id %>);
|
27
27
|
|
28
28
|
DROP TABLE IF EXISTS <%= target_stage.name %> CASCADE;
|
29
|
-
DROP TABLE IF EXISTS <%= target_partition.name %>_tmp CASCADE;
|
30
29
|
|
31
30
|
CREATE TABLE IF NOT EXISTS <%= target_stage.name %> (LIKE <%= target.name %> INCLUDING ALL);
|
32
31
|
CREATE TABLE IF NOT EXISTS <%= target_partition.name %> (LIKE <%= target.name %> INCLUDING ALL);
|
33
32
|
|
33
|
+
BEGIN;
|
34
|
+
|
34
35
|
INSERT INTO
|
35
36
|
<%= target_stage.name %> (<%= target.insert_columns(source).join(', ') %>)
|
36
37
|
SELECT
|
@@ -47,46 +48,8 @@ ON
|
|
47
48
|
<%- end -%>
|
48
49
|
;
|
49
50
|
|
50
|
-
SELECT pg_advisory_lock(ddl_advisory_lock());
|
51
|
-
|
52
|
-
BEGIN;
|
53
|
-
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
54
|
-
|
55
|
-
ALTER TABLE <%= target_partition.name %> DROP CONSTRAINT IF EXISTS <%= target_partition.name %>_time_key_check;
|
56
|
-
<%- target.foreign_key_columns.each do |column| -%>
|
57
|
-
<%- if column.reference_constraint -%>
|
58
|
-
ALTER TABLE <%= target_partition.name %> DROP CONSTRAINT IF EXISTS <%= target_partition.name %>_<%= column.name %>_fkey CASCADE;
|
59
|
-
<%- end -%>
|
60
|
-
<%- end -%>
|
61
|
-
|
62
|
-
<%- target_partition.index_columns.each do |column_names, unique, id| -%>
|
63
|
-
<%- index_name = "#{target_partition.name}_#{id}_index" -%>
|
64
|
-
DROP INDEX IF EXISTS <%= index_name %>;
|
65
|
-
<%- end -%>
|
66
|
-
|
67
|
-
ALTER TABLE <%= target_partition.name %> RENAME TO <%= target_partition.name %>_tmp;
|
68
|
-
ALTER TABLE <%= target_stage.name %> RENAME TO <%= target_partition.name %>;
|
69
|
-
|
70
|
-
ALTER TABLE <%= target_partition.name %> INHERIT <%= target.name %>;
|
71
|
-
ALTER TABLE <%= target_partition.name %> ADD CONSTRAINT <%= target_partition.name %>_time_key_check <%= target_partition.constraints %>;
|
72
|
-
<%- target.foreign_key_columns.each do |column| -%>
|
73
|
-
<%- if column.reference_constraint -%>
|
74
|
-
ALTER TABLE <%= target_partition.name %> ADD CONSTRAINT <%= target_partition.name %>_<%= column.name %>_fkey FOREIGN KEY (<%= column.name %>) <%= column.reference_constraint %> NOT VALID DEFERRABLE INITIALLY DEFERRED;
|
75
|
-
<%- end -%>
|
76
|
-
<%- end -%>
|
77
|
-
|
78
|
-
<%- target_partition.index_columns.each do |column_names, unique, id| -%>
|
79
|
-
<%- index_name = "#{target_partition.name}_#{id}_index" -%>
|
80
|
-
CREATE <%= unique ? 'UNIQUE INDEX' : 'INDEX' %> <%= index_name %> ON <%= target_partition.name %> (<%= column_names.join(', ') %>);
|
81
|
-
<%- end -%>
|
82
|
-
|
83
|
-
ANALYZE <%= target_partition.name %>;
|
84
|
-
|
85
51
|
COMMIT;
|
86
52
|
|
87
|
-
|
88
|
-
DROP TABLE IF EXISTS <%= target_stage.name %> CASCADE;
|
89
|
-
|
90
|
-
SELECT pg_advisory_unlock(ddl_advisory_lock());
|
53
|
+
<%= render 'replace_table.psql.erb', source: target_stage, target: target_partition %>
|
91
54
|
|
92
55
|
SELECT pg_advisory_unlock(<%= target_partition.lock_id %>);
|
data/lib/masamune/version.rb
CHANGED
@@ -65,7 +65,7 @@ describe Masamune::Schema::Column do
|
|
65
65
|
|
66
66
|
context '#default' do
|
67
67
|
subject { column.default }
|
68
|
-
it { is_expected.to
|
68
|
+
it { is_expected.to be_nil }
|
69
69
|
end
|
70
70
|
|
71
71
|
context '#sql_type' do
|
@@ -342,6 +342,30 @@ describe Masamune::Schema::Column do
|
|
342
342
|
end
|
343
343
|
end
|
344
344
|
|
345
|
+
context 'with type :integer' do
|
346
|
+
let(:column) { described_class.new(id: 'integer', type: :integer) }
|
347
|
+
|
348
|
+
context 'when nil' do
|
349
|
+
let(:value) { nil }
|
350
|
+
it { is_expected.to be(nil) }
|
351
|
+
end
|
352
|
+
|
353
|
+
context 'when blank' do
|
354
|
+
let(:value) { '' }
|
355
|
+
it { is_expected.to be(nil) }
|
356
|
+
end
|
357
|
+
|
358
|
+
context 'when String encoded Integer' do
|
359
|
+
let(:value) { "1" }
|
360
|
+
it { is_expected.to eq(1) }
|
361
|
+
end
|
362
|
+
|
363
|
+
context 'when Integer' do
|
364
|
+
let(:value) { 1 }
|
365
|
+
it { is_expected.to eq(1) }
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|
345
369
|
context 'with type :timestamp' do
|
346
370
|
let(:column) { described_class.new(id: 'timestamp', type: :timestamp) }
|
347
371
|
|
@@ -635,6 +659,16 @@ describe Masamune::Schema::Column do
|
|
635
659
|
it { is_expected.to eq(false) }
|
636
660
|
end
|
637
661
|
|
662
|
+
context 'when :strict true' do
|
663
|
+
let(:column) { described_class.new id: 'name', type: :string, strict: true }
|
664
|
+
it { is_expected.to eq(true) }
|
665
|
+
end
|
666
|
+
|
667
|
+
context 'when :strict false' do
|
668
|
+
let(:column) { described_class.new id: 'name', type: :string, strict: false }
|
669
|
+
it { is_expected.to eq(false) }
|
670
|
+
end
|
671
|
+
|
638
672
|
context 'when column has default' do
|
639
673
|
let(:column) { described_class.new id: 'name', type: :string, default: 'missing' }
|
640
674
|
it { is_expected.to eq(false) }
|
@@ -46,6 +46,18 @@ describe Masamune::Transform::DeduplicateDimension do
|
|
46
46
|
|
47
47
|
it 'should render deduplicate_dimension template' do
|
48
48
|
is_expected.to eq <<-EOS.strip_heredoc
|
49
|
+
WITH consolidated AS (
|
50
|
+
SELECT
|
51
|
+
user_account_state_type_id,
|
52
|
+
tenant_id,
|
53
|
+
user_id,
|
54
|
+
preferences,
|
55
|
+
parent_id,
|
56
|
+
record_id,
|
57
|
+
start_at
|
58
|
+
FROM
|
59
|
+
user_consolidated_dimension_stage
|
60
|
+
)
|
49
61
|
INSERT INTO
|
50
62
|
user_deduplicated_dimension_stage (user_account_state_type_id, tenant_id, user_id, preferences, parent_id, record_id, start_at)
|
51
63
|
SELECT DISTINCT
|
@@ -66,13 +78,13 @@ describe Masamune::Transform::DeduplicateDimension do
|
|
66
78
|
record_id,
|
67
79
|
start_at,
|
68
80
|
CASE
|
69
|
-
WHEN (LAG(user_account_state_type_id) OVER w = user_account_state_type_id) AND (LAG(tenant_id) OVER w = tenant_id) AND (LAG(user_id) OVER w = user_id) AND (LAG(preferences) OVER w = preferences) THEN
|
81
|
+
WHEN (LAG(user_account_state_type_id) OVER w = user_account_state_type_id) AND (LAG(tenant_id) OVER w = tenant_id) AND (LAG(user_id) OVER w = user_id) AND ((LAG(preferences) OVER w = preferences) OR (LAG(preferences) OVER w IS NULL AND preferences IS NULL)) THEN
|
70
82
|
1
|
71
83
|
ELSE
|
72
84
|
0
|
73
85
|
END AS duplicate
|
74
86
|
FROM
|
75
|
-
|
87
|
+
consolidated
|
76
88
|
WINDOW w AS (PARTITION BY tenant_id, user_id ORDER BY start_at)
|
77
89
|
) tmp
|
78
90
|
WHERE
|
@@ -97,19 +97,19 @@ describe Masamune::Transform::DenormalizeTable do
|
|
97
97
|
visits_fact.time_key
|
98
98
|
FROM
|
99
99
|
visits_fact
|
100
|
-
JOIN
|
100
|
+
LEFT JOIN
|
101
101
|
date_dimension
|
102
102
|
ON
|
103
103
|
date_dimension.id = visits_fact.date_dimension_id
|
104
|
-
JOIN
|
104
|
+
LEFT JOIN
|
105
105
|
tenant_dimension
|
106
106
|
ON
|
107
107
|
tenant_dimension.id = visits_fact.tenant_dimension_id
|
108
|
-
JOIN
|
108
|
+
LEFT JOIN
|
109
109
|
user_dimension
|
110
110
|
ON
|
111
111
|
user_dimension.id = visits_fact.user_dimension_id
|
112
|
-
JOIN
|
112
|
+
LEFT JOIN
|
113
113
|
user_agent_type
|
114
114
|
ON
|
115
115
|
user_agent_type.id = visits_fact.user_agent_type_id
|
@@ -152,19 +152,19 @@ describe Masamune::Transform::DenormalizeTable do
|
|
152
152
|
visits_fact.time_key
|
153
153
|
FROM
|
154
154
|
visits_fact
|
155
|
-
JOIN
|
155
|
+
LEFT JOIN
|
156
156
|
date_dimension
|
157
157
|
ON
|
158
158
|
date_dimension.id = visits_fact.date_dimension_id
|
159
|
-
JOIN
|
159
|
+
LEFT JOIN
|
160
160
|
tenant_dimension
|
161
161
|
ON
|
162
162
|
tenant_dimension.id = visits_fact.tenant_dimension_id
|
163
|
-
JOIN
|
163
|
+
LEFT JOIN
|
164
164
|
user_dimension
|
165
165
|
ON
|
166
166
|
user_dimension.id = visits_fact.user_dimension_id
|
167
|
-
JOIN
|
167
|
+
LEFT JOIN
|
168
168
|
user_agent_type
|
169
169
|
ON
|
170
170
|
user_agent_type.id = visits_fact.user_agent_type_id
|
@@ -95,11 +95,12 @@ describe Masamune::Transform::RollupFact do
|
|
95
95
|
SELECT pg_advisory_lock(42);
|
96
96
|
|
97
97
|
DROP TABLE IF EXISTS visits_hourly_fact_y2014m08_stage CASCADE;
|
98
|
-
DROP TABLE IF EXISTS visits_hourly_fact_y2014m08_stage_tmp CASCADE;
|
99
98
|
|
100
99
|
CREATE TABLE IF NOT EXISTS visits_hourly_fact_y2014m08 (LIKE visits_hourly_fact INCLUDING ALL);
|
101
100
|
CREATE TABLE IF NOT EXISTS visits_hourly_fact_y2014m08_stage (LIKE visits_hourly_fact INCLUDING ALL);
|
102
101
|
|
102
|
+
BEGIN;
|
103
|
+
|
103
104
|
INSERT INTO
|
104
105
|
visits_hourly_fact_y2014m08_stage (date_dimension_id, tenant_dimension_id, user_dimension_id, user_agent_type_id, feature_type_id, total, time_key)
|
105
106
|
SELECT
|
@@ -125,8 +126,12 @@ describe Masamune::Transform::RollupFact do
|
|
125
126
|
(visits_transaction_fact_y2014m08.time_key - (visits_transaction_fact_y2014m08.time_key % 3600))
|
126
127
|
;
|
127
128
|
|
129
|
+
COMMIT;
|
130
|
+
|
128
131
|
SELECT pg_advisory_lock(ddl_advisory_lock());
|
129
132
|
|
133
|
+
DROP TABLE IF EXISTS visits_hourly_fact_y2014m08_stage_tmp CASCADE;
|
134
|
+
|
130
135
|
BEGIN;
|
131
136
|
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
132
137
|
|
@@ -192,11 +197,12 @@ describe Masamune::Transform::RollupFact do
|
|
192
197
|
SELECT pg_advisory_lock(42);
|
193
198
|
|
194
199
|
DROP TABLE IF EXISTS visits_daily_fact_y2014m08_stage CASCADE;
|
195
|
-
DROP TABLE IF EXISTS visits_daily_fact_y2014m08_stage_tmp CASCADE;
|
196
200
|
|
197
201
|
CREATE TABLE IF NOT EXISTS visits_daily_fact_y2014m08 (LIKE visits_daily_fact INCLUDING ALL);
|
198
202
|
CREATE TABLE IF NOT EXISTS visits_daily_fact_y2014m08_stage (LIKE visits_daily_fact INCLUDING ALL);
|
199
203
|
|
204
|
+
BEGIN;
|
205
|
+
|
200
206
|
INSERT INTO
|
201
207
|
visits_daily_fact_y2014m08_stage (date_dimension_id, tenant_dimension_id, user_dimension_id, user_agent_type_id, feature_type_id, total, time_key)
|
202
208
|
SELECT
|
@@ -221,8 +227,12 @@ describe Masamune::Transform::RollupFact do
|
|
221
227
|
visits_hourly_fact_y2014m08.feature_type_id
|
222
228
|
;
|
223
229
|
|
230
|
+
COMMIT;
|
231
|
+
|
224
232
|
SELECT pg_advisory_lock(ddl_advisory_lock());
|
225
233
|
|
234
|
+
DROP TABLE IF EXISTS visits_daily_fact_y2014m08_stage_tmp CASCADE;
|
235
|
+
|
226
236
|
BEGIN;
|
227
237
|
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
228
238
|
|
@@ -288,11 +298,12 @@ describe Masamune::Transform::RollupFact do
|
|
288
298
|
SELECT pg_advisory_lock(42);
|
289
299
|
|
290
300
|
DROP TABLE IF EXISTS visits_monthly_fact_y2014m08_stage CASCADE;
|
291
|
-
DROP TABLE IF EXISTS visits_monthly_fact_y2014m08_stage_tmp CASCADE;
|
292
301
|
|
293
302
|
CREATE TABLE IF NOT EXISTS visits_monthly_fact_y2014m08 (LIKE visits_monthly_fact INCLUDING ALL);
|
294
303
|
CREATE TABLE IF NOT EXISTS visits_monthly_fact_y2014m08_stage (LIKE visits_monthly_fact INCLUDING ALL);
|
295
304
|
|
305
|
+
BEGIN;
|
306
|
+
|
296
307
|
INSERT INTO
|
297
308
|
visits_monthly_fact_y2014m08_stage (date_dimension_id, tenant_dimension_id, user_dimension_id, user_agent_type_id, feature_type_id, total, time_key)
|
298
309
|
SELECT
|
@@ -317,8 +328,12 @@ describe Masamune::Transform::RollupFact do
|
|
317
328
|
visits_daily_fact_y2014m08.feature_type_id
|
318
329
|
;
|
319
330
|
|
331
|
+
COMMIT;
|
332
|
+
|
320
333
|
SELECT pg_advisory_lock(ddl_advisory_lock());
|
321
334
|
|
335
|
+
DROP TABLE IF EXISTS visits_monthly_fact_y2014m08_stage_tmp CASCADE;
|
336
|
+
|
322
337
|
BEGIN;
|
323
338
|
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
324
339
|
|
@@ -105,11 +105,12 @@ describe Masamune::Transform::StageFact do
|
|
105
105
|
SELECT pg_advisory_lock(42);
|
106
106
|
|
107
107
|
DROP TABLE IF EXISTS visits_hourly_fact_y2014m08_stage CASCADE;
|
108
|
-
DROP TABLE IF EXISTS visits_hourly_fact_y2014m08_tmp CASCADE;
|
109
108
|
|
110
109
|
CREATE TABLE IF NOT EXISTS visits_hourly_fact_y2014m08_stage (LIKE visits_hourly_fact INCLUDING ALL);
|
111
110
|
CREATE TABLE IF NOT EXISTS visits_hourly_fact_y2014m08 (LIKE visits_hourly_fact INCLUDING ALL);
|
112
111
|
|
112
|
+
BEGIN;
|
113
|
+
|
113
114
|
INSERT INTO
|
114
115
|
visits_hourly_fact_y2014m08_stage (date_dimension_id, tenant_dimension_id, user_dimension_id, group_dimension_id, user_agent_type_id, feature_type_id, session_type_id, total, time_key)
|
115
116
|
SELECT
|
@@ -156,8 +157,12 @@ describe Masamune::Transform::StageFact do
|
|
156
157
|
feature_type.name = visits_hourly_file_fact_stage.feature_type_name
|
157
158
|
;
|
158
159
|
|
160
|
+
COMMIT;
|
161
|
+
|
159
162
|
SELECT pg_advisory_lock(ddl_advisory_lock());
|
160
163
|
|
164
|
+
DROP TABLE IF EXISTS visits_hourly_fact_y2014m08_stage_tmp CASCADE;
|
165
|
+
|
161
166
|
BEGIN;
|
162
167
|
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
163
168
|
|
@@ -180,7 +185,7 @@ describe Masamune::Transform::StageFact do
|
|
180
185
|
DROP INDEX IF EXISTS visits_hourly_fact_y2014m08_422efee_index;
|
181
186
|
DROP INDEX IF EXISTS visits_hourly_fact_y2014m08_6444ed3_index;
|
182
187
|
|
183
|
-
ALTER TABLE visits_hourly_fact_y2014m08 RENAME TO
|
188
|
+
ALTER TABLE visits_hourly_fact_y2014m08 RENAME TO visits_hourly_fact_y2014m08_stage_tmp;
|
184
189
|
ALTER TABLE visits_hourly_fact_y2014m08_stage RENAME TO visits_hourly_fact_y2014m08;
|
185
190
|
|
186
191
|
ALTER TABLE visits_hourly_fact_y2014m08 INHERIT visits_hourly_fact;
|
@@ -207,7 +212,7 @@ describe Masamune::Transform::StageFact do
|
|
207
212
|
|
208
213
|
COMMIT;
|
209
214
|
|
210
|
-
DROP TABLE IF EXISTS
|
215
|
+
DROP TABLE IF EXISTS visits_hourly_fact_y2014m08_stage_tmp CASCADE;
|
211
216
|
DROP TABLE IF EXISTS visits_hourly_fact_y2014m08_stage CASCADE;
|
212
217
|
|
213
218
|
SELECT pg_advisory_unlock(ddl_advisory_lock());
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: masamune
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.
|
4
|
+
version: 0.12.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Andrews
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -285,6 +285,7 @@ files:
|
|
285
285
|
- lib/masamune/transform/operator.rb
|
286
286
|
- lib/masamune/transform/relabel_dimension.psql.erb
|
287
287
|
- lib/masamune/transform/relabel_dimension.rb
|
288
|
+
- lib/masamune/transform/replace_table.psql.erb
|
288
289
|
- lib/masamune/transform/rollup_fact.psql.erb
|
289
290
|
- lib/masamune/transform/rollup_fact.rb
|
290
291
|
- lib/masamune/transform/snapshot_dimension.psql.erb
|