fast_inserter 0.1.4 → 0.1.5

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: c9a5654ca484c5f0b47bfa91c6f5e1bb52549933
4
- data.tar.gz: 9d239e735b0333d3662dc663e5fb5dfb83a6bee3
3
+ metadata.gz: 120b53eb90d8eef25a9d1f3340b36f4256d9ddca
4
+ data.tar.gz: aea33ef6b99f3707b2276785cc5add4d74522020
5
5
  SHA512:
6
- metadata.gz: 9c89ce208dc7b8bcfb95b4bdb8e632b8712cc47bb7348f0f88d67ec83ccf986b69d565b8f66fc880f629ae12f909b13d89beeae960c431e3ab77f1a4f67486c5
7
- data.tar.gz: a65992d6071b696bbc25b523002fcb5a32d84d4b0733f07f4a91c52cc4eef96f49947225bdf0431c1443d2a738eb36375dec7b29d2981cb9ee1b95eeea550e40
6
+ metadata.gz: e47da657ffab5623bae32686880e916f507b49bd9a33067be2c80ee1131bf269430dc7a2a670045acd478d5a0a16f9d7c1afd971fc1aace6b96db19b89a7d102
7
+ data.tar.gz: b694592a8c016b52f39993cd3695316d383868f6cf267b84f50682e4eab662ab5f123a0b041ef1f3759b9d7c620593cb9fb83a98dd7e23c2cbc63bf658779780
data/README.md CHANGED
@@ -99,6 +99,15 @@ The name of the column which we will be dynamically inserting records for. This
99
99
 
100
100
  The large list of values to use for the 'variable_column' value when inserting the records.
101
101
 
102
+ ## Multiple Variable Columns
103
+ Rather than a single `variable_column`, you may pass an array of `variable_columns`, along with `values` as an array of arrays.
104
+
105
+ Example:
106
+ ```
107
+ variable_columns: %w(user_id user_email)
108
+ values: [[1, 'foo@example.com'], [2, 'bar@example.com']]
109
+ ```
110
+
102
111
  ## Development
103
112
 
104
113
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -113,4 +122,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/stryde
113
122
  ## License
114
123
 
115
124
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
116
-
@@ -49,13 +49,13 @@ module FastInserter
49
49
  @table_name = params[:table]
50
50
  @static_columns = params[:static_columns]
51
51
  @additional_columns = params[:additional_columns]
52
- @variable_column = params[:variable_column]
52
+ @variable_columns = Array(params[:variable_columns] || params[:variable_column])
53
53
  @options = params[:options] || {}
54
54
 
55
55
  # We want to break up the insertions into multiple transactiosn in case there
56
56
  # is a very large amount of values. This avoids PG:OutOfMemory errors and smooths
57
57
  # out the load. The second 'false' param means don't fill in the last group with nil elements.
58
- all_values = params[:values]
58
+ all_values = params[:values].map { |value| Array(value) }
59
59
  all_values.uniq! if @options[:unique]
60
60
  group_size = Integer(params[:group_size] || ENV['FAST_INSERTER_GROUP_SIZE'] || DEFAULT_GROUP_SIZE)
61
61
  @value_groups = all_values.in_groups_of(group_size, false)
@@ -82,7 +82,7 @@ module FastInserter
82
82
  def fast_insert_group(group)
83
83
  if @options[:check_for_existing]
84
84
  ActiveRecord::Base.transaction do
85
- non_existing_values = group.map(&:to_s) - existing_values(group)
85
+ non_existing_values = group.map { |values| values.map(&:to_s) } - existing_values(group)
86
86
  sql_string = insertion_sql_for_group(non_existing_values)
87
87
  ActiveRecord::Base.connection.execute(sql_string) unless non_existing_values.empty?
88
88
  end
@@ -94,7 +94,7 @@ module FastInserter
94
94
 
95
95
  # Queries for the existing values for a given group of values
96
96
  def existing_values(group_of_values)
97
- sql = "SELECT #{@variable_column} FROM #{@table_name} WHERE #{existing_values_static_columns}"
97
+ sql = "SELECT #{@variable_columns.join(', ')} FROM #{@table_name} WHERE #{existing_values_static_columns}"
98
98
 
99
99
  # NOTE: There are more elegant ways to get this field out of the resultset, but each database adaptor returns a different type
100
100
  # of result from 'execute(sql)'. Potential classes for 'result' is Array (sqlite), Mysql2::Result (mysql2), PG::Result (pg). Each
@@ -102,15 +102,15 @@ module FastInserter
102
102
  results = ActiveRecord::Base.connection.execute(sql)
103
103
  existing_values = results.to_a.map do |result|
104
104
  if result.is_a?(Hash)
105
- result[@variable_column].to_s
105
+ @variable_columns.map { |col| result[col] }.map(&:to_s)
106
106
  elsif result.is_a?(Array)
107
- result[0].to_s
107
+ result.map(&:to_s)
108
108
  end
109
109
  end
110
110
 
111
111
  # Rather than a giant IN query in the sql statement (which can be bad for database performance),
112
112
  # do the filtering of relevant values here in a ruby select.
113
- group_of_values_strings = group_of_values.map(&:to_s)
113
+ group_of_values_strings = group_of_values.map { |values| values.map(&:to_s) }
114
114
  existing_values & group_of_values_strings
115
115
  end
116
116
 
@@ -130,7 +130,7 @@ module FastInserter
130
130
  end
131
131
 
132
132
  def column_names
133
- "#{all_static_columns.keys.join(', ')}, #{@variable_column}"
133
+ "#{all_static_columns.keys.join(', ')}, #{@variable_columns.join(', ')}"
134
134
  end
135
135
 
136
136
  def all_static_columns
@@ -157,9 +157,9 @@ module FastInserter
157
157
  rv = []
158
158
  static_column_values = ActiveRecord::Base.send(:sanitize_sql_array, ["?", all_static_columns.values])
159
159
 
160
- group_of_values.each do |value|
161
- value = ActiveRecord::Base.send(:sanitize_sql_array, ["?", value])
162
- rv << "(#{static_column_values},#{value})"
160
+ group_of_values.each do |values|
161
+ values = values.map { |value| ActiveRecord::Base.send(:sanitize_sql_array, ["?", value]) }
162
+ rv << "(#{static_column_values},#{values.join(',')})"
163
163
  end
164
164
 
165
165
  rv.join(', ')
@@ -1,3 +1,3 @@
1
1
  module FastInserter
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_inserter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Ringwelski
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2016-09-19 00:00:00.000000000 Z
14
+ date: 2017-01-09 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activerecord