activerecord-summarize 0.2.3 → 0.3.0
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/Gemfile +3 -2
- data/Gemfile.lock +11 -8
- data/docs/use_case_moderator_dashboard.md +2 -0
- data/lib/activerecord/summarize/version.rb +1 -1
- data/lib/activerecord/summarize.rb +11 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbba2c0577555f891c1f860b76cc9f0194504d47d59922c8337afb9a1b3ab1a0
|
4
|
+
data.tar.gz: 3c1945b1652a4305ec4df2d13a0c5a6966e308018d2b34c5c21e396f02a1e31c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2a9e27420e30861c5c713e757ae66ead1af9d5aa9e10b259620b10d9289652464fc561745e720bae100cbda1b265e9f551cfd1f05c78f53c8dae39bfd788c33
|
7
|
+
data.tar.gz: 7e8632ae8ced794bdfb539624a64ebeef8d4a0a6568e3f625cca13b0d669365dd309981d351649c2af3a33f21c45e0fed2848853d581681dd0656d55b8163005
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
activerecord-summarize (0.
|
4
|
+
activerecord-summarize (0.3.0)
|
5
5
|
activerecord (>= 5.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activemodel (7.0.
|
11
|
-
activesupport (= 7.0.
|
12
|
-
activerecord (7.0.
|
13
|
-
activemodel (= 7.0.
|
14
|
-
activesupport (= 7.0.
|
15
|
-
activesupport (7.0.
|
10
|
+
activemodel (7.0.3)
|
11
|
+
activesupport (= 7.0.3)
|
12
|
+
activerecord (7.0.3)
|
13
|
+
activemodel (= 7.0.3)
|
14
|
+
activesupport (= 7.0.3)
|
15
|
+
activesupport (7.0.3)
|
16
16
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
17
17
|
i18n (>= 1.6, < 2)
|
18
18
|
minitest (>= 5.1)
|
19
19
|
tzinfo (~> 2.0)
|
20
20
|
ast (2.4.2)
|
21
|
-
concurrent-ruby (1.1.
|
21
|
+
concurrent-ruby (1.1.10)
|
22
22
|
i18n (1.10.0)
|
23
23
|
concurrent-ruby (~> 1.0)
|
24
24
|
minitest (5.15.0)
|
@@ -44,6 +44,7 @@ GEM
|
|
44
44
|
rubocop (>= 1.7.0, < 2.0)
|
45
45
|
rubocop-ast (>= 0.4.0)
|
46
46
|
ruby-progressbar (1.11.0)
|
47
|
+
sqlite3 (1.4.2)
|
47
48
|
standard (1.7.2)
|
48
49
|
rubocop (= 1.25.1)
|
49
50
|
rubocop-performance (= 1.13.2)
|
@@ -56,9 +57,11 @@ PLATFORMS
|
|
56
57
|
x86_64-linux
|
57
58
|
|
58
59
|
DEPENDENCIES
|
60
|
+
activerecord (= 7.0.3)
|
59
61
|
activerecord-summarize!
|
60
62
|
minitest (~> 5.0)
|
61
63
|
rake (~> 13.0)
|
64
|
+
sqlite3 (= 1.4.2)
|
62
65
|
standard (~> 1.3)
|
63
66
|
|
64
67
|
BUNDLED WITH
|
@@ -11,6 +11,8 @@ For each subreddit that a user moderates, the user should see these stats with r
|
|
11
11
|
- count of how many posts from this period were buried, i.e., ended up with negative karma
|
12
12
|
- grouped by post creation date, the percentage of posts that ended up being popular, where popular means having a karma score greater than a per-subreddit-configured threshold
|
13
13
|
- grouped by post creation day of the week, the average number of comments per non-buried post
|
14
|
+
|
15
|
+
> *Below, grouping by day of the week is handled with `.group("EXTRACT(DOW FROM posts.created_at)")`*
|
14
16
|
|
15
17
|
## Background
|
16
18
|
|
@@ -137,6 +137,10 @@ module ActiveRecord::Summarize
|
|
137
137
|
starting_values, reducers = @calculations.each_with_index.map do |f, i|
|
138
138
|
value_column = groups.size + i
|
139
139
|
group_columns = f.relation.group_values.map { |k| group_idx[k] }
|
140
|
+
# `row[value_column] || 0` pattern in reducers because SQL SUM(NULL)
|
141
|
+
# returns NULL, but like ActiveRecord we always want .sum to return a
|
142
|
+
# number, and our "starting_values and reducers" implementation means
|
143
|
+
# we sometimes will have to add NULL to our numbers.
|
140
144
|
case group_columns.size
|
141
145
|
when 0 then [
|
142
146
|
0,
|
@@ -145,14 +149,14 @@ module ActiveRecord::Summarize
|
|
145
149
|
when 1 then [
|
146
150
|
Hash.new(0), # Default 0 makes the reducer much cleaner, but we have to clean it up later
|
147
151
|
->(memo, row) {
|
148
|
-
memo[row[group_columns[0]]] += row[value_column] unless row[value_column].zero?
|
152
|
+
memo[row[group_columns[0]]] += row[value_column] unless (row[value_column] || 0).zero?
|
149
153
|
memo
|
150
154
|
}
|
151
155
|
]
|
152
156
|
else [
|
153
157
|
Hash.new(0),
|
154
158
|
->(memo, row) {
|
155
|
-
memo[group_columns.map { |i| row[i] }] += row[value_column] unless row[value_column].zero?
|
159
|
+
memo[group_columns.map { |i| row[i] }] += row[value_column] unless (row[value_column] || 0).zero?
|
156
160
|
memo
|
157
161
|
}
|
158
162
|
]
|
@@ -237,14 +241,14 @@ module ActiveRecord::Summarize
|
|
237
241
|
def select_value(base_relation)
|
238
242
|
where = relation.where_clause - base_relation.where_clause
|
239
243
|
for_select = column
|
240
|
-
for_select = Arel::Nodes::Case.new(where.ast).when(true, for_select).else(
|
244
|
+
for_select = Arel::Nodes::Case.new(where.ast).when(true, for_select).else(unmatch_arel_node) unless where.empty?
|
241
245
|
function.new([for_select]).tap { |f| f.distinct = relation.distinct_value }
|
242
246
|
end
|
243
247
|
|
244
|
-
def
|
248
|
+
def unmatch_arel_node
|
245
249
|
case method
|
246
|
-
when "sum" then 0
|
247
|
-
when "count" then nil
|
250
|
+
when "sum" then 0 # Adding zero to a sum does nothing
|
251
|
+
when "count" then nil # In SQL, null is no value and is not counted
|
248
252
|
else raise "Unknown calculation method"
|
249
253
|
end
|
250
254
|
end
|
@@ -272,6 +276,7 @@ module ActiveRecord::Summarize
|
|
272
276
|
case operation = operation.to_s.downcase
|
273
277
|
when "count", "sum"
|
274
278
|
column_name = :id if [nil, "*", :all].include? column_name
|
279
|
+
raise Unsummarizable, "DISTINCT in SQL is not reliably correct with summarize" if column_name.is_a?(String) && /\bdistinct\b/i === column_name
|
275
280
|
@summarize.add_calculation(self, operation, aggregate_column(column_name))
|
276
281
|
else super
|
277
282
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-summarize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Paine
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|