quick_count 0.0.5 → 0.0.6
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 +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
|
+
[](https://rubygems.org/gems/quick_count)
|
2
|
+
[](https://travis-ci.org/TwilightCoders/quick_count)
|
3
|
+
[](https://codeclimate.com/github/TwilightCoders/quick_count/maintainability)
|
4
|
+
[](https://codeclimate.com/github/TwilightCoders/quick_count/coverage)
|
5
|
+
[](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
|