active_median 0.2.2 → 0.2.3

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
  SHA256:
3
- metadata.gz: cf284681e30c58d0007a57126dc72e61f952f5d49ffc4e57cdec17f6c2f10fff
4
- data.tar.gz: 1dca9e20643055bd0ab0978ef48d22034c5e5aea1fdd983db46a031040843d20
3
+ metadata.gz: 47d759f5155e0a9687eeb845cf25a65daae5fe2a475bed1dcc071b742413b8c4
4
+ data.tar.gz: 9eb8b10f9ff8526adcea04beb4fa68fb11e61b544f11413925280c5d37f10e2b
5
5
  SHA512:
6
- metadata.gz: 49458af0dab24314e50668dcf8ecf4b9133c042c7cca5ff30b6caaae118fdfdfc635af3732f8b07e3923547c9addf28d09b86a6ba68401b454d938229b3150cd
7
- data.tar.gz: d3f37b499830cb8d3cad119c0d4eadb5fc4c4f6bee0e095e4767fddc81c8fc4a1fd89d98270ef130d0dff346db95abfa179d7de2519c6201e2829ba20015611d
6
+ metadata.gz: af49d340ff2b1298d1706381a7879ac3666e9077a56607c2d8809b132f93eef3eb8beb9996aa7599157a3d900ad3951e606413cb936f23d045115d8baead0121
7
+ data.tar.gz: ed82a1e318b79372aace81c56d2ca9bd9c59f373be5795f2e595fc8a60c7a7bdd9f9191e5a46069c4ea7405347e3057abb3c1ad6ae794a252cdce6de7f5411b6
@@ -1,3 +1,8 @@
1
+ ## 0.2.3
2
+
3
+ - Added support for Mongoid
4
+ - Dropped support for Rails 4.2
5
+
1
6
  ## 0.2.2
2
7
 
3
8
  - Added support for MySQL with udf_infusion
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 Andrew Kane
1
+ Copyright (c) 2013-2019 Andrew Kane
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ActiveMedian
2
2
 
3
- Median for ActiveRecord
3
+ Median for Active Record, Mongoid, arrays, and hashes
4
4
 
5
5
  Supports:
6
6
 
@@ -8,13 +8,22 @@ Supports:
8
8
  - MariaDB 10.3.3+
9
9
  - MySQL and SQL (with extensions)
10
10
  - SQL Server 2012+
11
- - Arrays and hashes
12
11
 
13
12
  :fire: Uses native functions for blazing performance
14
13
 
