Skip to content

Commit

Permalink
Update Admin::Metrics::Measure classes for Rails 7 (mastodon#25236)
Browse files Browse the repository at this point in the history
  • Loading branch information
mjankowski committed Jun 5, 2023
1 parent e428670 commit af135bd
Show file tree
Hide file tree
Showing 25 changed files with 307 additions and 117 deletions.
24 changes: 9 additions & 15 deletions app/lib/admin/metrics/measure/instance_accounts_measure.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true

class Admin::Metrics::Measure::InstanceAccountsMeasure < Admin::Metrics::Measure::BaseMeasure
include Admin::Metrics::Measure::QueryHelper

def self.with_params?
true
end
Expand All @@ -25,33 +27,25 @@ def perform_previous_total_query
nil
end

def perform_data_query
account_matching_sql = begin
if params[:include_subdomains]
"accounts.domain IN (SELECT domain FROM instances WHERE reverse('.' || domain) LIKE reverse('.' || $3::text))"
else
'accounts.domain = $3::text'
end
end
def sql_array
[sql_query_string, { start_at: @start_at, end_at: @end_at, domain: params[:domain] }]
end

sql = <<-SQL.squish
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
AND #{account_matching_sql}
AND #{account_domain_sql(params[:include_subdomains])}
)
SELECT count(*) FROM new_accounts
) AS value
FROM (
SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period
) AS axis
SQL

rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, params[:domain]]])

rows.map { |row| { date: row['period'], value: row['value'].to_s } }
end

def time_period
Expand Down
24 changes: 9 additions & 15 deletions app/lib/admin/metrics/measure/instance_followers_measure.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true

class Admin::Metrics::Measure::InstanceFollowersMeasure < Admin::Metrics::Measure::BaseMeasure
include Admin::Metrics::Measure::QueryHelper

def self.with_params?
true
end
Expand All @@ -25,34 +27,26 @@ def perform_previous_total_query
nil
end

def perform_data_query
account_matching_sql = begin
if params[:include_subdomains]
"accounts.domain IN (SELECT domain FROM instances WHERE reverse('.' || domain) LIKE reverse('.' || $3::text))"
else
'accounts.domain = $3::text'
end
end
def sql_array
[sql_query_string, { start_at: @start_at, end_at: @end_at, domain: params[:domain] }]
end

sql = <<-SQL.squish
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
AND #{account_matching_sql}
AND #{account_domain_sql(params[:include_subdomains])}
)
SELECT count(*) FROM new_followers
) AS value
FROM (
SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period
) AS axis
SQL

rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, params[:domain]]])

rows.map { |row| { date: row['period'], value: row['value'].to_s } }
end

def time_period
Expand Down
24 changes: 9 additions & 15 deletions app/lib/admin/metrics/measure/instance_follows_measure.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true

class Admin::Metrics::Measure::InstanceFollowsMeasure < Admin::Metrics::Measure::BaseMeasure
include Admin::Metrics::Measure::QueryHelper

def self.with_params?
true
end
Expand All @@ -25,34 +27,26 @@ def perform_previous_total_query
nil
end

def perform_data_query
account_matching_sql = begin
if params[:include_subdomains]
"accounts.domain IN (SELECT domain FROM instances WHERE reverse('.' || domain) LIKE reverse('.' || $3::text))"
else
'accounts.domain = $3::text'
end
end
def sql_array
[sql_query_string, { start_at: @start_at, end_at: @end_at, domain: params[:domain] }]
end

sql = <<-SQL.squish
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
AND #{account_matching_sql}
AND #{account_domain_sql(params[:include_subdomains])}
)
SELECT count(*) FROM new_follows
) AS value
FROM (
SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period
) AS axis
SQL

rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, params[:domain]]])

rows.map { |row| { date: row['period'], value: row['value'].to_s } }
end

def time_period
Expand Down
@@ -1,6 +1,7 @@
# frozen_string_literal: true

class Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure < Admin::Metrics::Measure::BaseMeasure
include Admin::Metrics::Measure::QueryHelper
include ActionView::Helpers::NumberHelper

def self.with_params?
Expand Down Expand Up @@ -35,34 +36,26 @@ def perform_previous_total_query
nil
end

def perform_data_query
account_matching_sql = begin
if params[:include_subdomains]
"accounts.domain IN (SELECT domain FROM instances WHERE reverse('.' || domain) LIKE reverse('.' || $3::text))"
else
'accounts.domain = $3::text'
end
end
def sql_array
[sql_query_string, { start_at: @start_at, end_at: @end_at, domain: params[:domain] }]
end

