redshift_connector 8.0.0 → 8.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6dfd6aa65bfc44fca5d3e0dc7e042911344be4213764e267136f7259b3529a90
4
- data.tar.gz: f12016b3044c1199e0b0e3bba4c8e8826e6a72b80d40088d849110dd4624607f
3
+ metadata.gz: 9ceccb9545b9d59e71696a1adc38413e7685f1ea191805200f08d47ae2b301eb
4
+ data.tar.gz: 8e0c019d98d823b59614f02b14dd6b47e5b9adbe5483923269091f895b818a78
5
5
  SHA512:
6
- metadata.gz: 68e8a3265255b168cbb40b1b200902922fb9641035533cf561ab69feee1d825d15dd999f3d0fb9dfbfc0b00349be662d713c1ca5ac3da418d49c44ad03771e20
7
- data.tar.gz: 59cf47cc0aaec30d8025497dc11347904d50f9be8a5e68086d9c2952f773619b27be3c8ed5edf8a9f6708afe370ba1dfac7cb48c1602c7cbbb23d33e0457b054
6
+ metadata.gz: 76dda7e7a2fb23794fb056bf0aaa81aff5ecbb3d98bb46b70903de6ceb68d51073597baceeefac88fa9a4ed04df100a4ebec1b5e2cee23eeeed7a485ba7a992b
7
+ data.tar.gz: ec3ac1e0fb7416cd5c6216ee5b3df9c8c0bb6a4e28383effc99607bbba564f22aee2c7d025fcd7518d69165ec2599fbc2090e8c08c523e983f8f7fe0776838fd
data/RELEASE.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Release Note
2
2
 
3
+ ## version 8.1.3
4
+ - [fix] Mishandling time zone for timestamp type.
5
+
6
+ ## version 8.1.2
7
+ - [new] Add type cast option instead of filter option for #transport_delta and #transport_all.
8
+
9
+ ## version 8.1.1
10
+ - [fix] Boolean type cast was reverse.
11
+
12
+ ## version 8.1.0
13
+
14
+ - [new] Add type cast option for queuery.
15
+
16
+ ## version 8.0.1
17
+
18
+ - [fix] Loosen pg version restriction to allow >0.18 to support Rails 5.
19
+ Note that Redshift is PostgreSQL 8 compatible and pg >0.18 does not support PostgreSQL 8.
20
+ Now you can use any version of pg and most version of pg works with Redshift, but you must take a risk.
21
+
3
22
  ## version 8.0.0
4
23
 
5
24
  - [INCOMPATIBLE] This library is renamed to "redshift_connector". Just modify your Gemfile from "redshift-connector" to "redshift_connector".
@@ -4,7 +4,8 @@ require 'redshift_connector/logger'
4
4
 
5
5
  module RedshiftConnector
6
6
  class ActiveRecordExporter
7
- def initialize(ds:, query:, bundle_params:, enable_sort: false, logger: RedshiftConnector.logger)
7
+ def initialize(ds:, query:, bundle_params:, enable_sort: false, enable_cast: false, logger: RedshiftConnector.logger)
8
+ raise ArgumentError, "ActiveRecordExporter does not support type cast" if enable_cast
8
9
  @ds = ds
9
10
  @query = query
10
11
  @bundle_params = bundle_params
@@ -49,13 +49,17 @@ module RedshiftConnector
49
49
  upsert_columns: nil,
50
50
  bucket: nil,
51
51
  txn_id: nil,
52
- filter:,
52
+ filter: nil,
53
+ enable_cast: false,
53
54
  logger: RedshiftConnector.logger,
54
55
  quiet: false
55
56
  )
56
57
  unless src_table and dest_table
57
58
  raise ArgumentError, "missing :table, :src_table or :dest_table"
58
59
  end
60
+ raise ArgumentError, "filter and enable_cast are exclusive" if filter and enable_cast
61
+ raise ArgumentError, "either filter or enable_cast is required" unless filter or enable_cast
62
+
59
63
  logger = NullLogger.new if quiet
