dwh 0.1.1 → 0.3.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.
@@ -24,8 +24,8 @@ extract_minute: 'MINUTE(@exp)'
24
24
  extract_year_month: 'CAST(CONCAT(YEAR(@exp), LPAD(MONTH(@exp), 2, "0")) AS UNSIGNED)'
25
25
  default_week_start_day: "sunday"
26
26
  week_start_day: "monday"
27
- sunday_week_start_day: "DATE(DATE_SUB(@exp, INTERVAL dayofweek(@exp)-1 DAY ))"
28
- monday_week_start_day: "DATE(DATE_SUB(@exp, INTERVAL dayofweek(@exp)-2 DAY ))"
27
+ sunday_week_start_day: "DATE(DATE_SUB(@exp, INTERVAL DAYOFWEEK(@exp)-1 DAY ))"
28
+ monday_week_start_day: "DATE(DATE_SUB(@exp, INTERVAL DAYOFWEEK(@exp)-2 DAY ))"
29
29
  cast: "CAST(@exp AS @type)"
30
30
 
31
31
  # string functions
@@ -1,6 +1,6 @@
1
1
 
2
2
  date_add: "(@exp + '@val @unit'::interval)"
3
- date_diff: "age(@start_exp, @end_exp)"
3
+ date_diff: "AGE(@start_exp, @end_exp)"
4
4
  date_format_sql: "TO_CHAR(@exp, '@format')"
5
5
  date_literal: "'@val'::DATE"
6
6
  date_time_literal: "'@val'::TIMESTAMP"
@@ -12,16 +12,16 @@ abbreviated_month_name_format: "Mon"
12
12
  sunday_week_start_day: "( DATE_TRUNC('WEEK', @exp + INTERVAL '1 DAY') - INTERVAL '1 DAY' )"
13
13
  monday_week_start_day: "( DATE_TRUNC('WEEK', @exp - INTERVAL '1 DAY') + INTERVAL '1 DAY' )"
14
14
 
15
- extract_year: 'extract(year from @exp)'
16
- extract_month: 'extract(month from @exp)'
17
- extract_quarter: 'extract(quarter from @exp)'
18
- extract_day_of_year: 'extract(DOY from @exp)'
19
- extract_day_of_month: 'extract(DAY from @exp)'
20
- extract_day_of_week: 'extract(DOW from @exp)'
21
- extract_week_of_year: 'extract(WEEK from @exp)'
22
- extract_hour: 'extract(HOUR from @exp)'
23
- extract_minute: 'extract(MINUTE from @exp)'
24
- extract_year_month: "cast((extract(year from @exp)::varchar || TO_CHAR(@exp, 'MM')) as integer)"
15
+ extract_year: 'EXTRACT(year from @exp)'
16
+ extract_month: 'EXTRACT(month from @exp)'
17
+ extract_quarter: 'EXTRACT(quarter from @exp)'
18
+ extract_day_of_year: 'EXTRACT(DOY from @exp)'
19
+ extract_day_of_month: 'EXTRACT(DAY from @exp)'
20
+ extract_day_of_week: 'EXTRACT(DOW from @exp)'
21
+ extract_week_of_year: 'EXTRACT(WEEK from @exp)'
22
+ extract_hour: 'EXTRACT(HOUR from @exp)'
23
+ extract_minute: 'EXTRACT(MINUTE from @exp)'
24
+ extract_year_month: "CAST((EXTRACT(YEAR FROM @exp)::varchar || TO_CHAR(@exp, 'MM')) as INTEGER)"
25
25
 
26
26
  cast: "@exp::@type"
27
27
 
@@ -1,28 +1,19 @@
1
-
2
- # quotes and string lit
3
- quote: "\"@exp\""
4
- string_literal: "'@exp'"
5
-
6
1
  # Date Literal Formats
7
- date_format: "%Y-%m-%d"
8
- date_time_format: "%Y-%m-%d %H:%M:%S"
9
- date_time_tz_format: "%Y-%m-%d %H:%M:%S %Z"
10
- date_type: "string" # alternative is int, integer, dateint
11
2
  day_name_format: "Day"
12
3
  abbreviated_day_name_format: "Dy"
13
4
  month_name_format: "Month"
14
5
  abbreviated_month_name_format: "Mon"
15
6
 
16
7
  # Date functions patterns
17
- current_date: "current_date"
18
- current_time: "current_time"
19
- current_timestamp: "current_timestamp"
20
- truncate_date: "date_trunc('@unit', @exp)"
21
- date_add: "dateadd(@unit, @val, @exp)"
22
- date_diff: "datediff(@unit, @start_exp, @end_exp)"
8
+ current_date: "CURRENT_DATE"
9
+ current_time: "CURRENT_TIME"
10
+ current_timestamp: "CURRENT_TIMESTAMP"
11
+ truncate_date: "DATE_TRUNC('@unit', @exp)"
12
+ date_add: "DATEADD(@unit, @val, @exp)"
13
+ date_diff: "DATEDIFF(@unit, @start_exp, @end_exp)"
23
14
  date_format_sql: "TO_CHAR(@exp, '@format')"
24
- date_literal: "'@val'"
25
- date_time_literal: "TIMESTAMP '@val'"
15
+ date_literal: "'@val'::DATE"
16
+ date_time_literal: "'@val'::TIMESTAMP"
26
17
  extract_year: 'EXTRACT(YEAR FROM @exp)'
27
18
  extract_month: 'EXTRACT(MONTH FROM @exp)'