sql = <<-SQL.squish
def sql_query_string
<<~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_matching_sql}
AND #{account_domain_sql(params[:include_subdomains])}
)
SELECT SUM(size) FROM new_media_attachments
) AS value
FROM (
SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period
) AS axis
SQL

rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, params[:domain]]])

rows.map { |row| { date: row['period'], value: row['value'].to_s } }
end

def time_period
Expand Down
24 changes: 9 additions & 15 deletions app/lib/admin/metrics/measure/instance_reports_measure.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true

class Admin::Metrics::Measure::InstanceReportsMeasure < Admin::Metrics::Measure::BaseMeasure
include Admin::Metrics::Measure::QueryHelper

def self.with_params?
true
end
Expand All @@ -25,34 +27,26 @@ def perform_previous_total_query
nil
end

def perform_data_query
account_matching_sql = begin
if params[:include_subdomains]
"accounts.domain IN (SELECT domain FROM instances WHERE reverse('.' || domain) LIKE reverse('.' || $3::text))"
else
'accounts.domain = $3::text'
end
end
def sql_array
[sql_query_string, { start_at: @start_at, end_at: @end_at, domain: params[:domain] }]
end

sql = <<-SQL.squish
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
AND #{account_matching_sql}
AND #{account_domain_sql(params[:include_subdomains])}
)
SELECT count(*) FROM new_reports
) AS value
FROM (
SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period
) AS axis
SQL

rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, params[:domain]]])

rows.map { |row| { date: row['period'], value: row['value'].to_s } }
end

def time_period
Expand Down
30 changes: 16 additions & 14 deletions app/lib/admin/metrics/measure/instance_statuses_measure.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true

class Admin::Metrics::Measure::InstanceStatusesMeasure < Admin::Metrics::Measure::BaseMeasure
include Admin::Metrics::Measure::QueryHelper

def self.with_params?
true
end
Expand All @@ -25,35 +27,35 @@ def perform_previous_total_query
nil
end

def perform_data_query
account_matching_sql = begin
if params[:include_subdomains]
"accounts.domain IN (SELECT domain FROM instances WHERE reverse('.' || domain) LIKE reverse('.' || $5::text))"
else
'accounts.domain = $5::text'
end
end
def sql_array
[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

sql = <<-SQL.squish
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 $3 AND $4
AND #{account_matching_sql}
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 (
SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period
) AS axis
SQL
end

rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, Mastodon::Snowflake.id_at(@start_at, with_random: false)], [nil, Mastodon::Snowflake.id_at(@end_at, with_random: false)], [nil, params[:domain]]])
def earliest_status_id
Mastodon::Snowflake.id_at(@start_at, with_random: false)
end

rows.map { |row| { date: row['period'], value: row['value'].to_s } }
def latest_status_id
Mastodon::Snowflake.id_at(@end_at, with_random: false)
end

def time_period
Expand Down
16 changes: 9 additions & 7 deletions app/lib/admin/metrics/measure/new_users_measure.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true

class Admin::Metrics::Measure::NewUsersMeasure < Admin::Metrics::Measure::BaseMeasure
include Admin::Metrics::Measure::QueryHelper

def key
'new_users'
end
Expand All @@ -15,8 +17,12 @@ def perform_previous_total_query
User.where(created_at: previous_time_period).count
end

def perform_data_query
sql = <<-SQL.squish
def sql_array
[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
Expand All @@ -26,12 +32,8 @@ def perform_data_query
SELECT count(*) FROM new_users
) AS value
FROM (
SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period
) AS axis
SQL

rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at]])

rows.map { |row| { date: row['period'], value: row['value'].to_s } }
end
end
16 changes: 9 additions & 7 deletions app/lib/admin/metrics/measure/opened_reports_measure.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true

class Admin::Metrics::Measure::OpenedReportsMeasure < Admin::Metrics::Measure::BaseMeasure
include Admin::Metrics::Measure::QueryHelper

def key
'opened_reports'
end
Expand All @@ -15,8 +17,12 @@ def perform_previous_total_query
Report.where(created_at: previous_time_period).count
end

def perform_data_query
sql = <<-SQL.squish
def sql_array
[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
Expand All @@ -26,12 +32,8 @@ def perform_data_query
SELECT count(*) FROM new_reports
) AS value
FROM (
SELECT generate_series(date_trunc('day', $1::timestamp)::date, date_trunc('day', $2::timestamp)::date, interval '1 day') AS period
SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period
) AS axis
SQL

rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at]])

rows.map { |row| { date: row['period'], value: row['value'].to_s } }
end
end

0 comments on commit af135bd

Please sign in to comment.