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 +4 -4
- data/.travis.yml +3 -0
- data/lib/sequel-pg_bulk_upsert/version.rb +1 -1
- data/lib/sequel/extensions/pg_bulk_upsert.rb +25 -7
- data/sequel-pg_bulk_upsert.gemspec +1 -0
- data/test/lib/dataset_extension_test.rb +3 -2
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8669bd7a4dc68db8dc9402ac22f8080d4b328dd
|
4
|
+
data.tar.gz: 7ee872d7d03780bffb221afa1e1783b5d1cf9592
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 077194f7adffa708c79ab0888746aa8d46c839c01fabf300cabd1afb10030da1518f473b13075cecbd4b11893bea769cca69fb983ec707cf052dcf729ab535e9
|
7
|
+
data.tar.gz: 09ea9c5440940f413b9731e60adf9b2db56b27c4be750ab8f2c6083bfa983a31547fe076892b9040282844da726364646836212ddd784620f975662fe32d4825
|
data/.travis.yml
ADDED
@@ -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.
|
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,
|
41
|
-
where(
|
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(
|
50
|
-
returning(
|
51
|
-
returning(
|
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)
|
@@ -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
|
-
|
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.
|
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
|
+
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
|