delete_in_batches 0.0.2 → 0.1.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
- SHA1:
3
- metadata.gz: 9334c1787ed0531d63d596f13af0d01497980b50
4
- data.tar.gz: efc570b218f5feece5842f12976f544f9cbfe003
2
+ SHA256:
3
+ metadata.gz: c19c0abdd26b2ea2eea3ef9852d800f29077e7da89ecf3268068d4bc1c9a5032
4
+ data.tar.gz: cfec1154bed9e3f406bb8fe601676204d6000f9fd569a1111c58e89d55c8953c
5
5
  SHA512:
6
- metadata.gz: 08496a8fe18729a87919ad9870ed77f9fe355c409fcafc10f6aa827acf5ad8f936408227fea792d9d1e3c9ab1f9ad75f5f0d138f49a0bd59b3ca9b07056f1b47
7
- data.tar.gz: d0a79745e4cf3d55a7cc17ea9586a6f1ca6f151a673a63fe6b07e41beb497236e6c3c5404064161a3ac3fd4da19931cab1bed41059c59774239b1c98d1f1f8ac
6
+ metadata.gz: 5a1f174a03a098551d0542075d4a043ae523d17d3340802d010309c671f05a1a51c98b0ff1aba00adcce48a7715232e123b69a68d2fb3534440368c5fdfadfee
7
+ data.tar.gz: 198d18d925e870567895eaf3373090b7155d4442c386ab37ad70e18efa4f9c0c5495f8034ad3070c7bf3c5c2a6bfb1c0a16228b7f62b402b7ec3472be4bf6644
data/README.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # delete_in_batches
2
2
 
