table_saw 2.1.0 → 2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 50acf974664b7ae8917c8fc20aded1f23d2fcf8125534b4c8b498a08da7cb63b
4
- data.tar.gz: bbe5f9639f59cdef8b60054528786b83e88e81aa4d10a142032fb8d3342a968e
3
+ metadata.gz: 0fe94c6f653348bda1f6a069925e802d271e251d09be82b0e817d758296e5bf6
4
+ data.tar.gz: 9a6ea705f4cde2aa3c3750c28cc66ccf7a28358e113bf930151c9877e9cacb35
5
5
  SHA512:
6
- metadata.gz: 55665d3b16286ac9c726d39f2008e5f075e3e5a64d85a351cb1bf33a61fccb649895d83719889fe3fb0fce2ae9f624cfb84cf5920814edb6691e4db2d5b12183
7
- data.tar.gz: 13510d5e13ee27ca84b99e7c82bfc2709a21460d652eeb153458dcfe4157fa8ee4c285f1165244c21f807567686ec42b7a44b7edace6eb011f6e034872fa0ea7
6
+ metadata.gz: d01a1f66e7c418e8ab3f01c1ab65e6cd4f3439e00edaa9f0e39cfa144e5cbe2d8d1a7e32cf359ab228bc40bef722e5d218619dbc8d462f1115bd0e4922ba430f
7
+ data.tar.gz: f02f30fb42c96cf3a4b87a155c6a727ce703d9788e78df6aeba01f20e524309c18741c3a87ed83c3ef42983b0f3bfa7211357c934f9edbc0b64cacbf2fd715ad
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- table_saw (2.1.0)
4
+ table_saw (2.2.0)
5
+ activerecord (>= 5.2)
5
6
  pg
6
7
  thor
7
8
 
@@ -46,7 +47,7 @@ GEM
46
47
  diff-lcs (1.3)
47
48
  docile (1.3.1)
48
49
  erubi (1.8.0)
49
- i18n (1.6.0)
50
+ i18n (1.7.0)
50
51
  concurrent-ruby (~> 1.0)
51
52
  jaro_winkler (1.5.2)
52
53
  json (2.2.0)
@@ -55,7 +56,7 @@ GEM
55
56
  nokogiri (>= 1.5.9)
56
57
  method_source (0.9.2)
57
58
  mini_portile2 (2.4.0)
58
- minitest (5.11.3)
59
+ minitest (5.13.0)
59
60
  nokogiri (1.10.5)
60
61
  mini_portile2 (~> 2.4.0)
61
62
  parallel (1.17.0)
@@ -122,7 +123,6 @@ PLATFORMS
122
123
  ruby
123
124
 
124
125
  DEPENDENCIES
125
- activerecord (~> 5.2)
126
126
  bundler (~> 2.0)
127
127
  combustion (~> 1.1)
128
128
  database_cleaner (~> 1.7)
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'pg'
4
+ require 'active_record'
5
+ require 'active_record/connection_adapters/postgresql_adapter'
4
6
 
5
7
  module TableSaw
6
8
  module Connection
@@ -19,5 +21,10 @@ module TableSaw
19
21
  conn.exec(sql)
20
22
  end
21
23
  end
24
+
25
+ def self.adapter
26
+ @adapter ||=
27
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.new(nil, nil, TableSaw.configuration.connection, {})
28
+ end
22
29
  end
23
30
  end
@@ -11,7 +11,7 @@ module TableSaw
11
11
 
12
12
  def call
13
13
  associations.map do |from_column, to_table|
14
- TableSaw::DependencyGraph::AddDirective.new(to_table, ids: ids[from_column].to_a, partial: directive.partial?)
14
+ TableSaw::DependencyGraph::AddDirective.new(to_table, ids: ids[from_column], partial: directive.partial?)
15
15
  end
16
16
  end
17
17
 
@@ -22,18 +22,20 @@ module TableSaw
22
22
  end
23
23
 
24
24
  def ids
25
- @ids ||= query_result.each_with_object(Hash.new { |h, k| h[k] = Set.new }) do |row, memo|
26
- associations.each_key { |key| memo[key].add row[key] unless row[key].nil? }
25
+ @ids ||= associations.each_key.each_with_object({}) do |column, memo|
26
+ memo[column] = query_result(column).map { |row| row[column] }
27
27
  end
28
28
  end
29
29
 
30
- def query_result
30
+ def query_result(column)
31
31
  return [] unless directive.selectable?
32
32
 
