table_saw 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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