quick_count 0.0.1 → 0.0.2

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
2
  SHA1:
3
- metadata.gz: 0ae7f0ee1a739008ee5625dbbed9a42940592c9f
4
- data.tar.gz: 88a7d737a21479b990f46d1f9eda27e00e8b2a5b
3
+ metadata.gz: 2c460d264424aeda14e8f593465e17425dca7fac
4
+ data.tar.gz: b2e0b54686180053afc2726ab7186b690735f80c
5
5
  SHA512:
6
- metadata.gz: 21368a392aef71e6150be1482e60a7a9b74c5510e3e94f34efd401cebecdb4cba48557790176692f3a623ac351e9826d6636884c6ca20ab70917ad758b264951
7
- data.tar.gz: ff4a499e304bcac6ca0562606e80d5c19321437e46f7b60c23f58425d069b1e2d2f7bec6e2f9caeb1f127d0836d94f7d6b2a813f7855c5045b64e62ec60b53d8
6
+ metadata.gz: 82e0482436336ebcb1810d73e051435a7c215e1e0a73917b9d11464ecf15d8300f79634b1e15f9ae0223998798f0841629f5da2b7b55725c4d727f6b3a32d205
7
+ data.tar.gz: 855be602cff1d114638664896baaef61f1496085327851d66f0c1d7cc5b119cba150229a80a740989c768e98008d5c52b950647fa520ade73952032d80a5f844
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "https://rubygems.org"
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
+ gemspec
7
+
8
+ # Declare any dependencies that are still in development here instead of in
9
+ # your gemspec. These might include edge Rails or gems from your path or
10
+ # Git. Remember to move these dependencies to your gemspec before releasing
11
+ # your gem to rubygems.org.
12
+ group :development, :test do
13
+ gem 'pg', platform: :mri
14
+ gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
15
+ end
16
+
data/Gemfile.lock ADDED
@@ -0,0 +1,103 @@
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
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2017 Dale Stevens
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # QuickCount
2
+
3
+ Based on the answer http://stackoverflow.com/a/7945274/1454158.
4
+
5
+ It currently supports only Postgres.
6
+
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'quick_count'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ And in a rails console:
21
+
22
+ $ QuickCount.install
23
+
24
+ Or install it yourself as:
25
+
26
+ $ gem install quick_count
27
+
28
+ ## Usage
29
+
30
+ ```ruby
31
+ # user.rb
32
+
33
+ class User < ActiveRecord::Base
34
+
35
+ end
36
+
37
+ User.quick_count
38
+ ```
39
+
40
+
41
+ ## Uninstallation
42
+
43
+ Remove this line to your application's Gemfile:
44
+
45
+ ```ruby
46
+ gem 'quick_count'
47
+ ```
48
+
49
+ And then execute:
50
+
51
+ $ bundle
52
+
53
+ And in a rails console:
54
+
55
+ $ QuickCount.uninstall
56
+
57
+ ## License
58
+ Released under the MIT license - http://opensource.org/licenses/MIT
59
+
60
+ ## Development
61
+
62
+ 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.
63
+
64
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
65
+
66
+ ## Contributing
67
+
68
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/quick_count.
69
+
70
+
71
+ ## License
72
+
73
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,15 @@
1
+ require 'active_support/concern'
2
+
3
+ module CountEstimate
4
+ module ActiveRecord
5
+ module Relation
6
+
7
+ def count_estimate
8
+ my_statement = ::ActiveRecord::Base.connection.quote(to_sql)
9
+ result = ::ActiveRecord::Base.connection.execute("SELECT count_estimate(#{my_statement})")
10
+ result[0]["count_estimate"]
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ require 'active_support/concern'
2
+
3
+ module QuickCount
4
+ module ActiveRecord
5
+ module Base
6
+ extend ActiveSupport::Concern
7
+
8
+ module ClassMethods
9
+
10
+ def quick_count
11
+ result = ::ActiveRecord::Base.connection.execute("SELECT quick_count('#{table_name}')")
12
+ result[0]["quick_count"]
13
+ end
14
+
15
+ def count_estimate
16
+ my_statement = ::ActiveRecord::Base.connection.quote(to_sql)
17
+ result = ::ActiveRecord::Base.connection.execute("SELECT count_estimate(#{my_statement})")
18
+ result[0]["count_estimate"]
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ require 'rails/railtie'
2
+ require 'quick_count/active_record/base'
3
+ require 'count_estimate/active_record/relation'
4
+ require 'pry'
5
+
6
+ module QuickCount
7
+ class Railtie < Rails::Railtie
8
+
9
+ # rake_tasks do
10
+ # load "../tasks/quick_count_tasks.rake"
11
+ # end
12
+
13
+ initializer 'quick_count.load' do |app|
14
+ ActiveSupport.on_load(:active_record) do
15
+ QuickCount.load
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module QuickCount
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,64 @@
1
+ require 'quick_count/railtie'
2
+ require 'active_record'
3
+ require 'rake'
4
+
5
+ module QuickCount
6
+
7
+ def self.root
8
+ @root ||= Pathname.new(File.dirname(File.expand_path(File.dirname(__FILE__), '/../')))
9
+ end
10
+
11
+ def self.load
12
+ ::ActiveRecord::Base.send :include, QuickCount::ActiveRecord::Base
13
+ ::ActiveRecord::Relation.send :include, CountEstimate::ActiveRecord::Relation
14
+ end
15
+
16
+ def self.install
17
+ ::ActiveRecord::Base.connection.execute(<<-eos
18
+ CREATE OR REPLACE FUNCTION quick_count(table_name text) RETURNS bigint AS
19
+ $func$
20
+ DECLARE
21
+ rec record;
22
+ rows integer;
23
+ BEGIN
24
+ RETURN (SELECT SUM(estimate) AS estimate FROM (
25
+ SELECT
26
+ SUM(child.reltuples::bigint) AS estimate
27
+ FROM pg_inherits
28
+ JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
29
+ JOIN pg_class child ON pg_inherits.inhrelid = child.oid
30
+ JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
31
+ JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
32
+ WHERE parent.relname = table_name
33
+ GROUP BY parent.reltuples
34
+ UNION SELECT reltuples::bigint AS estimate FROM pg_class where relname=table_name) as tables);
35
+ END
36
+ $func$ LANGUAGE plpgsql;
37
+ eos
38
+ )
39
+ ::ActiveRecord::Base.connection.execute(<<-eos
40
+ CREATE OR REPLACE FUNCTION count_estimate(query text) RETURNS integer AS
41
+ $func$
42
+ DECLARE
43
+ rec record;
44
+ rows integer;
45
+ BEGIN
46
+ FOR rec IN EXECUTE 'EXPLAIN ' || query LOOP
47
+ rows := substring(rec."QUERY PLAN" FROM ' rows=([[:digit:]]+)');
48
+ EXIT WHEN rows IS NOT NULL;
49
+ END LOOP;
50
+
51
+ RETURN rows;
52
+ END
53
+ $func$ LANGUAGE plpgsql;
54
+ eos
55
+ )
56
+ end
57
+
58
+ def self.uninstall
59
+ ::ActiveRecord::Base.connection.execute("DROP FUNCTION quick_count(text);")
60
+ ::ActiveRecord::Base.connection.execute("DROP FUNCTION count_estimate(text);")
61
+ end
62
+
63
+ end
64
+
@@ -0,0 +1,43 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'quick_count/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'quick_count'
8
+ spec.version = QuickCount::VERSION
9
+ spec.authors = ['Dale Stevens']
10
+ spec.email = ['dale@twilightcoders.net']
11
+
12
+ spec.summary = 'Quickly get an accurate count estimation for large tables.'
13
+ spec.homepage = "https://github.com/TwilightCoders/quick_count"
14
+ spec.license = 'MIT'
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ if spec.respond_to?(:metadata)
19
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
20
+ else
21
+ raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
22
+ end
23
+
24
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ spec.bindir = 'exe'
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.test_files = spec.files.grep(%r{^spec/})
28
+ spec.require_paths = ['lib']
29
+
30
+ spec.required_ruby_version = '~> 2.1'
31
+
32
+ rails_versions = ['>= 4.1', '< 6']
33
+
34
+ spec.add_dependency 'pg', ['>= 0.12.0', '< 0.30.0']
35
+ spec.add_dependency 'activerecord', rails_versions
36
+ spec.add_dependency 'activesupport', rails_versions
37
+ spec.add_dependency 'activemodel', rails_versions
38
+ spec.add_dependency 'railties', rails_versions
39
+
40
+ spec.add_development_dependency 'bundler', '~> 1.5'
41
+ spec.add_development_dependency 'rspec', '~> 3.3'
42
+ spec.add_development_dependency 'pry', '~> 0'
43
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quick_count
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dale Stevens
@@ -158,7 +158,19 @@ email:
158
158
  executables: []
159
159
  extensions: []
160
160
  extra_rdoc_files: []
161
- files: []
161
+ files:
162
+ - ".gitignore"
163
+ - Gemfile
164
+ - Gemfile.lock
165
+ - MIT-LICENSE
166
+ - README.md
167
+ - Rakefile
168
+ - lib/count_estimate/active_record/relation.rb
169
+ - lib/quick_count.rb
170
+ - lib/quick_count/active_record/base.rb
171
+ - lib/quick_count/railtie.rb
172
+ - lib/quick_count/version.rb
173
+ - quick_count.gemspec
162
174
  homepage: https://github.com/TwilightCoders/quick_count
163
175
  licenses:
164
176
  - MIT