33
33
  TableSaw::Connection.exec(
34
- format('select %{columns} from %{table_name} where %{primary_key} in (%{ids})',
35
- primary_key: directive.primary_key, columns: associations.keys.join(','),
36
- table_name: directive.table_name, ids: directive.ids.join(','))
34
+ format(
35
+ 'select distinct %{column} from %{table_name} where %{clause} and %{column} is not null',
36
+ primary_key: directive.primary_key, column: column, table_name: directive.table_name,
37
+ clause: TableSaw::Queries::SerializeSqlInClause.new(directive.table_name, column, directive.ids).call
38
+ )
37
39
  )
38
40
  end
39
41
  end
@@ -14,7 +14,9 @@ module TableSaw
14
14
 
15
15
  def copy_statement
16
16
  if partial
17
- "select * from #{name} where #{primary_key} in (#{ids.to_a.join(',')})"
17
+ format 'select * from %{name} where %{clause}',
18
+ name: name, clause: TableSaw::Queries::SerializeSqlInClause.new(name, primary_key, ids.to_a).call
19
+
18
20
  else
19
21
  "select * from #{name}"
20
22
  end
@@ -41,9 +41,11 @@ module TableSaw
41
41
  return [] unless directive.selectable?
42
42
 
43
43
  TableSaw::Connection.exec(
44
- format('select %{primary_key} from %{table} where %{column} in (%{ids})',
45
- primary_key: TableSaw.information_schema.primary_keys[table], table: table, column: column,
46
- ids: directive.ids.join(','))
44
+ format(
45
+ 'select %{primary_key} from %{table} where %{clause}',
46
+ primary_key: TableSaw.information_schema.primary_keys[table], table: table,
47
+ clause: TableSaw::Queries::SerializeSqlInClause.new(table, column, directive.ids).call
48
+ )
47
49
  )
48
50
  end
49
51
  end
@@ -4,4 +4,5 @@ require 'table_saw/queries/foreign_key_relationships'
4
4
  require 'table_saw/queries/materialized_views'
5
5
  require 'table_saw/queries/primary_keys'
6
6
  require 'table_saw/queries/serial_sequences'
7
+ require 'table_saw/queries/serialize_sql_in_clause'
7
8
  require 'table_saw/queries/table_columns'
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TableSaw
4
+ module Queries
5
+ class SerializeSqlInClause
6
+ attr_reader :table_name, :column, :values
7
+
8
+ def initialize(table_name, column, values)
9
+ @table_name = table_name
10
+ @column = column
11
+ @values = values
12
+ end
13
+
14
+ def call
15
+ "#{column} in (#{serialized_values.join(', ')})"
16
+ end
17
+
18
+ private
19
+
20
+ def db_column
21
+ @db_column ||= connection.columns(table_name).find { |c| c.name == column }
22
+ end
23
+
24
+ def serialized_values
25
+ values.map do |value|
26
+ connection.quote(connection.type_cast_from_column(db_column, value))
27
+ end
28
+ end
29
+
30
+ def connection
31
+ TableSaw::Connection.adapter
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TableSaw
4
- VERSION = '2.1.0'
4
+ VERSION = '2.2.0'
5
5
  end
data/table_saw.gemspec CHANGED
@@ -23,10 +23,10 @@ Gem::Specification.new do |spec|
23
23
  spec.executables = ['table-saw']
24
24
  spec.require_paths = ['lib']
25
25
 
26
+ spec.add_dependency 'activerecord', '>= 5.2'
26
27
  spec.add_dependency 'pg'
27
28
  spec.add_dependency 'thor'
28
29
 
29
- spec.add_development_dependency 'activerecord', '~> 5.2'
30
30
  spec.add_development_dependency 'bundler', '~> 2.0'
31
31
  spec.add_development_dependency 'combustion', '~> 1.1'
32
32
  spec.add_development_dependency 'database_cleaner', '~> 1.7'
metadata CHANGED
@@ -1,31 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: table_saw
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hamed Asghari
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-02 00:00:00.000000000 Z
11
+ date: 2019-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: pg
14
+ name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '5.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '5.2'
27
27
  - !ruby/object:Gem::Dependency
28
- name: thor
28
+ name: pg
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,19 +39,19 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: activerecord
42
+ name: thor
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '5.2'
48
- type: :development
47
+ version: '0'
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
- version: '5.2'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -218,6 +218,7 @@ files:
218
218
  - lib/table_saw/queries/materialized_views.rb
219
219
  - lib/table_saw/queries/primary_keys.rb
220
220
  - lib/table_saw/queries/serial_sequences.rb
221
+ - lib/table_saw/queries/serialize_sql_in_clause.rb
221
222
  - lib/table_saw/queries/table_columns.rb
222
223
  - lib/table_saw/version.rb
223
224
  - table_saw.gemspec