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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/README.md +15 -5
  4. data/Rakefile +1 -1
  5. data/docs/DWH/Adapters/Adapter.html +33 -27
  6. data/docs/DWH/Adapters/Athena.html +25 -21
  7. data/docs/DWH/Adapters/Boolean.html +1 -1
  8. data/docs/DWH/Adapters/Druid.html +18 -12
  9. data/docs/DWH/Adapters/DuckDb.html +29 -27
  10. data/docs/DWH/Adapters/MySql.html +25 -19
  11. data/docs/DWH/Adapters/OpenAuthorizable/ClassMethods.html +3 -6
  12. data/docs/DWH/Adapters/OpenAuthorizable.html +5 -10
  13. data/docs/DWH/Adapters/Postgres.html +27 -23
  14. data/docs/DWH/Adapters/Snowflake.html +39 -24
  15. data/docs/DWH/Adapters/SqlServer.html +27 -25
  16. data/docs/DWH/Adapters/Trino.html +30 -30
  17. data/docs/DWH/Adapters.html +1 -1
  18. data/docs/DWH/AuthenticationError.html +1 -1
  19. data/docs/DWH/Behaviors.html +6 -11
  20. data/docs/DWH/Capabilities.html +10 -26
  21. data/docs/DWH/Column.html +7 -15
  22. data/docs/DWH/ConfigError.html +1 -1
  23. data/docs/DWH/ConnectionError.html +1 -1
  24. data/docs/DWH/DWHError.html +1 -1
  25. data/docs/DWH/ExecutionError.html +1 -1
  26. data/docs/DWH/Factory.html +1 -1
  27. data/docs/DWH/Functions/Arrays.html +8 -8
  28. data/docs/DWH/Functions/Dates.html +5 -7
  29. data/docs/DWH/Functions/ExtractDatePart.html +13 -25
  30. data/docs/DWH/Functions/Nulls.html +3 -3
  31. data/docs/DWH/Functions.html +6 -9
  32. data/docs/DWH/Logger.html +3 -5
  33. data/docs/DWH/OAuthError.html +1 -1
  34. data/docs/DWH/Settings.html +6 -9
  35. data/docs/DWH/StreamingStats.html +2 -3
  36. data/docs/DWH/Table.html +14 -26
  37. data/docs/DWH/TableStats.html +1 -1
  38. data/docs/DWH/TokenExpiredError.html +1 -1
  39. data/docs/DWH/UnsupportedCapability.html +1 -1
  40. data/docs/DWH.html +1 -1
  41. data/docs/_index.html +1 -1
  42. data/docs/file.README.html +43 -48
  43. data/docs/file.adapters.html +318 -343
  44. data/docs/file.creating-adapters.html +347 -357
  45. data/docs/file.getting-started.html +143 -151
  46. data/docs/file.usage.html +257 -278
  47. data/docs/guides/adapters.md +158 -0
  48. data/docs/guides/getting-started.md +6 -1
  49. data/docs/guides/usage.md +33 -1
  50. data/docs/index.html +43 -48
  51. data/docs/top-level-namespace.html +1 -1
  52. data/lib/dwh/adapters/duck_db.rb +1 -1
  53. data/lib/dwh/adapters/postgres.rb +4 -4
  54. data/lib/dwh/adapters/redshift.rb +48 -0
  55. data/lib/dwh/adapters/sql_server.rb +1 -1
  56. data/lib/dwh/adapters/sqlite.rb +364 -0
  57. data/lib/dwh/adapters.rb +5 -5
  58. data/lib/dwh/column.rb +12 -1
  59. data/lib/dwh/functions/dates.rb +15 -0
  60. data/lib/dwh/settings/databricks.yml +13 -13
  61. data/lib/dwh/settings/druid.yml +3 -3
  62. data/lib/dwh/settings/duckdb.yml +2 -2
  63. data/lib/dwh/settings/mysql.yml +2 -2
  64. data/lib/dwh/settings/postgres.yml +11 -11
  65. data/lib/dwh/settings/redshift.yml +15 -24
  66. data/lib/dwh/settings/snowflake.yml +15 -15
  67. data/lib/dwh/settings/sqlite.yml +42 -0
  68. data/lib/dwh/settings.rb +6 -2
  69. data/lib/dwh/table.rb +18 -10
  70. data/lib/dwh/version.rb +1 -1
  71. data/lib/dwh.rb +4 -4
  72. 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: "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.0'
4
+ VERSION = '0.2.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,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.1.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.7
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: []