60
64
  bundle_params = DataFileBundleParams.new(
61
65
  bucket: bucket,
@@ -70,6 +74,7 @@ module RedshiftConnector
70
74
  table: src_table,
71
75
  columns: columns,
72
76
  condition: condition,
77
+ enable_cast: enable_cast,
73
78
  logger: logger
74
79
  )
75
80
  importer = Importer.for_delta_upsert(
@@ -119,10 +124,14 @@ module RedshiftConnector
119
124
  columns:,
120
125
  bucket: nil,
121
126
  txn_id: nil,
122
- filter:,
127
+ filter: nil,
128
+ enable_cast: false,
123
129
  logger: RedshiftConnector.logger,
124
130
  quiet: false
125
131
  )
132
+ raise ArgumentError, "filter and enable_cast are exclusive" if filter and enable_cast
133
+ raise ArgumentError, "either filter or enable_cast is required" unless filter or enable_cast
134
+
126
135
  logger = NullLogger.new if quiet
127
136
  bundle_params = DataFileBundleParams.new(
128
137
  bucket: bucket,
@@ -136,6 +145,7 @@ module RedshiftConnector
136
145
  schema: schema,
137
146
  table: src_table,
138
147
  columns: columns,
148
+ enable_cast: enable_cast,
139
149
  logger: logger
140
150
  )