15
14
  [![Build Status](https://travis-ci.org/ankane/active_median.svg)](https://travis-ci.org/ankane/active_median)
16
15
 
17
- ## Usage
16
+ ## Getting Started
17
+
18
+ Add this line to your application’s Gemfile:
19
+
20
+ ```ruby
21
+ gem 'active_median'
22
+ ```
23
+
24
+ For MySQL and SQLite, also follow [these instructions](#additional-instructions).
25
+
26
+ ## Models
18
27
 
19
28
  ```ruby
20
29
  Item.median(:price)
@@ -51,15 +60,7 @@ raise "Unpermitted column" unless ["column_a", "column_b"].include?(column)
51
60
  User.median(column)
52
61
  ```
53
62
 
54
- ## Installation
55
-
56
- Add this line to your application’s Gemfile:
57
-
58
- ```ruby
59
- gem 'active_median'
60
- ```
61
-
62
- For MySQL and SQLite, also follow the instructions below.
63
+ ## Additional Instructions
63
64
 
64
65
  ### MySQL
65
66
 
@@ -95,7 +96,7 @@ db.enable_load_extension(0)
95
96
 
96
97
  ### 0.2.0
97
98
 
98
- A user-defined function is no longer needed. Create a migration with `ActiveMedian.drop_function` to remove it.
99
+ A user-defined function is no longer needed for Postgres. Create a migration with `ActiveMedian.drop_function` to remove it.
99
100
 
100
101
  ## Contributing
101
102
 
@@ -1,6 +1,5 @@
1
1
  require "active_support"
2
2
 
3
- require "active_median/model"
4
3
  require "active_median/enumerable"
5
4
  require "active_median/version"
6
5
 
@@ -15,5 +14,11 @@ module ActiveMedian
15
14
  end
16
15
 
17
16
  ActiveSupport.on_load(:active_record) do
17
+ require "active_median/model"
18
18
  extend(ActiveMedian::Model)
19
19
  end
20
+
21
+ ActiveSupport.on_load(:mongoid) do
22
+ require "active_median/mongoid"
23
+ Mongoid::Document::ClassMethods.include(ActiveMedian::Mongoid)
24
+ end
@@ -1,8 +1,10 @@
1
1
  module Enumerable
2
2
  unless method_defined?(:median)
3
3
  def median(*args, &block)
4
- if respond_to?(:scoping) && !block
4
+ if !block && respond_to?(:scoping)
5
5
  scoping { @klass.median(*args) }
6
+ elsif !block && respond_to?(:with_scope)
7
+ with_scope(self) { klass.median(*args) }
6
8
  else
7
9
  sorted = map(&block).sort
8
10
  len = sorted.length
@@ -39,9 +39,8 @@ module ActiveMedian
39
39
  # typecast
40
40
  rows = []
41
41
  columns = result.columns
42
- cast_method = ActiveRecord::VERSION::MAJOR < 5 ? :type_cast : :cast_value
43
42
  result.rows.each do |untyped_row|
44
- rows << (result.column_types.empty? ? untyped_row : columns.each_with_index.map { |c, i| untyped_row[i] ? result.column_types[c].send(cast_method, untyped_row[i]) : untyped_row[i] })
43
+ rows << (result.column_types.empty? ? untyped_row : columns.each_with_index.map { |c, i| untyped_row[i] ? result.column_types[c].send(:cast_value, untyped_row[i]) : untyped_row[i] })
45
44
  end
46
45
 
47
46
  result =
@@ -0,0 +1,21 @@
1
+ module ActiveMedian
2
+ module Mongoid
3
+ # https://www.compose.com/articles/mongo-metrics-finding-a-happy-median/
4
+ def median(column)
5
+ relation =
6
+ all
7
+ .group(_id: nil, count: {"$sum" => 1}, values: {"$push" => "$#{column}"})
8
+ .unwind("$values")
9
+ .asc(:values)
10
+ .project(count: {"$subtract" => ["$count", 1]}, values: 1)
11
+ .project(count: 1, values: 1, midpoint: {"$divide" => ["$count", 2]})
12
+ .project(count: 1, values: 1, midpoint: 1, high: {"$ceil" => "$midpoint"}, low: {"$floor" => "$midpoint"})
13
+ .group(_id: nil, values: {"$push" => "$values"}, high: {"$avg" => "$high"}, low: {"$avg" => "$low"})
14
+ .project(beginValue: {"$arrayElemAt" => ["$values", "$high"]}, endValue: {"$arrayElemAt" => ["$values", "$low"]})
15
+ .project(median: {"$avg" => ["$beginValue", "$endValue"]})
16
+
17
+ res = collection.aggregate(relation.pipeline).first
18
+ res ? res["median"] : nil
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveMedian
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_median
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-29 00:00:00.000000000 Z
11
+ date: 2019-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activerecord
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.2'
19
+ version: '5'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '4.2'
26
+ version: '5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: pg
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "<"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '1'
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: '1'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activerecord
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: groupdate
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -106,6 +120,7 @@ files:
106
120
  - lib/active_median.rb
107
121
  - lib/active_median/enumerable.rb
108
122
  - lib/active_median/model.rb
123
+ - lib/active_median/mongoid.rb
109
124
  - lib/active_median/version.rb
110
125
  homepage: https://github.com/ankane/active_median
111
126
  licenses:
@@ -119,16 +134,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
119
134
  requirements:
120
135
  - - ">="
121
136
  - !ruby/object:Gem::Version
122
- version: '2.2'
137
+ version: '2.4'
123
138
  required_rubygems_version: !ruby/object:Gem::Requirement
124
139
  requirements:
125
140
  - - ">="
126
141
  - !ruby/object:Gem::Version
127
142
  version: '0'
128
143
  requirements: []
129
- rubyforge_project:
130
- rubygems_version: 2.7.7
144
+ rubygems_version: 3.0.3
131
145
  signing_key:
132
146
  specification_version: 4
133
- summary: Median for ActiveRecord
147
+ summary: Median for Active Record, Mongoid, arrays, and hashes
134
148
  test_files: []