dwh 0.1.0 → 0.2.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/CHANGELOG.md +31 -0
- data/README.md +15 -5
- data/Rakefile +1 -1
- data/docs/DWH/Adapters/Adapter.html +33 -27
- data/docs/DWH/Adapters/Athena.html +25 -21
- data/docs/DWH/Adapters/Boolean.html +1 -1
- data/docs/DWH/Adapters/Druid.html +18 -12
- data/docs/DWH/Adapters/DuckDb.html +29 -27
- data/docs/DWH/Adapters/MySql.html +25 -19
- data/docs/DWH/Adapters/OpenAuthorizable/ClassMethods.html +3 -6
- data/docs/DWH/Adapters/OpenAuthorizable.html +5 -10
- data/docs/DWH/Adapters/Postgres.html +27 -23
- data/docs/DWH/Adapters/Snowflake.html +39 -24
- data/docs/DWH/Adapters/SqlServer.html +27 -25
- data/docs/DWH/Adapters/Trino.html +30 -30
- data/docs/DWH/Adapters.html +1 -1
- data/docs/DWH/AuthenticationError.html +1 -1
- data/docs/DWH/Behaviors.html +6 -11
- data/docs/DWH/Capabilities.html +10 -26
- data/docs/DWH/Column.html +7 -15
- data/docs/DWH/ConfigError.html +1 -1
- data/docs/DWH/ConnectionError.html +1 -1
- data/docs/DWH/DWHError.html +1 -1
- data/docs/DWH/ExecutionError.html +1 -1
- data/docs/DWH/Factory.html +1 -1
- data/docs/DWH/Functions/Arrays.html +8 -8
- data/docs/DWH/Functions/Dates.html +5 -7
- data/docs/DWH/Functions/ExtractDatePart.html +13 -25
- data/docs/DWH/Functions/Nulls.html +3 -3
- data/docs/DWH/Functions.html +6 -9
- data/docs/DWH/Logger.html +3 -5
- data/docs/DWH/OAuthError.html +1 -1
- data/docs/DWH/Settings.html +6 -9
- data/docs/DWH/StreamingStats.html +2 -3
- data/docs/DWH/Table.html +14 -26
- data/docs/DWH/TableStats.html +1 -1
- data/docs/DWH/TokenExpiredError.html +1 -1
- data/docs/DWH/UnsupportedCapability.html +1 -1
- data/docs/DWH.html +1 -1
- data/docs/_index.html +1 -1
- data/docs/file.README.html +43 -48
- data/docs/file.adapters.html +318 -343
- data/docs/file.creating-adapters.html +347 -357
- data/docs/file.getting-started.html +143 -151
- data/docs/file.usage.html +257 -278
- data/docs/guides/adapters.md +158 -0
- data/docs/guides/getting-started.md +6 -1
- data/docs/guides/usage.md +33 -1
- data/docs/index.html +43 -48
- data/docs/top-level-namespace.html +1 -1
- data/lib/dwh/adapters/duck_db.rb +1 -1
- data/lib/dwh/adapters/postgres.rb +4 -4
- data/lib/dwh/adapters/redshift.rb +48 -0
- data/lib/dwh/adapters/sql_server.rb +1 -1
- data/lib/dwh/adapters/sqlite.rb +364 -0
- data/lib/dwh/adapters.rb +5 -5
- data/lib/dwh/column.rb +12 -1
- data/lib/dwh/functions/dates.rb +15 -0
- data/lib/dwh/settings/databricks.yml +13 -13
- data/lib/dwh/settings/druid.yml +3 -3
- data/lib/dwh/settings/duckdb.yml +2 -2
- data/lib/dwh/settings/mysql.yml +2 -2
- data/lib/dwh/settings/postgres.yml +11 -11
- data/lib/dwh/settings/redshift.yml +15 -24
- data/lib/dwh/settings/snowflake.yml +15 -15
- data/lib/dwh/settings/sqlite.yml +42 -0
- data/lib/dwh/settings.rb +6 -2
- data/lib/dwh/table.rb +18 -10
- data/lib/dwh/version.rb +1 -1
- data/lib/dwh.rb +4 -4
- metadata +5 -16
|
@@ -10,29 +10,29 @@ month_name_format: "MMMM"
|
|
|
10
10
|
abbreviated_month_name_format: "MON"
|
|
11
11
|
|
|
12
12
|
# Date functions patterns
|
|
13
|
-
current_date: "
|
|
14
|
-
current_time: "
|
|
15
|
-
current_timestamp: "
|
|
13
|
+
current_date: "CURRENT_DATE()"
|
|
14
|
+
current_time: "CURRENT_TIME()"
|
|
15
|
+
current_timestamp: "CURRENT_TIMESTAMP()"
|
|
16
16
|
|
|
17
|
-
date_add: "
|
|
18
|
-
date_diff: "
|
|
17
|
+
date_add: "DATEADD(@unit, @val, @exp)"
|
|
18
|
+
date_diff: "DATEDIFF(@unit, @start_exp, @end_exp)"
|
|
19
19
|
date_format_sql: "TO_VARCHAR(@exp, '@format')"
|
|
20
20
|
date_literal: "'@val'::DATE"
|
|
21
21
|
date_time_literal: "'@val'::TIMESTAMP"
|
|
22
|
-
extract_year: '
|
|
23
|
-
extract_month: '
|
|
24
|
-
extract_quarter: '
|
|
22
|
+
extract_year: 'YEAR(@exp)'
|
|
23
|
+
extract_month: 'MONTH(@exp)'
|
|
24
|
+
extract_quarter: 'QUARTER(@exp)'
|
|
25
25
|
extract_day_of_year: 'DAYOFYEAR(@exp)'
|
|
26
|
-
extract_day_of_month: '
|
|
26
|
+
extract_day_of_month: 'DAY(@exp)'
|
|
27
27
|
extract_day_of_week: 'DAYOFWEEK(@exp)'
|
|
28
|
-
extract_week_of_year: '
|
|
29
|
-
extract_hour: '
|
|
30
|
-
extract_minute: '
|
|
31
|
-
extract_year_month: '
|
|
28
|
+
extract_week_of_year: 'WEEK(@exp)'
|
|
29
|
+
extract_hour: 'HOUR(@exp)'
|
|
30
|
+
extract_minute: 'MINUTE(@exp)'
|
|
31
|
+
extract_year_month: 'CAST((TO_VARCHAR(@exp, ''YYYY'') || TO_VARCHAR(@exp, ''MM'')) as integer)'
|
|
32
32
|
default_week_start_day: "monday"
|
|
33
33
|
week_start_day: "monday"
|
|
34
|
-
sunday_week_start_day: "
|
|
35
|
-
monday_week_start_day: "
|
|
34
|
+
sunday_week_start_day: "DATEADD(day, -1,DATE_TRUNC('week', DATEADD(day,1, @exp)))"
|
|
35
|
+
monday_week_start_day: "DATEADD(day, 1,DATE_TRUNC('week', DATEADD(day,-1, @exp)))"
|
|
36
36
|
|
|
37
37
|
# array operations
|
|
38
38
|
array_in_list: "ARRAY_CONTAINS(@exp, ARRAY_CONSTRUCT(@list))"
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
# Date Literal Formats
|
|
4
|
+
day_name_format: "%A"
|
|
5
|
+
abbreviated_day_name_format: "%a"
|
|
6
|
+
month_name_format: "%B"
|
|
7
|
+
abbreviated_month_name_format: "%b"
|
|
8
|
+
|
|
9
|
+
# Date functions patterns
|
|
10
|
+
# SQLite uses strftime for most date operations
|
|
11
|
+
date_add: "datetime(@exp, '+@val @unit')"
|
|
12
|
+
date_diff: "CAST((julianday(@end_exp) - julianday(@start_exp)) AS INTEGER)"
|
|
13
|
+
date_format_sql: "strftime('@format', @exp)"
|
|
14
|
+
extract_year: "CAST(strftime('%Y', @exp) AS INTEGER)"
|
|
15
|
+
extract_month: "CAST(strftime('%m', @exp) AS INTEGER)"
|
|
16
|
+
extract_quarter: "CAST(((strftime('%m', @exp) - 1) / 3) + 1 AS INTEGER)"
|
|
17
|
+
extract_day_of_year: "CAST(strftime('%j', @exp) AS INTEGER)"
|
|
18
|
+
extract_day_of_month: "CAST(strftime('%d', @exp) AS INTEGER)"
|
|
19
|
+
extract_day_of_week: "CAST(strftime('%w', @exp) AS INTEGER)"
|
|
20
|
+
extract_week_of_year: "CAST(strftime('%W', @exp) AS INTEGER)"
|
|
21
|
+
extract_hour: "CAST(strftime('%H', @exp) AS INTEGER)"
|
|
22
|
+
extract_minute: "CAST(strftime('%M', @exp) AS INTEGER)"
|
|
23
|
+
extract_year_month: "CAST(strftime('%Y%m', @exp) AS INTEGER)"
|
|
24
|
+
default_week_start_day: "monday"
|
|
25
|
+
week_start_day: "monday"
|
|
26
|
+
sunday_week_start_day: "date(@exp, '-' || strftime('%w', @exp) || ' days')"
|
|
27
|
+
monday_week_start_day: "date(@exp, '-' || ((CAST(strftime('%w', @exp) AS INTEGER) + 6) % 7) || ' days')"
|
|
28
|
+
|
|
29
|
+
cast: "CAST(@exp AS @type)"
|
|
30
|
+
|
|
31
|
+
# string functions
|
|
32
|
+
trim: "TRIM(@exp)"
|
|
33
|
+
lower_case: "LOWER(@exp)"
|
|
34
|
+
upper_case: "UPPER(@exp)"
|
|
35
|
+
|
|
36
|
+
# Relevant db capabilities for query gen
|
|
37
|
+
create_temp_table_template: "CREATE TEMP TABLE @table AS \n@sql"
|
|
38
|
+
|
|
39
|
+
# array operations - SQLite has limited native array support
|
|
40
|
+
# These would need JSON extension or custom implementation
|
|
41
|
+
# array_in_list: "EXISTS(SELECT 1 FROM json_each(@exp) WHERE value IN @list)"
|
|
42
|
+
# array_exclude_list: "NOT EXISTS(SELECT 1 FROM json_each(@exp) WHERE value IN @list)"
|
data/lib/dwh/settings.rb
CHANGED
|
@@ -44,7 +44,11 @@ module DWH
|
|
|
44
44
|
logger.debug "#{adapter_name} Adapter didn't have a settings YAML file. Using only base settings."
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
@adapter_settings.
|
|
47
|
+
@adapter_settings.transform_keys! do |key|
|
|
48
|
+
key.to_sym
|
|
49
|
+
rescue StandardError
|
|
50
|
+
key
|
|
51
|
+
end
|
|
48
52
|
end
|
|
49
53
|
|
|
50
54
|
# By default settings_file are expected to be in a
|
|
@@ -69,7 +73,7 @@ module DWH
|
|
|
69
73
|
end
|
|
70
74
|
|
|
71
75
|
def adapter_name
|
|
72
|
-
name.
|
|
76
|
+
name.split('::').last.downcase
|
|
73
77
|
end
|
|
74
78
|
|
|
75
79
|
def using_base_settings?
|
data/lib/dwh/table.rb
CHANGED
|
@@ -22,16 +22,16 @@ module DWH
|
|
|
22
22
|
|
|
23
23
|
@physical_name = parts.last
|
|
24
24
|
@table_stats = table_stats
|
|
25
|
-
@catalog = catalog
|
|
26
|
-
@schema = schema
|
|
25
|
+
@catalog = catalog&.strip
|
|
26
|
+
@schema = schema&.strip
|
|
27
27
|
|
|
28
|
-
@catalog = parts.first if @catalog.nil? && parts.length > 2
|
|
28
|
+
@catalog = parts.first.strip if @catalog.nil? && parts.length > 2
|
|
29
29
|
|
|
30
30
|
if @schema.nil?
|
|
31
31
|
if parts.length == 2
|
|
32
|
-
@schema = parts.first
|
|
32
|
+
@schema = parts.first.strip
|
|
33
33
|
elsif parts.length > 2
|
|
34
|
-
@schema = parts[1]
|
|
34
|
+
@schema = parts[1].strip
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
|
|
@@ -50,12 +50,20 @@ module DWH
|
|
|
50
50
|
[catalog, schema].compact.join('.')
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
+
def catalog?
|
|
54
|
+
catalog && !catalog.empty?
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def schema?
|
|
58
|
+
schema && !schema.empty?
|
|
59
|
+
end
|
|
60
|
+
|
|
53
61
|
def catalog_and_schema?
|
|
54
|
-
catalog && schema
|
|
62
|
+
catalog? && schema?
|
|
55
63
|
end
|
|
56
64
|
|
|
57
65
|
def catalog_or_schema?
|
|
58
|
-
catalog || schema
|
|
66
|
+
catalog? || schema?
|
|
59
67
|
end
|
|
60
68
|
|
|
61
69
|
def stats
|
|
@@ -82,13 +90,13 @@ module DWH
|
|
|
82
90
|
|
|
83
91
|
def self.from_hash_or_json(physical_name, metadata)
|
|
84
92
|
metadata = JSON.parse(metadata) if metadata.is_a?(String)
|
|
85
|
-
metadata.
|
|
93
|
+
metadata.transform_keys!(&:to_sym)
|
|
86
94
|
|
|
87
|
-
stats = TableStats.new(**metadata[:stats]
|
|
95
|
+
stats = TableStats.new(**metadata[:stats]&.transform_keys!(&:to_sym)) if metadata.key?(:stats)
|
|
88
96
|
table = new(physical_name, table_stats: stats)
|
|
89
97
|
|
|
90
98
|
metadata[:columns]&.each do |col|
|
|
91
|
-
col.
|
|
99
|
+
col.transform_keys!(&:to_sym)
|
|
92
100
|
table << Column.new(
|
|
93
101
|
name: col[:name],
|
|
94
102
|
data_type: col[:data_type],
|
data/lib/dwh/version.rb
CHANGED
data/lib/dwh.rb
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
require 'faraday'
|
|
2
|
-
require 'active_support/core_ext/string/inflections'
|
|
3
|
-
require 'active_support/core_ext/hash/keys'
|
|
4
|
-
require 'active_support/core_ext/object/blank'
|
|
5
|
-
require 'active_support/duration'
|
|
6
2
|
|
|
7
3
|
require_relative 'dwh/version'
|
|
8
4
|
require_relative 'dwh/errors'
|
|
@@ -19,7 +15,9 @@ require_relative 'dwh/adapters/snowflake'
|
|
|
19
15
|
require_relative 'dwh/adapters/my_sql'
|
|
20
16
|
require_relative 'dwh/adapters/sql_server'
|
|
21
17
|
require_relative 'dwh/adapters/duck_db'
|
|
18
|
+
require_relative 'dwh/adapters/sqlite'
|
|
22
19
|
require_relative 'dwh/adapters/athena'
|
|
20
|
+
require_relative 'dwh/adapters/redshift'
|
|
23
21
|
|
|
24
22
|
# DWH encapsulates the full functionality of this gem.
|
|
25
23
|
#
|
|
@@ -48,7 +46,9 @@ module DWH
|
|
|
48
46
|
register(:mysql, Adapters::MySql)
|
|
49
47
|
register(:sqlserver, Adapters::SqlServer)
|
|
50
48
|
register(:duckdb, Adapters::DuckDb)
|
|
49
|
+
register(:sqlite, Adapters::Sqlite)
|
|
51
50
|
register(:athena, Adapters::Athena)
|
|
51
|
+
register(:redshift, Adapters::Redshift)
|
|
52
52
|
|
|
53
53
|
# start_reaper
|
|
54
54
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dwh
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ajo Abraham
|
|
@@ -9,20 +9,6 @@ bindir: exe
|
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
|
-
- !ruby/object:Gem::Dependency
|
|
13
|
-
name: activesupport
|
|
14
|
-
requirement: !ruby/object:Gem::Requirement
|
|
15
|
-
requirements:
|
|
16
|
-
- - "~>"
|
|
17
|
-
- !ruby/object:Gem::Version
|
|
18
|
-
version: 8.0.2
|
|
19
|
-
type: :runtime
|
|
20
|
-
prerelease: false
|
|
21
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
-
requirements:
|
|
23
|
-
- - "~>"
|
|
24
|
-
- !ruby/object:Gem::Version
|
|
25
|
-
version: 8.0.2
|
|
26
12
|
- !ruby/object:Gem::Dependency
|
|
27
13
|
name: connection_pool
|
|
28
14
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -173,8 +159,10 @@ files:
|
|
|
173
159
|
- lib/dwh/adapters/my_sql.rb
|
|
174
160
|
- lib/dwh/adapters/open_authorizable.rb
|
|
175
161
|
- lib/dwh/adapters/postgres.rb
|
|
162
|
+
- lib/dwh/adapters/redshift.rb
|
|
176
163
|
- lib/dwh/adapters/snowflake.rb
|
|
177
164
|
- lib/dwh/adapters/sql_server.rb
|
|
165
|
+
- lib/dwh/adapters/sqlite.rb
|
|
178
166
|
- lib/dwh/adapters/trino.rb
|
|
179
167
|
- lib/dwh/behaviors.rb
|
|
180
168
|
- lib/dwh/capabilities.rb
|
|
@@ -197,6 +185,7 @@ files:
|
|
|
197
185
|
- lib/dwh/settings/postgres.yml
|
|
198
186
|
- lib/dwh/settings/redshift.yml
|
|
199
187
|
- lib/dwh/settings/snowflake.yml
|
|
188
|
+
- lib/dwh/settings/sqlite.yml
|
|
200
189
|
- lib/dwh/settings/sqlserver.yml
|
|
201
190
|
- lib/dwh/settings/trino.yml
|
|
202
191
|
- lib/dwh/streaming_stats.rb
|
|
@@ -225,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
225
214
|
- !ruby/object:Gem::Version
|
|
226
215
|
version: '0'
|
|
227
216
|
requirements: []
|
|
228
|
-
rubygems_version: 3.6.
|
|
217
|
+
rubygems_version: 3.6.9
|
|
229
218
|
specification_version: 4
|
|
230
219
|
summary: Data warehouse adapters for interacting with popular data warehouses.
|
|
231
220
|
test_files: []
|