141
151
  importer = Importer.for_rebuild(
@@ -1,4 +1,5 @@
1
1
  require 'redshift_connector/logger'
2
+ require 'redshift_connector/redshift_data_type'
2
3
  require 'forwardable'
3
4
 
4
5
  module RedshiftConnector
@@ -22,7 +23,14 @@ module RedshiftConnector
22
23
 
23
24
  def each_row(&block)
24
25
  each_object do |obj|
25
- obj.each_row(&block)
26
+ if @bundle.respond_to?(:has_manifest?) && @bundle.has_manifest?
27
+ obj.each_row do |row|
28
+ yield RedshiftDataType.type_cast(row, @bundle.manifest_file)
29
+ end
30
+ else
31
+ obj.each_row(&block)
32
+ end
33
+
26
34
  end
27
35
  end
28
36
 
@@ -68,5 +76,6 @@ module RedshiftConnector
68
76
  yield buf unless buf.empty?
69
77
  end
70
78
  private :do_each_batch
79
+
71
80
  end
72
81
  end
@@ -8,14 +8,14 @@ module RedshiftConnector
8
8
  @exporter_class = exporter_class
9
9
  end
10
10
 
11
- def build_for_table_delta(schema:, table:, condition:, columns:, bundle_params:, logger: RedshiftConnector.logger)
11
+ def build_for_table_delta(schema:, table:, condition:, columns:, enable_cast:, bundle_params:, logger: RedshiftConnector.logger)
12
12
  query = DeltaQuery.new(schema: schema, table: table, columns: columns, condition: condition)
13
- @exporter_class.new(ds: @ds, query: query, bundle_params: bundle_params, logger: logger)
13
+ @exporter_class.new(ds: @ds, query: query, bundle_params: bundle_params, enable_cast: enable_cast, logger: logger)
14
14
  end
15
15
 
16
- def build_for_table(schema:, table:, columns:, bundle_params:, logger: RedshiftConnector.logger)
16
+ def build_for_table(schema:, table:, columns:, enable_cast:, bundle_params:, logger: RedshiftConnector.logger)
17
17
  query = SelectAllQuery.new(schema: schema, table: table, columns: columns)
18
- @exporter_class.new(ds: @ds, query: query, bundle_params: bundle_params, logger: logger)
18
+ @exporter_class.new(ds: @ds, query: query, bundle_params: bundle_params, enable_cast: enable_cast, logger: logger)
19
19
  end
20
20
 
21
21
  def build_for_query(
@@ -23,8 +23,10 @@ module RedshiftConnector
23
23
  table:,
24
24
  bucket: nil,
25
25
  query:,
26
+ query_params: [],
26
27
  txn_id: "#{Time.now.strftime('%Y%m%d_%H%M%S')}_#{$$}",
27
28
  enable_sort: false,
29
+ enable_cast: false,
28
30
  logger: RedshiftConnector.logger,
29
31
  quiet: false
30
32
  )
@@ -39,8 +41,10 @@ module RedshiftConnector
39
41
  @exporter_class.new(
40
42
  ds: @ds,
41
43
  query: ArbitraryQuery.new(query),
44
+ query_params: query_params,
42
45
  bundle_params: bundle_params,
43
46
  enable_sort: enable_sort,
47
+ enable_cast: enable_cast,
44
48
  logger: logger
45
49
  )
46
50
  end
@@ -0,0 +1,38 @@
1
+
2
+ module RedshiftConnector
3
+ module RedshiftDataType
4
+ FALSE_VALUES = [
5
+ false, 0,
6
+ "0", :"0",
7
+ "f", :f,
8
+ "F", :F,
9
+ "false", :false,
10
+ "FALSE", :FALSE,
11
+ "off", :off,
12
+ "OFF", :OFF,
13
+ ].to_set.freeze
14
+
15
+ def self.type_cast(row, manifest_file)
16
+ row.zip(manifest_file.column_types).map do |value, type|
17
+ next nil if (value == '' and type != 'character varing') # null becomes '' on unload
18
+
19
+ case type
20
+ when 'smallint', 'integer', 'bigint'
21
+ value.to_i
22
+ when 'numeric', 'double precision'
23
+ value.to_f
24
+ when 'character', 'character varying'
25
+ value
26
+ when 'timestamp without time zone', 'timestamp with time zone'
27
+ value # Ruby does not have a class without timezone
28
+ when 'date'
29
+ Date.parse(value)
30
+ when 'boolean'
31
+ FALSE_VALUES.include?(value) ? false : true
32
+ else
33
+ raise "not support data type: #{type}"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,3 +1,3 @@
1
1
  module RedshiftConnector
2
- VERSION = '8.0.0'
2
+ VERSION = '8.1.3'
3
3
  end
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.required_ruby_version = '>= 2.1.0'
19
19
  s.add_dependency 'activerecord'
20
20
  s.add_dependency 'activerecord-redshift'
21
- s.add_dependency 'pg', '~> 0.18.0'
21
+ s.add_dependency 'pg', '>= 0.18.0'
22
22
  s.add_dependency 'activerecord-import'
23
23
  s.add_dependency 'redshift_csv_file', '~> 1.0'
24
24
  s.add_dependency 'aws-sdk-s3', '~> 1.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redshift_connector
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.0.0
4
+ version: 8.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Minero Aoki
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-23 00:00:00.000000000 Z
11
+ date: 2021-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -42,14 +42,14 @@ dependencies:
42
42
  name: pg
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: 0.18.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.18.0
55
55
  - !ruby/object:Gem::Dependency
@@ -159,6 +159,7 @@ files:
159
159
  - lib/redshift_connector/reader/exception.rb
160
160
  - lib/redshift_connector/reader/redshift_csv.rb
161
161
  - lib/redshift_connector/reader/tsv.rb
162
+ - lib/redshift_connector/redshift_data_type.rb
162
163
  - lib/redshift_connector/s3_bucket.rb
163
164
  - lib/redshift_connector/s3_data_file.rb
164
165
  - lib/redshift_connector/s3_data_file_bundle.rb
@@ -168,7 +169,7 @@ homepage: https://github.com/bricolages/redshift_connector
168
169
  licenses:
169
170
  - MIT
170
171
  metadata: {}
171
- post_install_message:
172
+ post_install_message:
172
173
  rdoc_options: []
173
174
  require_paths:
174
175
  - lib
@@ -183,8 +184,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
184
  - !ruby/object:Gem::Version
184
185
  version: '0'
185
186
  requirements: []
186
- rubygems_version: 3.0.3
187
- signing_key:
187
+ rubygems_version: 3.1.6
188
+ signing_key:
188
189
  specification_version: 4
189
190
  summary: Redshift bulk data connector
190
191
  test_files: []