mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
Dashboard next: correctly group inactive member count
This commit is contained in:
parent
41cd8c169c
commit
ee426623e4
@ -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
|
||||||
|
|
||||||
|
@ -830,40 +830,48 @@ 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)
|
||||||
SELECT
|
|
||||||
date_trunc('day', d.generated_date) :: DATE,
|
|
||||||
COUNT(u.id)
|
|
||||||
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)
|
|
||||||
WHERE u.active AND
|
|
||||||
u.id > 0 AND
|
|
||||||
NOT EXISTS(
|
|
||||||
SELECT 1
|
|
||||||
FROM user_custom_fields ucf
|
|
||||||
WHERE
|
|
||||||
ucf.user_id = u.id AND
|
|
||||||
ucf.name = 'master_id' AND
|
|
||||||
ucf.value :: int > 0
|
|
||||||
) AND
|
|
||||||
NOT EXISTS(
|
|
||||||
SELECT 1
|
|
||||||
FROM user_visits v
|
|
||||||
WHERE v.visited_at BETWEEN (d.generated_date - INTERVAL '89 days') :: DATE AND d.generated_date
|
|
||||||
AND v.user_id = u.id
|
|
||||||
) AND
|
|
||||||
NOT EXISTS(
|
|
||||||
SELECT 1
|
|
||||||
FROM incoming_emails e
|
|
||||||
WHERE e.user_id = u.id AND
|
|
||||||
e.post_id IS NOT NULL AND
|
|
||||||
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
|
|
||||||
ORDER BY date_trunc('day', d.generated_date) :: DATE
|
|
||||||
SQL
|
|
||||||
|
|
||||||
exec_sql(sql).to_a
|
sql = <<~SQL
|
||||||
|
SELECT
|
||||||
|
date_trunc('#{aggregation_unit}', generated_date) :: DATE AS "date",
|
||||||
|
max("count") AS "count"
|
||||||
|
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)
|
||||||
|
WHERE u.active AND
|
||||||
|
u.id > 0 AND
|
||||||
|
NOT EXISTS(
|
||||||
|
SELECT 1
|
||||||
|
FROM user_custom_fields ucf
|
||||||
|
WHERE
|
||||||
|
ucf.user_id = u.id AND
|
||||||
|
ucf.name = 'master_id' AND
|
||||||
|
ucf.value :: int > 0
|
||||||
|
) AND
|
||||||
|
NOT EXISTS(
|
||||||
|
SELECT 1
|
||||||
|
FROM user_visits v
|
||||||
|
WHERE v.visited_at BETWEEN (d.generated_date - INTERVAL '89 days') :: DATE AND d.generated_date
|
||||||
|
AND v.user_id = u.id
|
||||||
|
) AND
|
||||||
|
NOT EXISTS(
|
||||||
|
SELECT 1
|
||||||
|
FROM incoming_emails e
|
||||||
|
WHERE e.user_id = u.id AND
|
||||||
|
e.post_id IS NOT NULL AND
|
||||||
|
e.created_at :: DATE BETWEEN (d.generated_date - INTERVAL '89 days') :: DATE AND d.generated_date
|
||||||
|
)
|
||||||
|
GROUP BY d.generated_date
|
||||||
|
) AS x
|
||||||
|
GROUP BY date_trunc('#{aggregation_unit}', generated_date) :: DATE
|
||||||
|
ORDER BY date_trunc('#{aggregation_unit}', generated_date) :: DATE
|
||||||
|
SQL
|
||||||
|
|
||||||
|
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)
|
||||||
|
@ -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')
|
||||||
|
Loading…
Reference in New Issue
Block a user