sequel-pg_bulk_upsert 0.1.0 → 0.1.1

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
  SHA1:
3
- metadata.gz: dae595e4106d5d417ee04cc133ec517bb262a258
4
- data.tar.gz: 8487d7990c2ddc1b532d9ccf73f6b5a6d49d9635
3
+ metadata.gz: c8669bd7a4dc68db8dc9402ac22f8080d4b328dd
4
+ data.tar.gz: 7ee872d7d03780bffb221afa1e1783b5d1cf9592
5
5
  SHA512:
6
- metadata.gz: 0b5a2f42be945d76e6dc3a0ba36c0674203c9b4415e6b1860d8d9f6c075ec311bd7afbbce1bd5ba7787d4c2fb45f7c68c674483b29e0f88489ad43e2aa676bf8
7
- data.tar.gz: 489f39454ff4bfe11acad6816454d0e693821b9454d912a2a9930e6b61597bed98850d12256bab88deec651991fe9410c1a1d56daa2f7c585480f6179e9026ee
6
+ metadata.gz: 077194f7adffa708c79ab0888746aa8d46c839c01fabf300cabd1afb10030da1518f473b13075cecbd4b11893bea769cca69fb983ec707cf052dcf729ab535e9
7
+ data.tar.gz: 09ea9c5440940f413b9731e60adf9b2db56b27c4be750ab8f2c6083bfa983a31547fe076892b9040282844da726364646836212ddd784620f975662fe32d4825
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
@@ -1,5 +1,5 @@
1
1
  module Sequel
2
2
  module PgBulkUpsert
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
@@ -12,12 +12,23 @@ module Sequel
12
12
  if duplicate_keys = @opts[:on_duplicate_key_update]
13
13
  from_table_name = @opts[:from].first # XXX How: can we ensure theres only one?
14
14
  temp_table_name = "#{from_table_name}_tmp_#{Time.now.strftime("%s%L")}"
15
- upsert_on = @db.primary_key(from_table_name) or raise "missing primary_key for #{from_table_name}"
15
+ upsert_on = @db.fetch(<<-SQL).map { |row| row[:attname] }
16
+ SELECT
17
+ pg_attribute.attname
18
+ FROM pg_index, pg_class, pg_attribute
19
+ WHERE
20
+ pg_class.oid = '#{from_table_name}'::regclass AND
21
+ indrelid = pg_class.oid AND
22
+ pg_attribute.attrelid = pg_class.oid AND
23
+ pg_attribute.attnum = any(pg_index.indkey)
24
+ AND indisprimary;
25
+ SQL
26
+ raise "missing primary_key for #{from_table_name}" unless upsert_on.any?
16
27
 
17
28
  [
18
29
  create_temp_table_from_existing_sql(from_table_name, temp_table_name),
19
30
  multi_insert_without_duplicates_sqls(temp_table_name, columns, values),
20
- upsert_from_to_sql(temp_table_name, from_table_name, upsert_on.to_sym, duplicate_keys, columns)
31
+ upsert_from_to_sql(temp_table_name, from_table_name, upsert_on.map(&:to_sym), duplicate_keys, columns)
21
32
  ].flatten
22
33
  else
23
34
  super
@@ -35,20 +46,27 @@ module Sequel
35
46
  def upsert_from_to_sql(source_name, target_name, join_on, update_columns, insert_columns)
36
47
  target = @db.from(target_name)
37
48
  source = @db.from(source_name)
49
+
50
+ nil_join_on = join_on.each_with_object({}) do |join_col, hash|
51
+ hash[Sequel.qualify(:update_cte, join_col)] = nil
52
+ end
38
53
  source_ds = source.
39
54
  select(*insert_columns).
40
- left_join(:update_cte, [join_on]).
41
- where(Sequel.qualify(:update_cte, join_on) => nil)
55
+ left_join(:update_cte, join_on).
56
+ where(nil_join_on)
42
57
 
43
58
  update_hash = update_columns.each_with_object({}) do |column, hash|
44
59
  hash[column] = Sequel.qualify(source_name, column)
45
60
  end
46
61
 
62
+ qualified_target_join = join_on.map { |join_col| Sequel.qualify(target_name, join_col) }
63
+ qualified_source_join = join_on.map { |join_col| Sequel.qualify(source_name, join_col) }
64
+
47
65
  target.with(:update_cte,
48
66
  target.from(target_name, source_name).
49
- where(Sequel.qualify(target_name, join_on) => Sequel.qualify(source_name, join_on)).
50
- returning(Sequel.qualify(target_name, join_on)).with_sql(:update_sql, update_hash)).
51
- returning(Sequel.qualify(target_name, join_on)).insert_sql(insert_columns, source_ds)
67
+ where(Hash[qualified_target_join.zip(qualified_source_join)]).
68
+ returning(*qualified_target_join).with_sql(:update_sql, update_hash)).
69
+ returning(*qualified_target_join).insert_sql(insert_columns, source_ds)
52
70
  end
53
71
 
54
72
  def create_temp_table_from_existing_sql(base_table, temp_table_name)
@@ -19,5 +19,6 @@ Gem::Specification.new do |gem|
19
19
  gem.add_dependency "pg"
20
20
  gem.add_development_dependency "minitest"
21
21
  gem.add_development_dependency "pry"
22
+ gem.add_development_dependency "rake"
22
23
  gem.require_paths = ["lib"]
23
24
  end
@@ -4,7 +4,7 @@ class DatasetExtensionTest < MiniTest::Test
4
4
 
5
5
  def setup
6
6
  @db = Sequel.
7
- connect('mock://postgres').
7
+ connect('mock://postgres', fetch: [{attname: :id}]).
8
8
  extension(:pg_bulk_upsert)
9
9
 
10
10
  def @db.schema(table)
@@ -80,7 +80,8 @@ class DatasetExtensionTest < MiniTest::Test
80
80
  def do_upsert(columns = @upsert_columns, data = @upsert_data)
81
81
  @ds.on_duplicate_key_update(:updatable_column).import(columns, data)
82
82
 
83
- @db.sqls
83
+ # Returns sqls ignoring primary_key query
84
+ @db.sqls[1..-1]
84
85
  end
85
86
 
86
87
  def extract_temp_table_name(create_sql)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel-pg_bulk_upsert
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juan Manuel Barreneche
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-28 00:00:00.000000000 Z
11
+ date: 2014-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: Implementation `on_duplicate_key_update(*...).multi_insert(*...)` for
70
84
  postgresql
71
85
  email:
@@ -75,6 +89,7 @@ extensions: []
75
89
  extra_rdoc_files: []
76
90
  files:
77
91
  - ".gitignore"
92
+ - ".travis.yml"
78
93
  - Gemfile
79
94
  - LICENSE.txt
80
95
  - README.md