Dashboard next: correctly group inactive member count

This commit is contained in:
Gerhard Schlager 2018-05-03 22:54:48 +02:00
parent 41cd8c169c
commit ee426623e4
3 changed files with 49 additions and 34 deletions

View File

@ -138,7 +138,12 @@ class Report
data = User.real.count_by_inactivity(report.start_date, report.end_date) data = User.real.count_by_inactivity(report.start_date, report.end_date)
data.each do |data_point| data.each do |data_point|
report.data << { x: data_point["date_trunc"], y: data_point["count"] } report.data << { x: data_point["date"], y: data_point["count"] }
end
unless report.data.blank?
report.prev30Days = report.data.first[:y]
report.total = report.data.last[:y]
end end
end end

View File

@ -830,11 +830,17 @@ class User < ActiveRecord::Base
end end
def self.count_by_inactivity(start_date, end_date) def self.count_by_inactivity(start_date, end_date)
sql = <<SQL aggregation_unit = aggregation_unit_for_period(start_date, end_date)
sql = <<~SQL
SELECT SELECT
date_trunc('day', d.generated_date) :: DATE, date_trunc('#{aggregation_unit}', generated_date) :: DATE AS "date",
COUNT(u.id) max("count") AS "count"
FROM (SELECT generate_series('#{start_date}', '#{end_date}', '1 day' :: INTERVAL) :: DATE AS generated_date) d FROM (
SELECT
d.generated_date,
COUNT(1) AS "count"
FROM (SELECT generate_series(:start_date, :end_date, '1 day' :: INTERVAL) :: DATE AS generated_date) d
JOIN users u ON (u.created_at :: DATE <= d.generated_date) JOIN users u ON (u.created_at :: DATE <= d.generated_date)
WHERE u.active AND WHERE u.active AND
u.id > 0 AND u.id > 0 AND
@ -859,11 +865,13 @@ class User < ActiveRecord::Base
e.post_id IS NOT NULL AND e.post_id IS NOT NULL AND
e.created_at :: DATE BETWEEN (d.generated_date - INTERVAL '89 days') :: DATE AND d.generated_date e.created_at :: DATE BETWEEN (d.generated_date - INTERVAL '89 days') :: DATE AND d.generated_date
) )
GROUP BY date_trunc('day', d.generated_date) :: DATE GROUP BY d.generated_date
ORDER BY date_trunc('day', d.generated_date) :: DATE ) AS x
GROUP BY date_trunc('#{aggregation_unit}', generated_date) :: DATE
ORDER BY date_trunc('#{aggregation_unit}', generated_date) :: DATE
SQL SQL
exec_sql(sql).to_a exec_sql(sql, start_date: start_date, end_date: end_date).to_a
end end
def self.count_by_signup_date(start_date = nil, end_date = nil, group_id = nil) def self.count_by_signup_date(start_date = nil, end_date = nil, group_id = nil)

View File

@ -455,6 +455,8 @@ describe Report do
report = Report.find('inactive_users') report = Report.find('inactive_users')
expect(report.data.first[:y]).to eq(3) expect(report.data.first[:y]).to eq(3)
expect(report.data.last[:y]).to eq(5) expect(report.data.last[:y]).to eq(5)
expect(report.prev30Days).to eq(3)
expect(report.total).to eq(5)
@arpit.user_visits.create(visited_at: 80.days.ago) @arpit.user_visits.create(visited_at: 80.days.ago)
report = Report.find('inactive_users') report = Report.find('inactive_users')