From 408b49afacdb4f57d0c5e05bcf85699b2a435eef Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 23 Jul 2026 12:32:59 +0200 Subject: [PATCH] Fix performance of user-focused queries in admin dashboard (#39929) --- app/lib/admin/metrics/measure/new_users_measure.rb | 2 +- app/lib/admin/metrics/retention.rb | 2 +- .../metrics/measure/new_users_measure_spec.rb | 14 +++++++++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/lib/admin/metrics/measure/new_users_measure.rb b/app/lib/admin/metrics/measure/new_users_measure.rb index 32057154d6b..87848daa0c6 100644 --- a/app/lib/admin/metrics/measure/new_users_measure.rb +++ b/app/lib/admin/metrics/measure/new_users_measure.rb @@ -27,7 +27,7 @@ class Admin::Metrics::Measure::NewUsersMeasure < Admin::Metrics::Measure::BaseMe WITH new_users AS ( SELECT users.id FROM users - WHERE date_trunc('day', users.created_at)::date = axis.period + WHERE users.account_id >= (date_part('epoch', date_trunc('day', axis.period)::date) * 1000)::bigint << 16 AND users.account_id < ((date_part('epoch', date_trunc('day', axis.period)::date + ('1 day')::interval)) * 1000)::bigint << 16 ) SELECT count(*) FROM new_users ) AS value diff --git a/app/lib/admin/metrics/retention.rb b/app/lib/admin/metrics/retention.rb index 9bd47c58e4a..e5ce5496098 100644 --- a/app/lib/admin/metrics/retention.rb +++ b/app/lib/admin/metrics/retention.rb @@ -76,7 +76,7 @@ class Admin::Metrics::Retention WITH new_users AS ( SELECT users.id FROM users - WHERE date_trunc(:frequency, users.created_at)::date = axis.cohort_period + WHERE users.account_id >= (date_part('epoch', date_trunc(:frequency, axis.cohort_period)::date) * 1000)::bigint << 16 AND users.account_id < ((date_part('epoch', date_trunc(:frequency, axis.cohort_period)::date + ('1' || :frequency)::interval)) * 1000)::bigint << 16 ), retained_users AS ( SELECT users.id diff --git a/spec/lib/admin/metrics/measure/new_users_measure_spec.rb b/spec/lib/admin/metrics/measure/new_users_measure_spec.rb index 5c03b67a18c..9e973e2d0e7 100644 --- a/spec/lib/admin/metrics/measure/new_users_measure_spec.rb +++ b/spec/lib/admin/metrics/measure/new_users_measure_spec.rb @@ -12,9 +12,17 @@ RSpec.describe Admin::Metrics::Measure::NewUsersMeasure do describe '#data' do context 'with user records' do before do - 3.times { Fabricate :user, created_at: 2.days.ago } - 2.times { Fabricate :user, created_at: 1.day.ago } - Fabricate :user, created_at: 0.days.ago + travel_to 2.days.ago do + # We specify the `id` because `travel_to` doesn't affect the database + 3.times { Fabricate :account, id: Mastodon::Snowflake.id_at(Time.now.utc) } + end + + travel_to 1.day.ago do + # We specify the `id` because `travel_to` doesn't affect the database + 2.times { Fabricate :account, id: Mastodon::Snowflake.id_at(Time.now.utc) } + end + + Fabricate :user end it 'returns correct user counts' do