2021-11-25 12:07:38 +00:00
# frozen_string_literal: true
class Admin :: Metrics :: Measure :: TagServersMeasure < Admin :: Metrics :: Measure :: BaseMeasure
def self . with_params?
true
end
def key
'tag_servers'
end
2022-02-22 14:27:08 +00:00
protected
def perform_total_query
2021-11-25 12:07:38 +00:00
tag . statuses . where ( 'statuses.id BETWEEN ? AND ?' , Mastodon :: Snowflake . id_at ( @start_at , with_random : false ) , Mastodon :: Snowflake . id_at ( @end_at , with_random : false ) ) . joins ( :account ) . count ( 'distinct accounts.domain' )
end
2022-02-22 14:27:08 +00:00
def perform_previous_total_query
2021-11-25 12:07:38 +00:00
tag . statuses . where ( 'statuses.id BETWEEN ? AND ?' , Mastodon :: Snowflake . id_at ( @start_at - length_of_period , with_random : false ) , Mastodon :: Snowflake . id_at ( @end_at - length_of_period , with_random : false ) ) . joins ( :account ) . count ( 'distinct accounts.domain' )
end
2022-02-22 14:27:08 +00:00
def perform_data_query
2021-11-25 12:07:38 +00:00
sql = <<-SQL.squish
SELECT axis . * , (
2021-11-28 22:13:07 +00:00
SELECT count ( distinct accounts . domain ) AS value
2021-11-25 12:07:38 +00:00
FROM statuses
2021-11-28 22:13:07 +00:00
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 = $1
AND statuses . id BETWEEN $2 AND $3
2021-11-25 12:07:38 +00:00
AND date_trunc ( 'day' , statuses . created_at ) :: date = axis . day
)
FROM (
2021-11-28 22:13:07 +00:00
SELECT generate_series ( date_trunc ( 'day' , $4 :: timestamp ) :: date , date_trunc ( 'day' , $5 :: timestamp ) :: date , ( '1 day' ) :: interval ) AS day
2021-11-25 12:07:38 +00:00
) as axis
SQL
2021-11-28 22:13:07 +00:00
rows = ActiveRecord :: Base . connection . select_all ( sql , nil , [ [ nil , params [ :id ] . to_i ] , [ nil , Mastodon :: Snowflake . id_at ( @start_at , with_random : false ) ] , [ nil , Mastodon :: Snowflake . id_at ( @end_at , with_random : false ) ] , [ nil , @start_at ] , [ nil , @end_at ] ] )
2021-11-25 12:07:38 +00:00
rows . map { | row | { date : row [ 'day' ] , value : row [ 'value' ] . to_s } }
end
def tag
@tag || = Tag . find ( params [ :id ] )
end
def params
@params . permit ( :id )
end
end