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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77bd1d9e8351f259a7d946ac7b2abd11b4c14408
|
4
|
+
data.tar.gz: deb47f8efaadd8b90b5825f79970e46833bbb030
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 784416ce6169e2c3f2a9a14465580417ecfc6bdd73e238643022f608a9a04ede66d0b670dfce06e0956b14d3d96a8edbcbe0018ee76bdd0e1ccd4c2bb9f4b37a
|
7
|
+
data.tar.gz: 6b1cb22550d392cb6bf6cf36258d21b28e7c323dd6bab5616b4066380e315bcb289c725d52a36f65cd182293c1a28d68f31e928a642d5429ce1f024945f2d81a
|
data/bin/masamune-dump
ADDED
@@ -85,7 +85,6 @@ module Masamune::Schema
|
|
85
85
|
|
86
86
|
def index=(value)
|
87
87
|
@index ||= Set.new
|
88
|
-
@index.clear
|
89
88
|
@index +=
|
90
89
|
case value
|
91
90
|
when true
|
@@ -101,14 +100,8 @@ module Masamune::Schema
|
|
101
100
|
end
|
102
101
|
end
|
103
102
|
|
104
|
-
def unique
|
105
|
-
self.unique = 'natural' if natural_key
|
106
|
-
@unique
|
107
|
-
end
|
108
|
-
|
109
103
|
def unique=(value)
|
110
104
|
@unique ||= Set.new
|
111
|
-
@unique.clear
|
112
105
|
@unique +=
|
113
106
|
case value
|
114
107
|
when true
|
@@ -125,7 +118,7 @@ module Masamune::Schema
|
|
125
118
|
end
|
126
119
|
|
127
120
|
def foreign_key_name
|
128
|
-
"#{reference.name}.#{@id}".to_sym if reference
|
121
|
+
"#{[reference.label, reference.name].compact.join('_')}.#{@id}".to_sym if reference
|
129
122
|
end
|
130
123
|
|
131
124
|
def compact_name
|
@@ -363,7 +356,7 @@ module Masamune::Schema
|
|
363
356
|
end
|
364
357
|
|
365
358
|
def as_psql
|
366
|
-
[name, sql_type(surrogate_key), *sql_constraints,
|
359
|
+
[name, sql_type(surrogate_key), *sql_constraints, sql_default].compact.join(' ')
|
367
360
|
end
|
368
361
|
|
369
362
|
def as_hql
|
@@ -378,16 +371,6 @@ module Masamune::Schema
|
|
378
371
|
end
|
379
372
|
end
|
380
373
|
|
381
|
-
# TODO: Add ELEMENT REFERENCES
|
382
|
-
def reference_constraint
|
383
|
-
return if parent && parent.temporary?
|
384
|
-
return if degenerate?
|
385
|
-
return if array_value?
|
386
|
-
if reference && reference.surrogate_key.type == type
|
387
|
-
"REFERENCES #{reference.name}(#{reference.surrogate_key.name})"
|
388
|
-
end
|
389
|
-
end
|
390
|
-
|
391
374
|
class << self
|
392
375
|
def dereference_column_name(name)
|
393
376
|
return unless name
|
@@ -477,7 +460,6 @@ module Masamune::Schema
|
|
477
460
|
def sql_constraints
|
478
461
|
[].tap do |constraints|
|
479
462
|
constraints << 'NOT NULL' unless null || surrogate_key || !strict || parent.temporary? || degenerate?
|
480
|
-
constraints << "PRIMARY KEY" if surrogate_key
|
481
463
|
end
|
482
464
|
end
|
483
465
|
|
@@ -91,27 +91,28 @@ module Masamune::Schema
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def initialize_dimension_columns!
|
94
|
+
# TODO assign index for load_fact
|
94
95
|
case type
|
95
96
|
when :one, :date
|
96
97
|
initialize_column! id: 'last_modified_at', type: :timestamp, default: 'NOW()'
|
97
98
|
when :two
|
98
|
-
initialize_column! id: 'start_at', type: :timestamp, default: 'TO_TIMESTAMP(0)', index:
|
99
|
-
initialize_column! id: 'end_at', type: :timestamp, null: true, index:
|
100
|
-
initialize_column! id: 'version', type: :integer, default: 1, null: true
|
99
|
+
initialize_column! id: 'start_at', type: :timestamp, default: 'TO_TIMESTAMP(0)', index: [:start_at, :natural], unique: :natural
|
100
|
+
initialize_column! id: 'end_at', type: :timestamp, null: true, index: :end_at
|
101
|
+
initialize_column! id: 'version', type: :integer, default: 1, null: true
|
101
102
|
initialize_column! id: 'last_modified_at', type: :timestamp, default: 'NOW()'
|
102
103
|
when :four
|
103
104
|
children << ledger_table
|
104
105
|
# FIXME derive type from from parent
|
105
|
-
initialize_column! id: 'parent_id', type: :integer, null: true, reference: ledger_table
|
106
|
-
initialize_column! id: 'record_id', type: :integer, null: true, reference: ledger_table
|
107
|
-
initialize_column! id: 'start_at', type: :timestamp, default: 'TO_TIMESTAMP(0)', index:
|
108
|
-
initialize_column! id: 'end_at', type: :timestamp, null: true, index:
|
109
|
-
initialize_column! id: 'version', type: :integer, default: 1, null: true
|
106
|
+
initialize_column! id: 'parent_id', type: :integer, null: true, reference: TableReference.new(ledger_table)
|
107
|
+
initialize_column! id: 'record_id', type: :integer, null: true, reference: TableReference.new(ledger_table)
|
108
|
+
initialize_column! id: 'start_at', type: :timestamp, default: 'TO_TIMESTAMP(0)', index: [:start_at, :natural], unique: :natural
|
109
|
+
initialize_column! id: 'end_at', type: :timestamp, null: true, index: :end_at
|
110
|
+
initialize_column! id: 'version', type: :integer, default: 1, null: true
|
110
111
|
initialize_column! id: 'last_modified_at', type: :timestamp, default: 'NOW()'
|
111
112
|
when :ledger
|
112
|
-
initialize_column! id: 'source_kind', type: :string, unique:
|
113
|
-
initialize_column! id: 'source_uuid', type: :string, unique:
|
114
|
-
initialize_column! id: 'start_at', type: :timestamp, index:
|
113
|
+
initialize_column! id: 'source_kind', type: :string, index: :natural, unique: :natural
|
114
|
+
initialize_column! id: 'source_uuid', type: :string, index: :natural, unique: :natural
|
115
|
+
initialize_column! id: 'start_at', type: :timestamp, index: :natural, unique: :natural
|
115
116
|
initialize_column! id: 'last_modified_at', type: :timestamp, default: 'NOW()'
|
116
117
|
initialize_column! id: 'delta', type: :integer
|
117
118
|
when :stage
|
data/lib/masamune/schema/fact.rb
CHANGED
@@ -34,8 +34,13 @@ module Masamune::Schema
|
|
34
34
|
@partition = opts.delete(:partition)
|
35
35
|
super opts.reverse_merge(type: :fact)
|
36
36
|
initialize_fact_columns!
|
37
|
-
|
37
|
+
reference_columns.each do |column|
|
38
|
+
column.index.clear
|
38
39
|
column.index << column.name
|
40
|
+
if type == :stage
|
41
|
+
column.index << "#{column.name}_time_key"
|
42
|
+
time_key.index << "#{column.name}_time_key"
|
43
|
+
end
|
39
44
|
end
|
40
45
|
time_key.index << time_key.name
|
41
46
|
end
|
@@ -59,6 +64,10 @@ module Masamune::Schema
|
|
59
64
|
columns.select { |_, column| column && column.reference && column.reference.type == :date }.values.first
|
60
65
|
end
|
61
66
|
|
67
|
+
def primary_keys
|
68
|
+
[]
|
69
|
+
end
|
70
|
+
|
62
71
|
def time_key
|
63
72
|
columns.values.detect { |column| column.id == :time_key }
|
64
73
|
end
|
data/lib/masamune/schema/map.rb
CHANGED
@@ -112,7 +112,7 @@ module Masamune::Schema
|
|
112
112
|
@csv ||= CSV.new(@io, options.merge(headers: row.headers, write_headers: write_headers))
|
113
113
|
if row.missing_required_columns.any?
|
114
114
|
missing_required_column_names = row.missing_required_columns.map(&:name)
|
115
|
-
@store.logger.warn("row '#{row.to_hash}' is missing required columns '#{missing_required_column_names.join(',')}', skipping")
|
115
|
+
@store.logger.warn("row '#{row.to_hash}' is missing required columns '#{missing_required_column_names.join(', ')}', skipping")
|
116
116
|
else
|
117
117
|
@csv << row.serialize if append?(row.serialize)
|
118
118
|
end
|
@@ -258,8 +258,8 @@ module Masamune::Schema
|
|
258
258
|
Array.wrap(function.call(input)).each do |output|
|
259
259
|
yield output
|
260
260
|
end
|
261
|
-
rescue
|
262
|
-
@store.logger.warn("failed to process
|
261
|
+
rescue => e
|
262
|
+
@store.logger.warn("failed to process row for #{target.name}, skipping: #{e.message}")
|
263
263
|
end
|
264
264
|
end
|
265
265
|
end
|
data/lib/masamune/schema/row.rb
CHANGED
@@ -75,11 +75,9 @@ module Masamune::Schema
|
|
75
75
|
raise ArgumentError, "table #{name} contains reserved columns" if columns.any? { |column| reserved_column_ids.include?(column.id) }
|
76
76
|
|
77
77
|
initialize_surrogate_key_column! unless columns.any? { |column| column.surrogate_key }
|
78
|
-
initialize_reference_columns!
|
78
|
+
initialize_reference_columns! unless columns.any? { |column| column.reference }
|
79
79
|
columns.each do |column|
|
80
|
-
|
81
|
-
@columns[column.name] = column.dup
|
82
|
-
@columns[column.name].parent = self
|
80
|
+
initialize_column!(column)
|
83
81
|
end
|
84
82
|
end
|
85
83
|
|
@@ -107,6 +105,10 @@ module Masamune::Schema
|
|
107
105
|
columns.values.detect { |column| column.surrogate_key }
|
108
106
|
end
|
109
107
|
|
108
|
+
def primary_keys
|
109
|
+
[*auto_surrogate_keys, surrogate_key].compact
|
110
|
+
end
|
111
|
+
|
110
112
|
def natural_keys
|
111
113
|
columns.values.select { |column| column.natural_key }
|
112
114
|
end
|
@@ -119,16 +121,14 @@ module Masamune::Schema
|
|
119
121
|
def unique_constraints
|
120
122
|
return [] if temporary?
|
121
123
|
unique_constraints_map.map do |_, column_names|
|
122
|
-
[column_names, short_md5(column_names)]
|
124
|
+
[column_names, short_md5(column_names.to_a)]
|
123
125
|
end.uniq
|
124
126
|
end
|
125
127
|
|
126
|
-
# TODO: Add optional USING
|
127
|
-
# TODO: Default to GIN for array columns
|
128
128
|
def index_columns
|
129
129
|
index_column_map.map do |_, column_names|
|
130
130
|
unique_index = reverse_unique_constraints_map.key?(column_names.sort)
|
131
|
-
[column_names, unique_index, short_md5(column_names)]
|
131
|
+
[column_names, unique_index, short_md5(column_names.to_a)]
|
132
132
|
end.uniq
|
133
133
|
end
|
134
134
|
|
@@ -152,7 +152,7 @@ module Masamune::Schema
|
|
152
152
|
end
|
153
153
|
|
154
154
|
def foreign_key_columns
|
155
|
-
columns.values.select { | column| column.reference && column.reference.foreign_key }
|
155
|
+
columns.values.select { | column| !column.degenerate? && column.reference && column.reference.foreign_key }
|
156
156
|
end
|
157
157
|
|
158
158
|
def partitions
|
@@ -180,22 +180,28 @@ module Masamune::Schema
|
|
180
180
|
end
|
181
181
|
|
182
182
|
def denormalized_columns
|
183
|
+
return to_enum(__method__).to_a.flatten.compact unless block_given?
|
183
184
|
columns.map do |_, column|
|
184
185
|
next if column.surrogate_key || column.ignore
|
185
186
|
if column.reference
|
186
|
-
column.reference.natural_keys.any? ? column.reference.natural_keys : column.reference.denormalized_columns
|
187
|
+
(column.reference.natural_keys.any? ? column.reference.natural_keys : column.reference.denormalized_columns).each do |join_column|
|
188
|
+
yield [column.reference, join_column]
|
189
|
+
end
|
187
190
|
else
|
188
|
-
column
|
191
|
+
yield [nil, column]
|
189
192
|
end
|
190
|
-
end
|
193
|
+
end
|
191
194
|
end
|
192
195
|
|
193
196
|
def denormalized_column_names
|
194
|
-
|
197
|
+
return to_enum(__method__).to_a unless block_given?
|
198
|
+
denormalized_columns do |reference, column|
|
195
199
|
if column.parent == self
|
196
|
-
column.name.to_s
|
200
|
+
yield column.name.to_s
|
201
|
+
elsif reference
|
202
|
+
yield [reference.id, column.name].compact.join('.')
|
197
203
|
else
|
198
|
-
[column.parent.id, column.name].join('.')
|
204
|
+
yield [column.parent.id, column.name].compact.join('.')
|
199
205
|
end
|
200
206
|
end
|
201
207
|
end
|
@@ -247,6 +253,24 @@ module Masamune::Schema
|
|
247
253
|
Integer('0x' + Digest::MD5.hexdigest(name)) % (1 << 63)
|
248
254
|
end
|
249
255
|
|
256
|
+
def auto_surrogate_keys
|
257
|
+
columns.values.select { |column| column.reference && column.reference.surrogate_key.auto }.uniq.compact
|
258
|
+
end
|
259
|
+
|
260
|
+
def foreign_key_constraints
|
261
|
+
return [] if temporary?
|
262
|
+
foreign_key_columns.map do |column|
|
263
|
+
if column.reference.auto_surrogate_keys == auto_surrogate_keys
|
264
|
+
column_names = [*column.reference.auto_surrogate_keys.map(&:name), column.name].compact
|
265
|
+
reference_column_names = [*column.reference.auto_surrogate_keys.map(&:name), column.reference.surrogate_key.name].compact
|
266
|
+
else
|
267
|
+
column_names = [column.name]
|
268
|
+
reference_column_names = [column.reference.surrogate_key.name]
|
269
|
+
end
|
270
|
+
[short_md5(column_names), column_names, column.reference.name, reference_column_names]
|
271
|
+
end.compact
|
272
|
+
end
|
273
|
+
|
250
274
|
private
|
251
275
|
|
252
276
|
def stage_table_columns(parent, selected = [], inherit = true)
|
@@ -291,18 +315,22 @@ module Masamune::Schema
|
|
291
315
|
reference.unreserved_columns.each do |_, column|
|
292
316
|
next if column.surrogate_key
|
293
317
|
next if column.ignore
|
294
|
-
initialize_column! id: column.id, type: column.type, reference: reference, default: reference.default,
|
318
|
+
initialize_column! id: column.id, type: column.type, reference: reference, default: reference.default, null: reference.null, natural_key: reference.natural_key
|
295
319
|
end
|
296
320
|
elsif reference.foreign_key
|
297
321
|
# FIXME column.reference should point to reference.surrogate_key, only allow column references to Columns
|
298
|
-
initialize_column! id: reference.foreign_key_name, type: reference.foreign_key_type, reference: reference, default: reference.default,
|
322
|
+
initialize_column! id: reference.foreign_key_name, type: reference.foreign_key_type, reference: reference, default: reference.default, null: reference.null, natural_key: reference.natural_key
|
299
323
|
end
|
300
324
|
end
|
301
325
|
end
|
302
326
|
|
303
|
-
def initialize_column!(
|
304
|
-
column =
|
305
|
-
|
327
|
+
def initialize_column!(column_or_options)
|
328
|
+
column = column_or_options.is_a?(Column) ? column_or_options.dup : Column.new(column_or_options.merge(parent: self))
|
329
|
+
column_key = column.name.to_sym
|
330
|
+
@columns[column_key] = column
|
331
|
+
@columns[column_key].parent = self
|
332
|
+
@columns[column_key].index += [column_key, :natural] if column.natural_key
|
333
|
+
@columns[column_key].unique << :natural if column.natural_key
|
306
334
|
end
|
307
335
|
|
308
336
|
def index_column_map
|
@@ -311,9 +339,10 @@ module Masamune::Schema
|
|
311
339
|
columns.each do |_, column|
|
312
340
|
column.index.each do |index|
|
313
341
|
map[index] << column.name
|
342
|
+
map[index].uniq!
|
314
343
|
end
|
315
344
|
end
|
316
|
-
Hash[map.sort_by { |k, v| v.length }]
|
345
|
+
Hash[map.sort_by { |k, v| [v.length, k.to_s] }]
|
317
346
|
end
|
318
347
|
end
|
319
348
|
|
@@ -321,11 +350,14 @@ module Masamune::Schema
|
|
321
350
|
@unique_constraints_map ||= begin
|
322
351
|
map = Hash.new { |h,k| h[k] = [] }
|
323
352
|
columns.each do |_, column|
|
353
|
+
next if column.auto_reference
|
324
354
|
column.unique.each do |unique|
|
355
|
+
map[unique] += auto_surrogate_keys.map(&:name)
|
325
356
|
map[unique] << column.name
|
357
|
+
map[unique].uniq!
|
326
358
|
end
|
327
359
|
end unless temporary?
|
328
|
-
Hash[map.sort_by { |k, v| v.length }]
|
360
|
+
Hash[map.sort_by { |k, v| [v.length, k.to_s] }]
|
329
361
|
end
|
330
362
|
end
|
331
363
|
|
@@ -334,7 +366,7 @@ module Masamune::Schema
|
|
334
366
|
end
|
335
367
|
|
336
368
|
def short_md5(*a)
|
337
|
-
Digest::MD5.hexdigest(a.join('_'))[0..6]
|
369
|
+
Digest::MD5.hexdigest(a.compact.sort.uniq.join('_'))[0..6]
|
338
370
|
end
|
339
371
|
end
|
340
372
|
end
|
@@ -31,6 +31,7 @@ module Masamune::Schema
|
|
31
31
|
natural_key: false,
|
32
32
|
denormalize: false,
|
33
33
|
multiple: false,
|
34
|
+
through: [],
|
34
35
|
degenerate: false
|
35
36
|
}
|
36
37
|
|
@@ -72,5 +73,9 @@ module Masamune::Schema
|
|
72
73
|
default_row.name(column)
|
73
74
|
end
|
74
75
|
end
|
76
|
+
|
77
|
+
def through=(columns)
|
78
|
+
@through = Array.wrap(columns)
|
79
|
+
end
|
75
80
|
end
|
76
81
|
end
|
@@ -0,0 +1,58 @@
|
|
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
|
+
require 'masamune'
|
24
|
+
require 'thor'
|
25
|
+
|
26
|
+
module Masamune::Tasks
|
27
|
+
class DumpThor < Thor
|
28
|
+
include Masamune::Thor
|
29
|
+
include Masamune::Transform::DefineSchema
|
30
|
+
|
31
|
+
# FIXME need to add an unnecessary namespace until this issue is fixed:
|
32
|
+
# https://github.com/wycats/thor/pull/247
|
33
|
+
namespace :dump
|
34
|
+
skip_lock!
|
35
|
+
|
36
|
+
desc 'dump', 'Dump schema'
|
37
|
+
method_option :type, :enum => ['psql', 'hql'], :desc => 'Schema type', :default => 'psql'
|
38
|
+
method_option :with_index, :type => :boolean, :desc => 'Dump schema with indexes', :default => true
|
39
|
+
method_option :with_foreign_key, :type => :boolean, :desc => 'Dump schema with foreign key constraints', :default => true
|
40
|
+
method_option :with_unique_constraint, :type => :boolean, :desc => 'Dump schema with uniqueness constraints', :default => true
|
41
|
+
def dump_exec
|
42
|
+
print_catalog
|
43
|
+
exit
|
44
|
+
end
|
45
|
+
default_task :dump_exec
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def print_catalog
|
50
|
+
case options[:type]
|
51
|
+
when 'psql'
|
52
|
+
puts define_schema(catalog, :postgres, options.slice(:with_index, :with_foreign_key, :with_unique_constraint).to_h.symbolize_keys)
|
53
|
+
when 'hql'
|
54
|
+
puts define_schema(catalog, :hive)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -28,7 +28,6 @@ module Masamune::Tasks
|
|
28
28
|
class ShellThor < Thor
|
29
29
|
include Masamune::Thor
|
30
30
|
include Masamune::Actions::DataFlow
|
31
|
-
include Masamune::Transform::DefineSchema
|
32
31
|
|
33
32
|
# FIXME need to add an unnecessary namespace until this issue is fixed:
|
34
33
|
# https://github.com/wycats/thor/pull/247
|
@@ -36,29 +35,11 @@ module Masamune::Tasks
|
|
36
35
|
skip_lock!
|
37
36
|
|
38
37
|
desc 'shell', 'Launch an interactive shell'
|
39
|
-
method_option :dump, :type => :boolean, :desc => 'Dump SQL schema', :default => false
|
40
|
-
method_option :type, :enum => ['psql', 'hql'], :desc => 'Schema type', :default => 'psql'
|
41
38
|
method_option :prompt, :desc => 'Set shell prompt', :default => 'masamune'
|
42
39
|
class_option :start, :aliases => '-a', :desc => 'Start time', default: '1 month ago'
|
43
40
|
def shell_exec
|
44
|
-
if options[:dump]
|
45
|
-
print_catalog
|
46
|
-
exit
|
47
|
-
end
|
48
|
-
|
49
41
|
Pry.start self, prompt: proc { options[:prompt] + '> ' }
|
50
42
|
end
|
51
43
|
default_task :shell_exec
|
52
|
-
|
53
|
-
private
|
54
|
-
|
55
|
-
def print_catalog
|
56
|
-
case options[:type]
|
57
|
-
when 'psql'
|
58
|
-
puts define_schema(catalog, :postgres)
|
59
|
-
when 'hql'
|
60
|
-
puts define_schema(catalog, :hive)
|
61
|
-
end
|
62
|
-
end
|
63
44
|
end
|
64
45
|
end
|