Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 47 additions & 9 deletions app/jobs/reports/daily_registrations_report.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ class DailyRegistrationsReport < BaseReport

attr_reader :report_date

include QueryHelpers

def perform(report_date)
@report_date = report_date

Expand All @@ -29,13 +31,14 @@ def finish
end

def report_body
results = (total_users.to_a + fully_registered_users.to_a).
results = [*total_users, *fully_registered_users, *deleted_users].
group_by { |row| row['date'] }.
map do |date, rows|
{
date: date,
total_users: rows.map { |r| r['total_users'] }.compact.first || 0,
fully_registered_users: rows.map { |r| r['fully_registered_users'] }.compact.first || 0,
deleted_users: rows.map { |r| r['deleted_users'] }.compact.first || 0,
}
end.sort_by { |elem| elem[:date] }

Expand All @@ -45,20 +48,32 @@ def report_body
}
end

# Queries for all the users that were ever created by date
# (includes users who were later deleted)
def total_users
params = {
finish: finish,
}.transform_values { |v| ActiveRecord::Base.connection.quote(v) }
}.transform_values { |v| quote(v) }

sql = format(<<-SQL, params)
SELECT
COUNT(*) AS total_users
, created_at::date AS date
FROM users
WHERE
created_at <= %{finish}
GROUP BY
created_at::date
, user_and_deleted_users.date AS date
FROM
(
SELECT created_at::date AS date
FROM users
WHERE users.created_at <= %{finish}

UNION ALL
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UNION ALL is probably not efficient, another approach would be to do the addition/joining in Ruby at the end, I could go either way. It's also a reporting query so I'm not overly concerned with efficiency? 🤷


SELECT deleted_users.user_created_at::date AS date
FROM deleted_users
WHERE
deleted_users.deleted_at <= %{finish}
AND deleted_users.user_created_at <= %{finish}
) user_and_deleted_users
GROUP BY user_and_deleted_users.date
SQL

transaction_with_timeout do
Expand All @@ -69,7 +84,7 @@ def total_users
def fully_registered_users
params = {
finish: finish,
}.transform_values { |v| ActiveRecord::Base.connection.quote(v) }
}.transform_values { |v| quote(v) }

sql = format(<<-SQL, params)
SELECT
Expand All @@ -86,5 +101,28 @@ def fully_registered_users
ActiveRecord::Base.connection.execute(sql)
end
end

# Queries for users who where deleted, groups by the date they were deleted at
def deleted_users
params = {
finish: finish,
}.transform_values { |v| quote(v) }

sql = format(<<-SQL, params)
SELECT
COUNT(*) AS deleted_users
, deleted_at::date AS date
FROM deleted_users
WHERE
deleted_at <= %{finish}
AND deleted_users.user_created_at <= %{finish}
GROUP BY
deleted_at::date
SQL

transaction_with_timeout do
ActiveRecord::Base.connection.execute(sql)
end
end
end
end
12 changes: 11 additions & 1 deletion spec/jobs/reports/daily_registration_report_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,14 @@
create_list(:user, 1, created_at: two_days_ago).each do |user|
RegistrationLog.create(user: user, registered_at: user.created_at)
end

# deleted, counts as total users
DeletedUser.create(
user_created_at: two_days_ago,
deleted_at: two_days_ago,
uuid: SecureRandom.uuid,
user_id: -1,
)
end

it 'calculates users and fully registered users by day' do
Expand All @@ -85,13 +93,15 @@
[
{
date: two_days_ago.to_date.as_json,
total_users: 2,
total_users: 3,
fully_registered_users: 1,
deleted_users: 1,
},
{
date: yesterday.to_date.as_json,
total_users: 4,
fully_registered_users: 2,
deleted_users: 0,
},
],
)
Expand Down