diff --git a/app/lib/admin/metrics/measure/instance_accounts_measure.rb b/app/lib/admin/metrics/measure/instance_accounts_measure.rb index 889a5e6f05f..31c4fd28548 100644 --- a/app/lib/admin/metrics/measure/instance_accounts_measure.rb +++ b/app/lib/admin/metrics/measure/instance_accounts_measure.rb @@ -31,21 +31,15 @@ class Admin::Metrics::Measure::InstanceAccountsMeasure < Admin::Metrics::Measure [sql_query_string, { start_at: @start_at, end_at: @end_at, domain: params[:domain] }] end - def sql_query_string - <<~SQL.squish - SELECT axis.*, ( - WITH new_accounts AS ( - SELECT accounts.id - FROM accounts - WHERE date_trunc('day', accounts.created_at)::date = axis.period + def data_source_query + Account + .select(:id) + .where( + <<~SQL.squish + DATE_TRUNC('day', accounts.created_at)::date = axis.period AND #{account_domain_sql(params[:include_subdomains])} - ) - SELECT count(*) FROM new_accounts - ) AS value - FROM ( - #{generated_series_days} - ) AS axis - SQL + SQL + ).to_sql end def params diff --git a/app/lib/admin/metrics/measure/instance_followers_measure.rb b/app/lib/admin/metrics/measure/instance_followers_measure.rb index fa934c6b96c..b5e61123831 100644 --- a/app/lib/admin/metrics/measure/instance_followers_measure.rb +++ b/app/lib/admin/metrics/measure/instance_followers_measure.rb @@ -31,22 +31,16 @@ class Admin::Metrics::Measure::InstanceFollowersMeasure < Admin::Metrics::Measur [sql_query_string, { start_at: @start_at, end_at: @end_at, domain: params[:domain] }] end - def sql_query_string - <<~SQL.squish - SELECT axis.*, ( - WITH new_followers AS ( - SELECT follows.id - FROM follows - INNER JOIN accounts ON follows.account_id = accounts.id - WHERE date_trunc('day', follows.created_at)::date = axis.period + def data_source_query + Follow + .select(:id) + .joins(:account) + .where( + <<~SQL.squish + DATE_TRUNC('day', follows.created_at)::date = axis.period AND #{account_domain_sql(params[:include_subdomains])} - ) - SELECT count(*) FROM new_followers - ) AS value - FROM ( - #{generated_series_days} - ) AS axis - SQL + SQL + ).to_sql end def params diff --git a/app/lib/admin/metrics/measure/instance_follows_measure.rb b/app/lib/admin/metrics/measure/instance_follows_measure.rb index 3f3ab73fc90..fe7fbdf4d09 100644 --- a/app/lib/admin/metrics/measure/instance_follows_measure.rb +++ b/app/lib/admin/metrics/measure/instance_follows_measure.rb @@ -31,22 +31,16 @@ class Admin::Metrics::Measure::InstanceFollowsMeasure < Admin::Metrics::Measure: [sql_query_string, { start_at: @start_at, end_at: @end_at, domain: params[:domain] }] end - def sql_query_string - <<~SQL.squish - SELECT axis.*, ( - WITH new_follows AS ( - SELECT follows.id - FROM follows - INNER JOIN accounts ON follows.target_account_id = accounts.id - WHERE date_trunc('day', follows.created_at)::date = axis.period + def data_source_query + Follow + .select(:id) + .joins(:target_account) + .where( + <<~SQL.squish + DATE_TRUNC('day', follows.created_at)::date = axis.period AND #{account_domain_sql(params[:include_subdomains])} - ) - SELECT count(*) FROM new_follows - ) AS value - FROM ( - #{generated_series_days} - ) AS axis - SQL + SQL + ).to_sql end def params diff --git a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb index 996ca52e0bb..03204329cd9 100644 --- a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb +++ b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb @@ -40,21 +40,19 @@ class Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure < Admin::Metrics: [sql_query_string, { start_at: @start_at, end_at: @end_at, domain: params[:domain] }] end - def sql_query_string + def data_source_query <<~SQL.squish - SELECT axis.*, ( - WITH new_media_attachments AS ( - SELECT COALESCE(media_attachments.file_file_size, 0) + COALESCE(media_attachments.thumbnail_file_size, 0) AS size - FROM media_attachments - INNER JOIN accounts ON accounts.id = media_attachments.account_id - WHERE date_trunc('day', media_attachments.created_at)::date = axis.period - AND #{account_domain_sql(params[:include_subdomains])} - ) - SELECT COALESCE(SUM(size), 0) FROM new_media_attachments - ) AS value - FROM ( - #{generated_series_days} - ) AS axis + SELECT COALESCE(media_attachments.file_file_size, 0) + COALESCE(media_attachments.thumbnail_file_size, 0) AS size + FROM media_attachments + INNER JOIN accounts ON accounts.id = media_attachments.account_id + WHERE date_trunc('day', media_attachments.created_at)::date = axis.period + AND #{account_domain_sql(params[:include_subdomains])} + SQL + end + + def select_target + <<~SQL.squish + COALESCE(SUM(size), 0) SQL end diff --git a/app/lib/admin/metrics/measure/instance_reports_measure.rb b/app/lib/admin/metrics/measure/instance_reports_measure.rb index ae1bb6e68de..757678690a9 100644 --- a/app/lib/admin/metrics/measure/instance_reports_measure.rb +++ b/app/lib/admin/metrics/measure/instance_reports_measure.rb @@ -31,22 +31,16 @@ class Admin::Metrics::Measure::InstanceReportsMeasure < Admin::Metrics::Measure: [sql_query_string, { start_at: @start_at, end_at: @end_at, domain: params[:domain] }] end - def sql_query_string - <<~SQL.squish - SELECT axis.*, ( - WITH new_reports AS ( - SELECT reports.id - FROM reports - INNER JOIN accounts ON accounts.id = reports.target_account_id - WHERE date_trunc('day', reports.created_at)::date = axis.period + def data_source_query + Report + .select(:id) + .joins(:target_account) + .where( + <<~SQL.squish + DATE_TRUNC('day', reports.created_at)::date = axis.period AND #{account_domain_sql(params[:include_subdomains])} - ) - SELECT count(*) FROM new_reports - ) AS value - FROM ( - #{generated_series_days} - ) AS axis - SQL + SQL + ).to_sql end def params diff --git a/app/lib/admin/metrics/measure/instance_statuses_measure.rb b/app/lib/admin/metrics/measure/instance_statuses_measure.rb index 324d427b18b..30b025c00ab 100644 --- a/app/lib/admin/metrics/measure/instance_statuses_measure.rb +++ b/app/lib/admin/metrics/measure/instance_statuses_measure.rb @@ -31,23 +31,17 @@ class Admin::Metrics::Measure::InstanceStatusesMeasure < Admin::Metrics::Measure [sql_query_string, { start_at: @start_at, end_at: @end_at, domain: params[:domain], earliest_status_id: earliest_status_id, latest_status_id: latest_status_id }] end - def sql_query_string - <<~SQL.squish - SELECT axis.*, ( - WITH new_statuses AS ( - SELECT statuses.id - FROM statuses - INNER JOIN accounts ON accounts.id = statuses.account_id - WHERE statuses.id BETWEEN :earliest_status_id AND :latest_status_id - AND #{account_domain_sql(params[:include_subdomains])} - AND date_trunc('day', statuses.created_at)::date = axis.period - ) - SELECT count(*) FROM new_statuses - ) AS value - FROM ( - #{generated_series_days} - ) AS axis - SQL + def data_source_query + Status + .select(:id) + .joins(:account) + .where( + <<~SQL.squish + statuses.id BETWEEN :earliest_status_id AND :latest_status_id + AND #{account_domain_sql(params[:include_subdomains])} + AND date_trunc('day', statuses.created_at)::date = axis.period + SQL + ).to_sql end def earliest_status_id diff --git a/app/lib/admin/metrics/measure/new_users_measure.rb b/app/lib/admin/metrics/measure/new_users_measure.rb index 32057154d6b..66334cd11c8 100644 --- a/app/lib/admin/metrics/measure/new_users_measure.rb +++ b/app/lib/admin/metrics/measure/new_users_measure.rb @@ -21,19 +21,13 @@ class Admin::Metrics::Measure::NewUsersMeasure < Admin::Metrics::Measure::BaseMe [sql_query_string, { start_at: @start_at, end_at: @end_at }] end - def sql_query_string - <<~SQL.squish - SELECT axis.*, ( - WITH new_users AS ( - SELECT users.id - FROM users - WHERE date_trunc('day', users.created_at)::date = axis.period - ) - SELECT count(*) FROM new_users - ) AS value - FROM ( - #{generated_series_days} - ) AS axis - SQL + def data_source_query + User + .select(:id) + .where( + <<~SQL.squish + DATE_TRUNC('day', users.created_at)::date = axis.period + SQL + ).to_sql end end diff --git a/app/lib/admin/metrics/measure/opened_reports_measure.rb b/app/lib/admin/metrics/measure/opened_reports_measure.rb index 47de38bbe64..9628dd5c7da 100644 --- a/app/lib/admin/metrics/measure/opened_reports_measure.rb +++ b/app/lib/admin/metrics/measure/opened_reports_measure.rb @@ -21,19 +21,13 @@ class Admin::Metrics::Measure::OpenedReportsMeasure < Admin::Metrics::Measure::B [sql_query_string, { start_at: @start_at, end_at: @end_at }] end - def sql_query_string - <<~SQL.squish - SELECT axis.*, ( - WITH new_reports AS ( - SELECT reports.id - FROM reports - WHERE date_trunc('day', reports.created_at)::date = axis.period - ) - SELECT count(*) FROM new_reports - ) AS value - FROM ( - #{generated_series_days} - ) AS axis - SQL + def data_source_query + Report + .select(:id) + .where( + <<~SQL.squish + DATE_TRUNC('day', reports.created_at)::date = axis.period + SQL + ).to_sql end end diff --git a/app/lib/admin/metrics/measure/query_helper.rb b/app/lib/admin/metrics/measure/query_helper.rb index 47cfc63e5c5..4145f3fa442 100644 --- a/app/lib/admin/metrics/measure/query_helper.rb +++ b/app/lib/admin/metrics/measure/query_helper.rb @@ -15,12 +15,22 @@ module Admin::Metrics::Measure::QueryHelper ActiveRecord::Base.sanitize_sql_array(sql_array) end - def generated_series_days - Arel.sql( - <<~SQL.squish + def sql_query_string + <<~SQL.squish + SELECT axis.*, ( + WITH data_source AS (#{data_source_query}) + SELECT #{select_target} FROM data_source + ) AS value + FROM ( SELECT generate_series(:start_at::timestamp, :end_at::timestamp, '1 day')::date AS period - SQL - ) + ) AS axis + SQL + end + + def select_target + <<~SQL.squish + COUNT(*) + SQL end def account_domain_sql(include_subdomains) diff --git a/app/lib/admin/metrics/measure/resolved_reports_measure.rb b/app/lib/admin/metrics/measure/resolved_reports_measure.rb index ecfd779c86a..5c7b1c320fd 100644 --- a/app/lib/admin/metrics/measure/resolved_reports_measure.rb +++ b/app/lib/admin/metrics/measure/resolved_reports_measure.rb @@ -21,19 +21,13 @@ class Admin::Metrics::Measure::ResolvedReportsMeasure < Admin::Metrics::Measure: [sql_query_string, { start_at: @start_at, end_at: @end_at }] end - def sql_query_string - <<~SQL.squish - SELECT axis.*, ( - WITH resolved_reports AS ( - SELECT reports.id - FROM reports - WHERE date_trunc('day', reports.action_taken_at)::date = axis.period - ) - SELECT count(*) FROM resolved_reports - ) AS value - FROM ( - #{generated_series_days} - ) AS axis - SQL + def data_source_query + Report + .select(:id) + .where( + <<~SQL.squish + DATE_TRUNC('day', reports.action_taken_at)::date = axis.period + SQL + ).to_sql end end diff --git a/app/lib/admin/metrics/measure/tag_servers_measure.rb b/app/lib/admin/metrics/measure/tag_servers_measure.rb index 5db1076062b..897067703c1 100644 --- a/app/lib/admin/metrics/measure/tag_servers_measure.rb +++ b/app/lib/admin/metrics/measure/tag_servers_measure.rb @@ -25,23 +25,15 @@ class Admin::Metrics::Measure::TagServersMeasure < Admin::Metrics::Measure::Base [sql_query_string, { start_at: @start_at, end_at: @end_at, tag_id: tag.id, earliest_status_id: earliest_status_id, latest_status_id: latest_status_id }] end - def sql_query_string + def data_source_query <<~SQL.squish - SELECT axis.*, ( - WITH tag_servers AS ( - SELECT DISTINCT accounts.domain - FROM statuses - INNER JOIN statuses_tags ON statuses.id = statuses_tags.status_id - INNER JOIN accounts ON statuses.account_id = accounts.id - WHERE statuses_tags.tag_id = :tag_id - AND statuses.id BETWEEN :earliest_status_id AND :latest_status_id - AND date_trunc('day', statuses.created_at)::date = axis.period - ) - SELECT COUNT(*) FROM tag_servers - ) AS value - FROM ( - #{generated_series_days} - ) as axis + SELECT DISTINCT accounts.domain + FROM statuses + INNER JOIN statuses_tags ON statuses.id = statuses_tags.status_id + INNER JOIN accounts ON statuses.account_id = accounts.id + WHERE statuses_tags.tag_id = :tag_id + AND statuses.id BETWEEN :earliest_status_id AND :latest_status_id + AND date_trunc('day', statuses.created_at)::date = axis.period SQL end