28
19
  extract_quarter: 'EXTRACT(QUARTER FROM @exp)'
@@ -33,15 +24,15 @@ extract_week_of_year: 'EXTRACT(WEEK FROM @exp)'
33
24
  extract_hour: 'EXTRACT(HOUR FROM @exp)'
34
25
  extract_minute: 'EXTRACT(MINUTE FROM @exp)'
35
26
  extract_year_month: "TO_CHAR(@exp, 'YYYYMM')::INTEGER"
36
- default_week_start_day: "sunday" # Redshift uses Sunday as default
37
- week_start_day: "sunday"
38
- sunday_week_start_day: "DATEADD(day, -1, DATE_TRUNC(WEEK, DATEADD(DAY, 1, @exp)))"
39
- monday_week_start_day: "DATEADD(day, 1, DATE_TRUNC(WEEK, DATEADD(day, -1, @exp)))"
27
+ default_week_start_day: "monday" # Redshift uses Sunday as default
28
+ week_start_day: "monday"
29
+ sunday_week_start_day: "DATEADD(day, -1, DATE_TRUNC('WEEK', DATEADD(DAY, 1, @exp)))"
30
+ monday_week_start_day: "DATEADD(day, 1, DATE_TRUNC('WEEK', DATEADD(day, -1, @exp)))"
40
31
 
41
32
  # string functions
42
- trim: "trim(@exp)"
43
- lower_case: "lower(@exp)"
44
- upper_case: "upper(@exp)"
33
+ trim: "TRIM(@exp)"
34
+ lower_case: "LOWER(@exp)"
35
+ upper_case: "UPPER(@exp)"
45
36
 
46
37
  # null handling
47
38
  if_null: "COALESCE(@exp, @when_null)"
@@ -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: "current_date()"
14
- current_time: "current_time()"
15
- current_timestamp: "current_timestamp()"
13
+ current_date: "CURRENT_DATE()"
14
+ current_time: "CURRENT_TIME()"
15
+ current_timestamp: "CURRENT_TIMESTAMP()"
16
16
 
17
- date_add: "dateadd(@unit, @val, @exp)"
18
- date_diff: "datediff(@unit, @start_exp, @end_exp)"
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: 'year(@exp)'
23
- extract_month: 'month(@exp)'
24
- extract_quarter: 'quarter(@exp)'
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: 'day(@exp)'
26
+ extract_day_of_month: 'DAY(@exp)'
27
27
  extract_day_of_week: 'DAYOFWEEK(@exp)'
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)'
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: "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)))"
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.symbolize_keys!
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.demodulize.downcase
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.symbolize_keys!
93
+ metadata.transform_keys!(&:to_sym)
86
94
 
87
- stats = TableStats.new(**metadata[:stats].symbolize_keys) if metadata.key?(: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.symbolize_keys!
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DWH
4
- VERSION = '0.1.1'
4
+ VERSION = '0.3.0'
5
5
  end
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,10 @@ 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'
21
+ require_relative 'dwh/adapters/databricks'
23
22
 
24
23
  # DWH encapsulates the full functionality of this gem.
25
24
  #
@@ -48,7 +47,10 @@ module DWH
48
47
  register(:mysql, Adapters::MySql)
49
48
  register(:sqlserver, Adapters::SqlServer)
50
49
  register(:duckdb, Adapters::DuckDb)
50
+ register(:sqlite, Adapters::Sqlite)
51
51
  register(:athena, Adapters::Athena)
52
+ register(:redshift, Adapters::Redshift)
53
+ register(:databricks, Adapters::Databricks)
52
54
 
53
55
  # start_reaper
54
56
  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.1.1
4
+ version: 0.3.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
@@ -168,13 +154,16 @@ files:
168
154
  - lib/dwh.rb
169
155
  - lib/dwh/adapters.rb
170
156
  - lib/dwh/adapters/athena.rb
157
+ - lib/dwh/adapters/databricks.rb
171
158
  - lib/dwh/adapters/druid.rb
172
159
  - lib/dwh/adapters/duck_db.rb
173
160
  - lib/dwh/adapters/my_sql.rb
174
161
  - lib/dwh/adapters/open_authorizable.rb
175
162
  - lib/dwh/adapters/postgres.rb
163
+ - lib/dwh/adapters/redshift.rb
176
164
  - lib/dwh/adapters/snowflake.rb
177
165
  - lib/dwh/adapters/sql_server.rb
166
+ - lib/dwh/adapters/sqlite.rb
178
167
  - lib/dwh/adapters/trino.rb
179
168
  - lib/dwh/behaviors.rb
180
169
  - lib/dwh/capabilities.rb
@@ -197,6 +186,7 @@ files:
197
186
  - lib/dwh/settings/postgres.yml
198
187
  - lib/dwh/settings/redshift.yml
199
188
  - lib/dwh/settings/snowflake.yml
189
+ - lib/dwh/settings/sqlite.yml
200
190
  - lib/dwh/settings/sqlserver.yml
201
191
  - lib/dwh/settings/trino.yml
202
192
  - lib/dwh/streaming_stats.rb
@@ -225,7 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
215
  - !ruby/object:Gem::Version
226
216
  version: '0'
227
217
  requirements: []
228
- rubygems_version: 3.7.1
218
+ rubygems_version: 3.6.9
229
219
  specification_version: 4
230
220
  summary: Data warehouse adapters for interacting with popular data warehouses.
231
221
  test_files: []