about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2021-04-12 03:35:58 +0200
committerGitHub <noreply@github.com>2021-04-12 03:35:58 +0200
commitad61265268f13d9b2a04e2e176724d8a7376f85a (patch)
tree4db1fe381ffb6d6c21a9895ceffdc8a853e7e3df
parent619fad6cf8078ea997554081febe850404bee73c (diff)
Remove dependency on pluck_each gem (#16012)
-rw-r--r--Gemfile1
-rw-r--r--Gemfile.lock10
-rw-r--r--config/application.rb1
-rw-r--r--lib/active_record/batches.rb44
4 files changed, 45 insertions, 11 deletions
diff --git a/Gemfile b/Gemfile
index 1190f2558..d4385f014 100644
--- a/Gemfile
+++ b/Gemfile
@@ -157,4 +157,3 @@ gem 'concurrent-ruby', require: false
 gem 'connection_pool', require: false
 
 gem 'xorcist', '~> 1.1'
-gem 'pluck_each', git: 'https://github.com/nsommer/pluck_each', ref: '73be0947c52fc54bf6d7085378db008358aac5eb'
diff --git a/Gemfile.lock b/Gemfile.lock
index 8bea31332..a3b11ab6c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -9,15 +9,6 @@ GIT
       sidekiq (>= 3.5)
       statsd-ruby (~> 1.4, >= 1.4.0)
 
-GIT
-  remote: https://github.com/nsommer/pluck_each
-  revision: 73be0947c52fc54bf6d7085378db008358aac5eb
-  ref: 73be0947c52fc54bf6d7085378db008358aac5eb
-  specs:
-    pluck_each (0.1.3)
-      activerecord (>= 6.1.0)
-      activesupport (>= 6.1.0)
-
 GEM
   remote: https://rubygems.org/
   specs:
@@ -771,7 +762,6 @@ DEPENDENCIES
   pg (~> 1.2)
   pghero (~> 2.8)
   pkg-config (~> 1.4)
-  pluck_each!
   posix-spawn
   premailer-rails
   private_address_check (~> 0.5)
diff --git a/config/application.rb b/config/application.rb
index c911e76dc..eb2c91677 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -29,6 +29,7 @@ require_relative '../lib/webpacker/helper_extensions'
 require_relative '../lib/action_dispatch/cookie_jar_extensions'
 require_relative '../lib/rails/engine_extensions'
 require_relative '../lib/active_record/database_tasks_extensions'
+require_relative '../lib/active_record/batches'
 
 Dotenv::Railtie.load
 
diff --git a/lib/active_record/batches.rb b/lib/active_record/batches.rb
new file mode 100644
index 000000000..55d29e52e
--- /dev/null
+++ b/lib/active_record/batches.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module ActiveRecord
+  module Batches
+    def pluck_each(*column_names)
+      relation = self
+
+      options = column_names.extract_options!
+
+      flatten     = column_names.size == 1
+      batch_limit = options[:batch_limit] || 1_000
+      order       = options[:order] || :asc
+
+      column_names.unshift(primary_key)
+
+      relation = relation.reorder(batch_order(order)).limit(batch_limit)
+      relation.skip_query_cache!
+
+      batch_relation = relation
+
+      loop do
+        batch = batch_relation.pluck(*column_names)
+
+        break if batch.empty?
+
+        primary_key_offset = batch.last[0]
+
+        batch.each do |record|
+          if flatten
+            yield record[1]
+          else
+            yield record[1..-1]
+          end
+        end
+
+        break if batch.size < batch_limit
+
+        batch_relation = relation.where(
+          predicate_builder[primary_key, primary_key_offset, order == :desc ? :lt : :gt]
+        )
+      end
+    end
+  end
+end