3
- :fire: The fastest way to delete millions of rows with ActiveRecord
3
+ :fire: The fastest way to delete 100k+ rows with ActiveRecord
4
+
5
+ **Note: This gem is not needed in Rails 5+.** Instead, you can do:
6
+
7
+ ```ruby
8
+ Tweet.where(user_id: 1).in_batches(of: 10000).delete_all
9
+ ```
10
+
11
+ [![Build Status](https://travis-ci.org/ankane/delete_in_batches.svg?branch=master)](https://travis-ci.org/ankane/delete_in_batches)
4
12
 
5
13
  ## Slow
6
14
 
@@ -2,27 +2,21 @@ require "delete_in_batches/version"
2
2
  require "active_record"
3
3
 
4
4
  module DeleteInBatches
5
-
6
- def delete_in_batches(options = {}, &block)
5
+ def delete_in_batches(options = {})
7
6
  batch_size = options[:batch_size] || 10000
8
7
 
9
- # TODO dry
10
- pk = "#{quoted_table_name}.#{quoted_primary_key}"
11
- sql =
12
- if connection.respond_to?(:unprepared_statement)
13
- # ActiveRecord 4
14
- connection.unprepared_statement do
15
- select(pk).limit(batch_size).to_sql
16
- end
17
- else
18
- select(pk).limit(batch_size).to_sql
19
- end
8
+ pk = "#{quoted_table_name}.#{quoted_primary_key}"
9
+ sql_proc = proc { select(pk).limit(batch_size).to_sql }
10
+ sql = connection.try(:unprepared_statement, &sql_proc) || sql_proc.call
11
+
12
+ if %w(MySQL Mysql2 Mysql2Spatial).include?(connection.adapter_name)
13
+ sql = "SELECT * FROM (#{sql}) AS t"
14
+ end
20
15
 
21
16
  while connection.delete("DELETE FROM #{quoted_table_name} WHERE #{pk} IN (#{sql})") == batch_size
22
17
  yield if block_given?
23
18
  end
24
19
  end
25
-
26
20
  end
27
21
 
28
22
  ActiveRecord::Base.send :extend, DeleteInBatches
@@ -1,3 +1,3 @@
1
1
  module DeleteInBatches
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delete_in_batches
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-28 00:00:00.000000000 Z
11
+ date: 2018-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.5'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.5'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -56,18 +56,18 @@ dependencies:
56
56
  name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '4.7'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '4.7'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: pg
70
+ name: sqlite3
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -80,23 +80,16 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
- description: The fastest way to delete millions of rows with ActiveRecord
84
- email:
85
- - andrew@chartkick.com
83
+ description:
84
+ email: andrew@chartkick.com
86
85
  executables: []
87
86
  extensions: []
88
87
  extra_rdoc_files: []
89
88
  files:
90
- - ".gitignore"
91
- - Gemfile
92
89
  - LICENSE.txt
93
90
  - README.md
94
- - Rakefile
95
- - delete_in_batches.gemspec
96
91
  - lib/delete_in_batches.rb
97
92
  - lib/delete_in_batches/version.rb
98
- - test/delete_in_batches_test.rb
99
- - test/test_helper.rb
100
93
  homepage: https://github.com/ankane/delete_in_batches
101
94
  licenses:
102
95
  - MIT
@@ -109,7 +102,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
109
102
  requirements:
110
103
  - - ">="
111
104
  - !ruby/object:Gem::Version
112
- version: '0'
105
+ version: '2.2'
113
106
  required_rubygems_version: !ruby/object:Gem::Requirement
114
107
  requirements:
115
108
  - - ">="
@@ -117,10 +110,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
110
  version: '0'
118
111
  requirements: []
119
112
  rubyforge_project:
120
- rubygems_version: 2.2.0
113
+ rubygems_version: 2.7.7
121
114
  signing_key:
122
115
  specification_version: 4
123
- summary: The fastest way to delete millions of rows with ActiveRecord
124
- test_files:
125
- - test/delete_in_batches_test.rb
126
- - test/test_helper.rb
116
+ summary: The fastest way to delete 100k+ rows with ActiveRecord
117
+ test_files: []
data/.gitignore DELETED
@@ -1,17 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in delete_in_batches.gemspec
4
- gemspec
data/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
3
-
4
- task :default => :test
5
- Rake::TestTask.new do |t|
6
- t.libs << "test"
7
- t.pattern = "test/**/*_test.rb"
8
- end
@@ -1,27 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'delete_in_batches/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "delete_in_batches"
8
- spec.version = DeleteInBatches::VERSION
9
- spec.authors = ["Andrew Kane"]
10
- spec.email = ["andrew@chartkick.com"]
11
- spec.summary = %q{The fastest way to delete millions of rows with ActiveRecord}
12
- spec.description = %q{The fastest way to delete millions of rows with ActiveRecord}
13
- spec.homepage = "https://github.com/ankane/delete_in_batches"
14
- spec.license = "MIT"
15
-
16
- spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
20
-
21
- spec.add_dependency "activerecord"
22
-
23
- spec.add_development_dependency "bundler", "~> 1.5"
24
- spec.add_development_dependency "rake"
25
- spec.add_development_dependency "minitest", "~> 4.7"
26
- spec.add_development_dependency "pg"
27
- end
@@ -1,55 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class TestDeleteInBatches < Minitest::Unit::TestCase
4
-
5
- def test_basic
6
- 10.times do
7
- Tweet.create(user_id: 1)
8
- end
9
- Tweet.create(user_id: 2)
10
-
11
- Tweet.where(user_id: 1).delete_in_batches(batch_size: 2)
12
-
13
- assert_equal 1, Tweet.count
14
- assert_equal 2, Tweet.first.user_id
15
- end
16
-
17
- def test_all
18
- Tweet.create(user_id: 1)
19
-
20
- Tweet.delete_in_batches
21
-
22
- assert_equal 0, Tweet.count
23
- end
24
-
25
- def test_progress
26
- 10.times do
27
- Tweet.create(user_id: 1)
28
- end
29
-
30
- i = 0
31
- Tweet.where(user_id: 1).delete_in_batches(batch_size: 2) do
32
- i += 1
33
- end
34
-
35
- assert_equal 5, i
36
- end
37
-
38
- def test_association
39
- user = User.create!
40
- user.tweets.create!
41
-
42
- user.tweets.delete_in_batches
43
-
44
- assert_equal 0, user.tweets.count
45
- end
46
-
47
- def test_join
48
- Tweet.create(user_id: 1)
49
-
50
- Tweet.joins(:user).where(users: {id: 1}).delete_in_batches
51
-
52
- assert_equal 0, Tweet.count
53
- end
54
-
55
- end
data/test/test_helper.rb DELETED
@@ -1,31 +0,0 @@
1
- require "bundler/setup"
2
- Bundler.require(:default)
3
- require "minitest/autorun"
4
- require "minitest/pride"
5
-
6
- ENV["RACK_ENV"] = "test"
7
-
8
- # for debugging
9
- # ActiveRecord::Base.logger = Logger.new(STDOUT)
10
-
11
- # rails does this in activerecord/lib/active_record/railtie.rb
12
- ActiveRecord::Base.default_timezone = :utc
13
- ActiveRecord::Base.time_zone_aware_attributes = true
14
-
15
- # migrations
16
- ActiveRecord::Base.establish_connection :adapter => "postgresql", :database => "delete_in_batches_test"
17
-
18
- ActiveRecord::Migration.create_table :tweets, :force => true do |t|
19
- t.integer :user_id
20
- end
21
-
22
- ActiveRecord::Migration.create_table :users, :force => true do |t|
23
- end
24
-
25
- class Tweet < ActiveRecord::Base
26
- belongs_to :user
27
- end
28
-
29
- class User < ActiveRecord::Base
30
- has_many :tweets
31
- end