active_median 0.2.0 → 0.2.1
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 +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +27 -2
- data/lib/active_median.rb +1 -0
- data/lib/active_median/enumerable.rb +13 -0
- data/lib/active_median/model.rb +10 -5
- data/lib/active_median/version.rb +1 -1
- metadata +16 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfbbd982f15a11c2f820533f977d7d066e1a8f46a397155681ca06673cf44cc2
|
4
|
+
data.tar.gz: d2156aea58744c1d2955c00077f2b4ef064b2d541d8c69f0ca0a923d93ecbd29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5ff96c9f885f59dbc83dd1744fe427f67d1e43eefdb527fcb7e8994427452de186e12e8e0849bc1b15d3bcca2f65c0ec2a7403c631d2dba0f170b87bda074df
|
7
|
+
data.tar.gz: 39671ed1587132c3e54cf9bb1e44f3d9999e7435aacdb2438d03989e94e8cb29b3448663c06bb23fb45315609098d28dc557d0726db612dc290c0229b9a2361a
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Median for ActiveRecord
|
4
4
|
|
5
|
-
Supports PostgreSQL 9.4+, MariaDB 10.3.3+, and SQLite
|
5
|
+
Supports PostgreSQL 9.4+, MariaDB 10.3.3+, and SQLite, plus arrays and hashes
|
6
6
|
|
7
7
|
:fire: Uses native functions for blazing performance
|
8
8
|
|
@@ -17,7 +17,32 @@ Item.median(:price)
|
|
17
17
|
Works with grouping, too.
|
18
18
|
|
19
19
|
```ruby
|
20
|
-
Order.group(
|
20
|
+
Order.group(:store_id).median(:total)
|
21
|
+
```
|
22
|
+
|
23
|
+
## Arrays and Hashes
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
[1, 2, 3].median
|
27
|
+
```
|
28
|
+
|
29
|
+
You can also pass a block.
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
{a: 1, b: 2, c: 3}.median { |k, v| v }
|
33
|
+
```
|
34
|
+
|
35
|
+
## User Input
|
36
|
+
|
37
|
+
If passing user input as the column, be sure to sanitize it first [like you must](https://rails-sqli.org/) with other aggregate methods like `sum`.
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
column = params[:column]
|
41
|
+
|
42
|
+
# check against permitted columns
|
43
|
+
raise "Unpermitted column" unless ["column_a", "column_b"].include?(column)
|
44
|
+
|
45
|
+
User.median(column)
|
21
46
|
```
|
22
47
|
|
23
48
|
## Installation
|
data/lib/active_median.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
module Enumerable
|
2
|
+
unless method_defined?(:median)
|
3
|
+
def median(*args, &block)
|
4
|
+
if respond_to?(:scoping) && !block
|
5
|
+
scoping { @klass.median(*args) }
|
6
|
+
else
|
7
|
+
sorted = map(&block).sort
|
8
|
+
len = sorted.length
|
9
|
+
(sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/active_median/model.rb
CHANGED
@@ -27,11 +27,16 @@ module ActiveMedian
|
|
27
27
|
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] })
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
30
|
+
result =
|
31
|
+
if group_values.any?
|
32
|
+
Hash[rows.map { |r| [r.size == 2 ? r[0] : r[0..-2], r[-1]] }]
|
33
|
+
else
|
34
|
+
rows[0] && rows[0][0]
|
35
|
+
end
|
36
|
+
|
37
|
+
result = Groupdate.process_result(relation, result) if defined?(Groupdate.process_result)
|
38
|
+
|
39
|
+
result
|
35
40
|
end
|
36
41
|
end
|
37
42
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_median
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: groupdate
|
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
|
description:
|
84
98
|
email: andrew@chartkick.com
|
85
99
|
executables: []
|
@@ -90,6 +104,7 @@ files:
|
|
90
104
|
- LICENSE.txt
|
91
105
|
- README.md
|
92
106
|
- lib/active_median.rb
|
107
|
+
- lib/active_median/enumerable.rb
|
93
108
|
- lib/active_median/model.rb
|
94
109
|
- lib/active_median/version.rb
|
95
110
|
homepage: https://github.com/ankane/active_median
|