quick_count 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +74 -8
- data/.travis.yml +29 -0
- data/CHANGELOG.md +21 -0
- data/Gemfile +15 -12
- data/README.md +35 -8
- data/gemfiles/activerecord-4.0.Gemfile +3 -0
- data/gemfiles/activerecord-4.1.Gemfile +3 -0
- data/gemfiles/activerecord-4.2.Gemfile +3 -0
- data/gemfiles/activerecord-5.0.Gemfile +3 -0
- data/gemfiles/activerecord-5.1.Gemfile +3 -0
- data/lib/quick_count.rb +42 -31
- data/lib/quick_count/active_record/base.rb +3 -2
- data/lib/quick_count/version.rb +1 -1
- data/quick_count.gemspec +14 -14
- data/spec/quick_count_spec.rb +18 -0
- data/spec/spec_helper.rb +29 -0
- data/spec/support/rails/app/models/post.rb +3 -0
- data/spec/support/rails/app/models/user.rb +3 -0
- data/spec/support/rails/config/database.yml +5 -0
- data/spec/support/rails/config/routes.rb +3 -0
- data/spec/support/rails/db/schema.rb +14 -0
- data/spec/support/rails/log/.gitignore +1 -0
- data/spec/support/rails/public/favicon.ico +0 -0
- metadata +58 -64
- data/Gemfile.lock +0 -103
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 13b6d1774446b930452cb50814ff1081c01353f0136f1b60706f57481bfe5e7f
|
4
|
+
data.tar.gz: 2cda68595ddd0c78af1b7baacf67639011803d073d72e98a38a030d15df17fef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b2fd37276fbcff9a6dcc0892908389f0f6dbd228133f52e20bd380eb8b66dc446ea597e98d68f9955b3fbb14b5040f38d84d396efc909bc8b332e28154acd38
|
7
|
+
data.tar.gz: 49a10a20fbd02043c36978c97dbcd9c744bea945cc8166fd3e0ecb5083364c4f2b2f5f3d2dd93a11068e854197b1f84aecd3c06aeaeda2589fb4a382edffdb2c
|
data/.gitignore
CHANGED
@@ -1,9 +1,75 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
2
|
+
#
|
3
|
+
# If you find yourself ignoring temporary files generated by your text editor
|
4
|
+
# or operating system, you probably want to add a global ignore instead:
|
5
|
+
# git config --global core.excludesfile ~/.gitignore_global
|
6
|
+
|
7
|
+
# Database config and secrets
|
8
|
+
/config/database.yml
|
9
|
+
/config/secrets.yml
|
10
|
+
|
11
|
+
# Ignore bundler config
|
12
|
+
/.bundle
|
13
|
+
|
14
|
+
# Ignore the default SQLite database.
|
15
|
+
/db/*.sqlite3
|
16
|
+
|
17
|
+
# Ignore all logfiles and tempfiles.
|
18
|
+
/log/*.log
|
19
|
+
/tmp
|
20
|
+
/db/structure.sql
|
21
|
+
/doc/app/*
|
22
|
+
/vendor/cldr/*
|
23
|
+
/public/uploads/*
|
24
|
+
/public/photo/*
|
25
|
+
/public/test/*
|
26
|
+
/test/assets/*
|
27
|
+
/spec/assets/*
|
28
|
+
/public/assets/**
|
29
|
+
.powenv
|
30
|
+
.rvmrc
|
31
|
+
.env
|
32
|
+
.ruby-version
|
33
|
+
|
34
|
+
# Compiled source #
|
35
|
+
###################
|
36
|
+
/pkg
|
37
|
+
*.com
|
38
|
+
*.class
|
39
|
+
*.dll
|
40
|
+
*.exe
|
41
|
+
*.o
|
42
|
+
*.so
|
43
|
+
|
44
|
+
# Packages #
|
45
|
+
############
|
46
|
+
# it's better to unpack these files and commit the raw source
|
47
|
+
# git has its own built in compression methods
|
48
|
+
*.7z
|
49
|
+
*.dmg
|
50
|
+
*.gz
|
51
|
+
*.iso
|
52
|
+
*.jar
|
53
|
+
*.rar
|
54
|
+
*.tar
|
55
|
+
*.zip
|
56
|
+
|
57
|
+
# Logs and databases #
|
58
|
+
######################
|
59
|
+
*.log
|
60
|
+
*.sql
|
61
|
+
*.sqlite
|
62
|
+
|
63
|
+
# OS generated files #
|
64
|
+
######################
|
65
|
+
.DS_Store
|
66
|
+
.DS_Store?
|
67
|
+
._*
|
68
|
+
.Spotlight-V100
|
69
|
+
.Trashes
|
70
|
+
Icon?
|
71
|
+
ehthumbs.db
|
72
|
+
Thumbs.db
|
3
73
|
/Gemfile.lock
|
4
|
-
/
|
5
|
-
|
6
|
-
/doc/
|
7
|
-
/pkg/
|
8
|
-
/spec/reports/
|
9
|
-
/tmp/
|
74
|
+
/coverage
|
75
|
+
/.editorconfig
|
data/.travis.yml
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
language: ruby
|
2
|
+
|
3
|
+
sudo: false
|
4
|
+
|
5
|
+
cache: bundler
|
6
|
+
|
7
|
+
before_script:
|
8
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
9
|
+
- chmod +x ./cc-test-reporter
|
10
|
+
- ./cc-test-reporter before-build
|
11
|
+
|
12
|
+
script:
|
13
|
+
- bundle exec rspec
|
14
|
+
|
15
|
+
after_script:
|
16
|
+
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
17
|
+
|
18
|
+
addons:
|
19
|
+
postgresql: "9.3"
|
20
|
+
|
21
|
+
rvm:
|
22
|
+
- 2.5
|
23
|
+
- 2.4
|
24
|
+
- 2.3
|
25
|
+
|
26
|
+
gemfile:
|
27
|
+
- gemfiles/activerecord-5.1.Gemfile
|
28
|
+
- gemfiles/activerecord-5.0.Gemfile
|
29
|
+
- gemfiles/activerecord-4.2.Gemfile
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# QuickCount
|
2
|
+
|
3
|
+
## 0.0.6 _(March 17th 2018)_
|
4
|
+
- Improved accuracy of `quick_count` by an average of 2.16%
|
5
|
+
- Configurable threshold
|
6
|
+
- Configurable schema
|
7
|
+
|
8
|
+
## 0.0.5 _(November 29th 2017)_
|
9
|
+
- Tests (no signficant changes)
|
10
|
+
|
11
|
+
## 0.0.4 _(April 11th 2017)_
|
12
|
+
- Fix root method privacy
|
13
|
+
|
14
|
+
## 0.0.3 _(April 9th 2017)_
|
15
|
+
- No significant changes
|
16
|
+
|
17
|
+
## 0.0.2 _(April 9th 2017)_
|
18
|
+
- Adding `count_estimate` helper
|
19
|
+
|
20
|
+
## 0.0.1 _(April 8th 2017)_
|
21
|
+
- Initial functionality
|
data/Gemfile
CHANGED
@@ -1,16 +1,19 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
# Declare your gem's dependencies in quick_count.gemspec.
|
4
|
-
# Bundler will treat runtime dependencies like base dependencies, and
|
5
|
-
# development dependencies will be added by default to the :development group.
|
6
3
|
gemspec
|
7
4
|
|
8
|
-
|
9
|
-
|
10
|
-
#
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
gem '
|
15
|
-
|
5
|
+
group :test do
|
6
|
+
|
7
|
+
# Generates coverage stats of specs
|
8
|
+
gem 'simplecov'
|
9
|
+
|
10
|
+
# Publishes coverage to codeclimate
|
11
|
+
gem 'codeclimate-test-reporter'
|
12
|
+
|
13
|
+
gem 'rspec'
|
16
14
|
|
15
|
+
gem 'database_cleaner'
|
16
|
+
|
17
|
+
gem 'combustion'
|
18
|
+
|
19
|
+
end
|
data/README.md
CHANGED
@@ -1,9 +1,32 @@
|
|
1
|
+
[![Version ](https://img.shields.io/gem/v/quick_count.svg?maxAge=2592000)](https://rubygems.org/gems/quick_count)
|
2
|
+
[![Build Status ](https://travis-ci.org/TwilightCoders/quick_count.svg)](https://travis-ci.org/TwilightCoders/quick_count)
|
3
|
+
[![Code Climate ](https://api.codeclimate.com/v1/badges/43ba3e038a91b44fba2c/maintainability)](https://codeclimate.com/github/TwilightCoders/quick_count/maintainability)
|
4
|
+
[![Test Coverage](https://codeclimate.com/github/TwilightCoders/quick_count/badges/coverage.svg)](https://codeclimate.com/github/TwilightCoders/quick_count/coverage)
|
5
|
+
[![Dependency Status](https://gemnasium.com/badges/github.com/TwilightCoders/quick_count.svg)](https://gemnasium.com/github.com/TwilightCoders/quick_count)
|
6
|
+
|
1
7
|
# QuickCount
|
2
8
|
|
3
|
-
|
9
|
+
Unfortunately, it's currently notoriously difficult and expensive to get an exact count on large tables.
|
10
|
+
|
11
|
+
Luckily, there are [some tricks](https://www.citusdata.com/blog/2016/10/12/count-performance) for quickly getting fairly accurate estimates. For example, on a table with over 450 million records, you can get a 99.82% accurate count within a fraction of of the time. See the table below for an example dataset.
|
12
|
+
|
13
|
+
**Supports:**
|
14
|
+
- PostgreSQL
|
15
|
+
- [Multi-table Inheritance](https://github.com/TwilightCoders/active_record-mti)
|
4
16
|
|
5
|
-
|
17
|
+
| SQL | Version | Result | Accuracy | Time |
|
18
|
+
| --- | --- | --- | --- | --- |
|
19
|
+
| `SELECT count(*) FROM small_table;` | -- | `2037104` | `100.0000000%` | `4.900s` |
|
20
|
+
| `SELECT quick_count('small_table');` | `v0.0.5` | `1988857` | `97.63158877%` | `0.048s` |
|
21
|
+
| `SELECT quick_count('small_table');` | `v0.0.6` | `2036407` | `99.96578476%` | `0.050s` |
|
22
|
+
| `SELECT count(*) FROM medium_table;` | -- | `81716243` | `100.0000000%` | `257.5s` |
|
23
|
+
| `SELECT quick_count('medium_table');` | `v0.0.5` | `79352284` | `97.10711247%` | `0.049s` |
|
24
|
+
| `SELECT quick_count('medium_table');` | `v0.0.6` | `81600513` | `99.85837577%` | `0.048s` |
|
25
|
+
| `SELECT count(*) FROM large_table;` | -- | `455270802` | `100.0000000%` | `310.6s` |
|
26
|
+
| `SELECT quick_count('large_table');` | `v0.0.5` | `448170751` | `98.44047741%` | `0.047s` |
|
27
|
+
| `SELECT quick_count('large_table');` | `v0.0.6` | `454448393` | `99.81935828%` | `0.046s` |
|
6
28
|
|
29
|
+
_These metrics were pulled from real databases being used in a production environment._
|
7
30
|
|
8
31
|
## Installation
|
9
32
|
|
@@ -17,10 +40,6 @@ And then execute:
|
|
17
40
|
|
18
41
|
$ bundle
|
19
42
|
|
20
|
-
And in a rails console:
|
21
|
-
|
22
|
-
$ QuickCount.install
|
23
|
-
|
24
43
|
Or install it yourself as:
|
25
44
|
|
26
45
|
$ gem install quick_count
|
@@ -30,13 +49,21 @@ Or install it yourself as:
|
|
30
49
|
```ruby
|
31
50
|
# user.rb
|
32
51
|
|
52
|
+
QuickCount.install # Install with default (500000) threshold
|
53
|
+
|
54
|
+
# Change the threshold for when `quick_count` kicks in...
|
55
|
+
QuickCount.install(threshold: 500000)
|
56
|
+
|
33
57
|
class User < ActiveRecord::Base
|
34
58
|
|
35
59
|
end
|
36
60
|
|
37
61
|
User.quick_count
|
38
|
-
```
|
39
62
|
|
63
|
+
# Override the default threshold on a case-by-case basis.
|
64
|
+
User.quick_count(threshold: 600000)
|
65
|
+
|
66
|
+
```
|
40
67
|
|
41
68
|
## Uninstallation
|
42
69
|
|
@@ -65,7 +92,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
65
92
|
|
66
93
|
## Contributing
|
67
94
|
|
68
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
95
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/TwilightCoders/quick_count.
|
69
96
|
|
70
97
|
|
71
98
|
## License
|
data/lib/quick_count.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
|
+
require 'quick_count/version'
|
1
2
|
require 'quick_count/railtie'
|
2
3
|
require 'active_record'
|
3
|
-
require 'rake'
|
4
4
|
|
5
5
|
module QuickCount
|
6
6
|
|
7
|
-
public
|
8
|
-
|
9
7
|
def self.root
|
10
8
|
@root ||= Pathname.new(File.dirname(File.expand_path(File.dirname(__FILE__), '/../')))
|
11
9
|
end
|
@@ -15,31 +13,50 @@ module QuickCount
|
|
15
13
|
::ActiveRecord::Relation.send :include, CountEstimate::ActiveRecord::Relation
|
16
14
|
end
|
17
15
|
|
18
|
-
def self.install
|
19
|
-
::ActiveRecord::Base.connection.execute(
|
20
|
-
|
16
|
+
def self.install(threshold: 500000, schema: 'public')
|
17
|
+
::ActiveRecord::Base.connection.execute(quick_count_sql(schema: schema, threshold: threshold))
|
18
|
+
::ActiveRecord::Base.connection.execute(count_estimate_sql(schema: schema))
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.uninstall(schema: 'public')
|
22
|
+
::ActiveRecord::Base.connection.execute("DROP FUNCTION IF EXISTS #{schema}.quick_count(text, bigint);")
|
23
|
+
::ActiveRecord::Base.connection.execute("DROP FUNCTION IF EXISTS #{schema}.quick_count(text);")
|
24
|
+
::ActiveRecord::Base.connection.execute("DROP FUNCTION IF EXISTS #{schema}.count_estimate(text);")
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def self.quick_count_sql(threshold: 500000, schema: 'public')
|
30
|
+
<<-SQL
|
31
|
+
CREATE OR REPLACE FUNCTION #{schema}.quick_count(table_name text, threshold bigint default #{threshold}) RETURNS bigint AS
|
21
32
|
$func$
|
22
|
-
DECLARE
|
23
|
-
rec record;
|
24
|
-
rows integer;
|
33
|
+
DECLARE count bigint;
|
25
34
|
BEGIN
|
26
|
-
|
27
|
-
|
28
|
-
SUM(
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
EXECUTE 'SELECT
|
36
|
+
CASE
|
37
|
+
WHEN SUM(estimate)::integer < '|| threshold ||' THEN
|
38
|
+
(SELECT COUNT(*) FROM '|| table_name ||')
|
39
|
+
ELSE
|
40
|
+
SUM(estimate)::integer
|
41
|
+
END AS count
|
42
|
+
FROM (
|
43
|
+
SELECT
|
44
|
+
((SUM(child.reltuples::float)/greatest(SUM(child.relpages::float),1))) * (SUM(pg_relation_size(child.oid))::float / (current_setting(''block_size'')::float)) AS estimate
|
45
|
+
FROM pg_inherits
|
46
|
+
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
|
47
|
+
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
|
48
|
+
WHERE parent.relname = '''|| table_name ||'''
|
49
|
+
UNION SELECT (reltuples::float/greatest(relpages::float, 1)) * (pg_relation_size(pg_class.oid)::float / (current_setting(''block_size'')::float)) AS estimate FROM pg_class where relname='''|| table_name ||'''
|
50
|
+
) AS tables' INTO count;
|
51
|
+
RETURN count;
|
37
52
|
END
|
38
53
|
$func$ LANGUAGE plpgsql;
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
54
|
+
SQL
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.count_estimate_sql(schema: 'public')
|
58
|
+
<<-SQL
|
59
|
+
CREATE OR REPLACE FUNCTION #{schema}.count_estimate(query text) RETURNS integer AS
|
43
60
|
$func$
|
44
61
|
DECLARE
|
45
62
|
rec record;
|
@@ -53,13 +70,7 @@ module QuickCount
|
|
53
70
|
RETURN rows;
|
54
71
|
END
|
55
72
|
$func$ LANGUAGE plpgsql;
|
56
|
-
|
57
|
-
)
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.uninstall
|
61
|
-
::ActiveRecord::Base.connection.execute("DROP FUNCTION quick_count(text);")
|
62
|
-
::ActiveRecord::Base.connection.execute("DROP FUNCTION count_estimate(text);")
|
73
|
+
SQL
|
63
74
|
end
|
64
75
|
|
65
76
|
end
|
@@ -7,8 +7,9 @@ module QuickCount
|
|
7
7
|
|
8
8
|
module ClassMethods
|
9
9
|
|
10
|
-
def quick_count
|
11
|
-
|
10
|
+
def quick_count(threshold: nil)
|
11
|
+
threshold = threshold ? ", #{threshold}" : nil
|
12
|
+
result = ::ActiveRecord::Base.connection.execute("SELECT quick_count('#{table_name}'#{threshold})")
|
12
13
|
result[0]["quick_count"].to_i
|
13
14
|
end
|
14
15
|
|
data/lib/quick_count/version.rb
CHANGED
data/quick_count.gemspec
CHANGED
@@ -10,6 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ['dale@twilightcoders.net']
|
11
11
|
|
12
12
|
spec.summary = 'Quickly get an accurate count estimation for large tables.'
|
13
|
+
spec.description = 'Installs two database functions, `quick_count` and `count_estimate` for getting count estimations on large tables'
|
13
14
|
spec.homepage = "https://github.com/TwilightCoders/quick_count"
|
14
15
|
spec.license = 'MIT'
|
15
16
|
|
@@ -21,23 +22,22 @@ Gem::Specification.new do |spec|
|
|
21
22
|
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
22
23
|
end
|
23
24
|
|
24
|
-
spec.files = `git ls-files -z`.split("\x0")
|
25
|
-
spec.bindir = '
|
26
|
-
spec.executables = spec.files.grep(%r{^
|
27
|
-
spec.test_files = spec.files.grep(%r{^spec/})
|
28
|
-
spec.require_paths = ['lib']
|
25
|
+
spec.files = `git ls-files -z`.split("\x0")
|
26
|
+
spec.bindir = 'bin'
|
27
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
28
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
29
|
+
spec.require_paths = ['lib', 'spec']
|
29
30
|
|
30
|
-
|
31
|
+
rails_versions = ['>= 4', '< 6']
|
32
|
+
spec.required_ruby_version = '>= 2.0'
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
-
spec.add_runtime_dependency 'pg', ['>= 0.12.0', '< 0.30.0']
|
34
|
+
spec.add_runtime_dependency 'pg', '~> 0'
|
35
35
|
spec.add_runtime_dependency 'activerecord', rails_versions
|
36
|
-
spec.add_runtime_dependency 'activesupport', rails_versions
|
37
|
-
spec.add_runtime_dependency 'activemodel', rails_versions
|
38
36
|
spec.add_runtime_dependency 'railties', rails_versions
|
39
37
|
|
40
|
-
spec.add_development_dependency '
|
41
|
-
spec.add_development_dependency '
|
42
|
-
spec.add_development_dependency '
|
38
|
+
spec.add_development_dependency 'pry-byebug', '~> 3'
|
39
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
40
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
41
|
+
spec.add_development_dependency 'combustion', '~> 0.7'
|
42
|
+
|
43
43
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe QuickCount do
|
4
|
+
it "is present in models" do
|
5
|
+
expect(Post).to respond_to(:quick_count)
|
6
|
+
expect(Post.all).to respond_to(:count_estimate)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "returns the correct count" do
|
10
|
+
expect(Post.quick_count).to be(0)
|
11
|
+
expect(Post.all.count_estimate).to be > 0
|
12
|
+
end
|
13
|
+
|
14
|
+
it "root has the right value" do
|
15
|
+
expect(QuickCount.root).not_to be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
ENV['RAILS_ENV'] = 'test'
|
2
|
+
|
3
|
+
require 'database_cleaner'
|
4
|
+
require 'combustion'
|
5
|
+
|
6
|
+
require 'simplecov'
|
7
|
+
SimpleCov.start do
|
8
|
+
add_filter 'spec'
|
9
|
+
end
|
10
|
+
|
11
|
+
Combustion.path = 'spec/support/rails'
|
12
|
+
Combustion.initialize! :active_record
|
13
|
+
|
14
|
+
schema = "quick_count"
|
15
|
+
|
16
|
+
RSpec.configure do |config|
|
17
|
+
config.order = "random"
|
18
|
+
|
19
|
+
config.before(:suite) do
|
20
|
+
ActiveRecord::Base.connection.execute("CREATE SCHEMA #{schema}")
|
21
|
+
QuickCount.install(schema: schema)
|
22
|
+
end
|
23
|
+
|
24
|
+
config.after(:suite) do
|
25
|
+
QuickCount.uninstall(schema: schema)
|
26
|
+
ActiveRecord::Base.connection.execute("DROP SCHEMA #{schema}")
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
*.log
|
File without changes
|
metadata
CHANGED
@@ -1,62 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quick_count
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dale Stevens
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.12.0
|
20
|
-
- - "<"
|
17
|
+
- - "~>"
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0
|
19
|
+
version: '0'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 0.12.0
|
30
|
-
- - "<"
|
24
|
+
- - "~>"
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0
|
26
|
+
version: '0'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: activerecord
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
31
|
- - ">="
|
38
32
|
- !ruby/object:Gem::Version
|
39
|
-
version: '4
|
40
|
-
- - "<"
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: '6'
|
43
|
-
type: :runtime
|
44
|
-
prerelease: false
|
45
|
-
version_requirements: !ruby/object:Gem::Requirement
|
46
|
-
requirements:
|
47
|
-
- - ">="
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: '4.1'
|
50
|
-
- - "<"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: '6'
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: activesupport
|
55
|
-
requirement: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
57
|
-
- - ">="
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version: '4.1'
|
33
|
+
version: '4'
|
60
34
|
- - "<"
|
61
35
|
- !ruby/object:Gem::Version
|
62
36
|
version: '6'
|
@@ -66,17 +40,17 @@ dependencies:
|
|
66
40
|
requirements:
|
67
41
|
- - ">="
|
68
42
|
- !ruby/object:Gem::Version
|
69
|
-
version: '4
|
43
|
+
version: '4'
|
70
44
|
- - "<"
|
71
45
|
- !ruby/object:Gem::Version
|
72
46
|
version: '6'
|
73
47
|
- !ruby/object:Gem::Dependency
|
74
|
-
name:
|
48
|
+
name: railties
|
75
49
|
requirement: !ruby/object:Gem::Requirement
|
76
50
|
requirements:
|
77
51
|
- - ">="
|
78
52
|
- !ruby/object:Gem::Version
|
79
|
-
version: '4
|
53
|
+
version: '4'
|
80
54
|
- - "<"
|
81
55
|
- !ruby/object:Gem::Version
|
82
56
|
version: '6'
|
@@ -86,73 +60,68 @@ dependencies:
|
|
86
60
|
requirements:
|
87
61
|
- - ">="
|
88
62
|
- !ruby/object:Gem::Version
|
89
|
-
version: '4
|
63
|
+
version: '4'
|
90
64
|
- - "<"
|
91
65
|
- !ruby/object:Gem::Version
|
92
66
|
version: '6'
|
93
67
|
- !ruby/object:Gem::Dependency
|
94
|
-
name:
|
68
|
+
name: pry-byebug
|
95
69
|
requirement: !ruby/object:Gem::Requirement
|
96
70
|
requirements:
|
97
|
-
- - "
|
98
|
-
- !ruby/object:Gem::Version
|
99
|
-
version: '4.1'
|
100
|
-
- - "<"
|
71
|
+
- - "~>"
|
101
72
|
- !ruby/object:Gem::Version
|
102
|
-
version: '
|
103
|
-
type: :
|
73
|
+
version: '3'
|
74
|
+
type: :development
|
104
75
|
prerelease: false
|
105
76
|
version_requirements: !ruby/object:Gem::Requirement
|
106
77
|
requirements:
|
107
|
-
- - "
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '4.1'
|
110
|
-
- - "<"
|
78
|
+
- - "~>"
|
111
79
|
- !ruby/object:Gem::Version
|
112
|
-
version: '
|
80
|
+
version: '3'
|
113
81
|
- !ruby/object:Gem::Dependency
|
114
82
|
name: bundler
|
115
83
|
requirement: !ruby/object:Gem::Requirement
|
116
84
|
requirements:
|
117
85
|
- - "~>"
|
118
86
|
- !ruby/object:Gem::Version
|
119
|
-
version: '1.
|
87
|
+
version: '1.3'
|
120
88
|
type: :development
|
121
89
|
prerelease: false
|
122
90
|
version_requirements: !ruby/object:Gem::Requirement
|
123
91
|
requirements:
|
124
92
|
- - "~>"
|
125
93
|
- !ruby/object:Gem::Version
|
126
|
-
version: '1.
|
94
|
+
version: '1.3'
|
127
95
|
- !ruby/object:Gem::Dependency
|
128
|
-
name:
|
96
|
+
name: rake
|
129
97
|
requirement: !ruby/object:Gem::Requirement
|
130
98
|
requirements:
|
131
99
|
- - "~>"
|
132
100
|
- !ruby/object:Gem::Version
|
133
|
-
version: '
|
101
|
+
version: '12.0'
|
134
102
|
type: :development
|
135
103
|
prerelease: false
|
136
104
|
version_requirements: !ruby/object:Gem::Requirement
|
137
105
|
requirements:
|
138
106
|
- - "~>"
|
139
107
|
- !ruby/object:Gem::Version
|
140
|
-
version: '
|
108
|
+
version: '12.0'
|
141
109
|
- !ruby/object:Gem::Dependency
|
142
|
-
name:
|
110
|
+
name: combustion
|
143
111
|
requirement: !ruby/object:Gem::Requirement
|
144
112
|
requirements:
|
145
113
|
- - "~>"
|
146
114
|
- !ruby/object:Gem::Version
|
147
|
-
version: '0'
|
115
|
+
version: '0.7'
|
148
116
|
type: :development
|
149
117
|
prerelease: false
|
150
118
|
version_requirements: !ruby/object:Gem::Requirement
|
151
119
|
requirements:
|
152
120
|
- - "~>"
|
153
121
|
- !ruby/object:Gem::Version
|
154
|
-
version: '0'
|
155
|
-
description:
|
122
|
+
version: '0.7'
|
123
|
+
description: Installs two database functions, `quick_count` and `count_estimate` for
|
124
|
+
getting count estimations on large tables
|
156
125
|
email:
|
157
126
|
- dale@twilightcoders.net
|
158
127
|
executables: []
|
@@ -160,17 +129,32 @@ extensions: []
|
|
160
129
|
extra_rdoc_files: []
|
161
130
|
files:
|
162
131
|
- ".gitignore"
|
132
|
+
- ".travis.yml"
|
133
|
+
- CHANGELOG.md
|
163
134
|
- Gemfile
|
164
|
-
- Gemfile.lock
|
165
135
|
- MIT-LICENSE
|
166
136
|
- README.md
|
167
137
|
- Rakefile
|
138
|
+
- gemfiles/activerecord-4.0.Gemfile
|
139
|
+
- gemfiles/activerecord-4.1.Gemfile
|
140
|
+
- gemfiles/activerecord-4.2.Gemfile
|
141
|
+
- gemfiles/activerecord-5.0.Gemfile
|
142
|
+
- gemfiles/activerecord-5.1.Gemfile
|
168
143
|
- lib/count_estimate/active_record/relation.rb
|
169
144
|
- lib/quick_count.rb
|
170
145
|
- lib/quick_count/active_record/base.rb
|
171
146
|
- lib/quick_count/railtie.rb
|
172
147
|
- lib/quick_count/version.rb
|
173
148
|
- quick_count.gemspec
|
149
|
+
- spec/quick_count_spec.rb
|
150
|
+
- spec/spec_helper.rb
|
151
|
+
- spec/support/rails/app/models/post.rb
|
152
|
+
- spec/support/rails/app/models/user.rb
|
153
|
+
- spec/support/rails/config/database.yml
|
154
|
+
- spec/support/rails/config/routes.rb
|
155
|
+
- spec/support/rails/db/schema.rb
|
156
|
+
- spec/support/rails/log/.gitignore
|
157
|
+
- spec/support/rails/public/favicon.ico
|
174
158
|
homepage: https://github.com/TwilightCoders/quick_count
|
175
159
|
licenses:
|
176
160
|
- MIT
|
@@ -180,11 +164,12 @@ post_install_message:
|
|
180
164
|
rdoc_options: []
|
181
165
|
require_paths:
|
182
166
|
- lib
|
167
|
+
- spec
|
183
168
|
required_ruby_version: !ruby/object:Gem::Requirement
|
184
169
|
requirements:
|
185
|
-
- - "
|
170
|
+
- - ">="
|
186
171
|
- !ruby/object:Gem::Version
|
187
|
-
version: '2.
|
172
|
+
version: '2.0'
|
188
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
189
174
|
requirements:
|
190
175
|
- - ">="
|
@@ -192,8 +177,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
177
|
version: '0'
|
193
178
|
requirements: []
|
194
179
|
rubyforge_project:
|
195
|
-
rubygems_version: 2.
|
180
|
+
rubygems_version: 2.7.5
|
196
181
|
signing_key:
|
197
182
|
specification_version: 4
|
198
183
|
summary: Quickly get an accurate count estimation for large tables.
|
199
|
-
test_files:
|
184
|
+
test_files:
|
185
|
+
- spec/quick_count_spec.rb
|
186
|
+
- spec/spec_helper.rb
|
187
|
+
- spec/support/rails/app/models/post.rb
|
188
|
+
- spec/support/rails/app/models/user.rb
|
189
|
+
- spec/support/rails/config/database.yml
|
190
|
+
- spec/support/rails/config/routes.rb
|
191
|
+
- spec/support/rails/db/schema.rb
|
192
|
+
- spec/support/rails/log/.gitignore
|
193
|
+
- spec/support/rails/public/favicon.ico
|
data/Gemfile.lock
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
quick_count (0.0.1)
|
5
|
-
activemodel (>= 4.1, < 6)
|
6
|
-
activerecord (>= 4.1, < 6)
|
7
|
-
activesupport (>= 4.1, < 6)
|
8
|
-
pg (>= 0.12.0, < 0.30.0)
|
9
|
-
railties (>= 4.1, < 6)
|
10
|
-
|
11
|
-
GEM
|
12
|
-
remote: https://rubygems.org/
|
13
|
-
specs:
|
14
|
-
actionpack (5.0.2)
|
15
|
-
actionview (= 5.0.2)
|
16
|
-
activesupport (= 5.0.2)
|
17
|
-
rack (~> 2.0)
|
18
|
-
rack-test (~> 0.6.3)
|
19
|
-
rails-dom-testing (~> 2.0)
|
20
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
21
|
-
actionview (5.0.2)
|
22
|
-
activesupport (= 5.0.2)
|
23
|
-
builder (~> 3.1)
|
24
|
-
erubis (~> 2.7.0)
|
25
|
-
rails-dom-testing (~> 2.0)
|
26
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
27
|
-
activemodel (5.0.2)
|
28
|
-
activesupport (= 5.0.2)
|
29
|
-
activerecord (5.0.2)
|
30
|
-
activemodel (= 5.0.2)
|
31
|
-
activesupport (= 5.0.2)
|
32
|
-
arel (~> 7.0)
|
33
|
-
activesupport (5.0.2)
|
34
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
35
|
-
i18n (~> 0.7)
|
36
|
-
minitest (~> 5.1)
|
37
|
-
tzinfo (~> 1.1)
|
38
|
-
arel (7.1.4)
|
39
|
-
builder (3.2.3)
|
40
|
-
coderay (1.1.1)
|
41
|
-
concurrent-ruby (1.0.5)
|
42
|
-
diff-lcs (1.3)
|
43
|
-
erubis (2.7.0)
|
44
|
-
i18n (0.8.1)
|
45
|
-
loofah (2.0.3)
|
46
|
-
nokogiri (>= 1.5.9)
|
47
|
-
method_source (0.8.2)
|
48
|
-
mini_portile2 (2.1.0)
|
49
|
-
minitest (5.10.1)
|
50
|
-
nokogiri (1.7.1)
|
51
|
-
mini_portile2 (~> 2.1.0)
|
52
|
-
pg (0.20.0)
|
53
|
-
pry (0.10.4)
|
54
|
-
coderay (~> 1.1.0)
|
55
|
-
method_source (~> 0.8.1)
|
56
|
-
slop (~> 3.4)
|
57
|
-
rack (2.0.1)
|
58
|
-
rack-test (0.6.3)
|
59
|
-
rack (>= 1.0)
|
60
|
-
rails-dom-testing (2.0.2)
|
61
|
-
activesupport (>= 4.2.0, < 6.0)
|
62
|
-
nokogiri (~> 1.6)
|
63
|
-
rails-html-sanitizer (1.0.3)
|
64
|
-
loofah (~> 2.0)
|
65
|
-
railties (5.0.2)
|
66
|
-
actionpack (= 5.0.2)
|
67
|
-
activesupport (= 5.0.2)
|
68
|
-
method_source
|
69
|
-
rake (>= 0.8.7)
|
70
|
-
thor (>= 0.18.1, < 2.0)
|
71
|
-
rake (12.0.0)
|
72
|
-
rspec (3.5.0)
|
73
|
-
rspec-core (~> 3.5.0)
|
74
|
-
rspec-expectations (~> 3.5.0)
|
75
|
-
rspec-mocks (~> 3.5.0)
|
76
|
-
rspec-core (3.5.4)
|
77
|
-
rspec-support (~> 3.5.0)
|
78
|
-
rspec-expectations (3.5.0)
|
79
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
80
|
-
rspec-support (~> 3.5.0)
|
81
|
-
rspec-mocks (3.5.0)
|
82
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
83
|
-
rspec-support (~> 3.5.0)
|
84
|
-
rspec-support (3.5.0)
|
85
|
-
slop (3.6.0)
|
86
|
-
thor (0.19.4)
|
87
|
-
thread_safe (0.3.6)
|
88
|
-
tzinfo (1.2.3)
|
89
|
-
thread_safe (~> 0.1)
|
90
|
-
|
91
|
-
PLATFORMS
|
92
|
-
ruby
|
93
|
-
|
94
|
-
DEPENDENCIES
|
95
|
-
activerecord-jdbcpostgresql-adapter
|
96
|
-
bundler (~> 1.5)
|
97
|
-
pg
|
98
|
-
pry (~> 0)
|
99
|
-
quick_count!
|
100
|
-
rspec (~> 3.3)
|
101
|
-
|
102
|
-
BUNDLED WITH
|
103
|
-
1.13.6
|