about summary refs log tree commit diff
path: root/app/lib/admin/metrics/measure
diff options
context:
space:
mode:
Diffstat (limited to 'app/lib/admin/metrics/measure')
-rw-r--r--app/lib/admin/metrics/measure/active_users_measure.rb10
-rw-r--r--app/lib/admin/metrics/measure/base_measure.rb52
-rw-r--r--app/lib/admin/metrics/measure/interactions_measure.rb10
-rw-r--r--app/lib/admin/metrics/measure/new_users_measure.rb8
-rw-r--r--app/lib/admin/metrics/measure/opened_reports_measure.rb8
-rw-r--r--app/lib/admin/metrics/measure/resolved_reports_measure.rb8
-rw-r--r--app/lib/admin/metrics/measure/tag_accounts_measure.rb10
-rw-r--r--app/lib/admin/metrics/measure/tag_servers_measure.rb10
-rw-r--r--app/lib/admin/metrics/measure/tag_uses_measure.rb10
9 files changed, 88 insertions, 38 deletions
diff --git a/app/lib/admin/metrics/measure/active_users_measure.rb b/app/lib/admin/metrics/measure/active_users_measure.rb
index 513189780..e6f09d4bc 100644
--- a/app/lib/admin/metrics/measure/active_users_measure.rb
+++ b/app/lib/admin/metrics/measure/active_users_measure.rb
@@ -5,20 +5,20 @@ class Admin::Metrics::Measure::ActiveUsersMeasure < Admin::Metrics::Measure::Bas
     'active_users'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     activity_tracker.sum(time_period.first, time_period.last)
   end
 
-  def previous_total
+  def perform_previous_total_query
     activity_tracker.sum(previous_time_period.first, previous_time_period.last)
   end
 
-  def data
+  def perform_data_query
     activity_tracker.get(time_period.first, time_period.last).map { |date, value| { date: date.to_time(:utc).iso8601, value: value.to_s } }
   end
 
-  protected
-
   def activity_tracker
     @activity_tracker ||= ActivityTracker.new('activity:logins', :unique)
   end
diff --git a/app/lib/admin/metrics/measure/base_measure.rb b/app/lib/admin/metrics/measure/base_measure.rb
index 0107ffd9c..ed1df9c7d 100644
--- a/app/lib/admin/metrics/measure/base_measure.rb
+++ b/app/lib/admin/metrics/measure/base_measure.rb
@@ -1,14 +1,25 @@
 # frozen_string_literal: true
 
 class Admin::Metrics::Measure::BaseMeasure
+  CACHE_TTL = 5.minutes.freeze
+
   def self.with_params?
     false
   end
 
+  attr_reader :loaded
+
+  alias loaded? loaded
+
   def initialize(start_at, end_at, params)
     @start_at = start_at&.to_datetime
     @end_at   = end_at&.to_datetime
     @params   = params
+    @loaded   = false
+  end
+
+  def cache_key
+    ["metrics/measure/#{key}", @start_at, @end_at, canonicalized_params].join(';')
   end
 
   def key
@@ -16,15 +27,15 @@ class Admin::Metrics::Measure::BaseMeasure
   end
 
   def total
-    raise NotImplementedError
+    load[:total]
   end
 
   def previous_total
-    raise NotImplementedError
+    load[:previous_total]
   end
 
   def data
-    raise NotImplementedError
+    load[:data]
   end
 
   def self.model_name
@@ -37,6 +48,35 @@ class Admin::Metrics::Measure::BaseMeasure
 
   protected
 
+  def load
+    unless loaded?
+      @values = Rails.cache.fetch(cache_key, expires_in: CACHE_TTL) { perform_queries }.with_indifferent_access
+      @loaded = true
+    end
+
+    @values
+  end
+
+  def perform_queries
+    {
+      total: perform_total_query,
+      previous_total: perform_previous_total_query,
+      data: perform_data_query,
+    }
+  end
+
+  def perform_total_query
+    raise NotImplementedError
+  end
+
+  def perform_previous_total_query
+    raise NotImplementedError
+  end
+
+  def perform_data_query
+    raise NotImplementedError
+  end
+
   def time_period
     (@start_at..@end_at)
   end
@@ -50,6 +90,10 @@ class Admin::Metrics::Measure::BaseMeasure
   end
 
   def params
-    raise NotImplementedError
+    {}
+  end
+
+  def canonicalized_params
+    params.to_h.to_a.sort_by { |k, _v| k.to_s }.map { |k, v| "#{k}=#{v}" }.join(';')
   end
 end
diff --git a/app/lib/admin/metrics/measure/interactions_measure.rb b/app/lib/admin/metrics/measure/interactions_measure.rb
index b928fdb8f..7a2b7e0fa 100644
--- a/app/lib/admin/metrics/measure/interactions_measure.rb
+++ b/app/lib/admin/metrics/measure/interactions_measure.rb
@@ -5,20 +5,20 @@ class Admin::Metrics::Measure::InteractionsMeasure < Admin::Metrics::Measure::Ba
     'interactions'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     activity_tracker.sum(time_period.first, time_period.last)
   end
 
-  def previous_total
+  def perform_previous_total_query
     activity_tracker.sum(previous_time_period.first, previous_time_period.last)
   end
 
-  def data
+  def perform_data_query
     activity_tracker.get(time_period.first, time_period.last).map { |date, value| { date: date.to_time(:utc).iso8601, value: value.to_s } }
   end
 
-  protected
-
   def activity_tracker
     @activity_tracker ||= ActivityTracker.new('activity:interactions', :basic)
   end
diff --git a/app/lib/admin/metrics/measure/new_users_measure.rb b/app/lib/admin/metrics/measure/new_users_measure.rb
index b31679ad3..71191f1a2 100644
--- a/app/lib/admin/metrics/measure/new_users_measure.rb
+++ b/app/lib/admin/metrics/measure/new_users_measure.rb
@@ -5,15 +5,17 @@ class Admin::Metrics::Measure::NewUsersMeasure < Admin::Metrics::Measure::BaseMe
     'new_users'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     User.where(created_at: time_period).count
   end
 
-  def previous_total
+  def perform_previous_total_query
     User.where(created_at: previous_time_period).count
   end
 
-  def data
+  def perform_data_query
     sql = <<-SQL.squish
       SELECT axis.*, (
         WITH new_users AS (
diff --git a/app/lib/admin/metrics/measure/opened_reports_measure.rb b/app/lib/admin/metrics/measure/opened_reports_measure.rb
index 9acc2c33d..4b80a0c8c 100644
--- a/app/lib/admin/metrics/measure/opened_reports_measure.rb
+++ b/app/lib/admin/metrics/measure/opened_reports_measure.rb
@@ -5,15 +5,17 @@ class Admin::Metrics::Measure::OpenedReportsMeasure < Admin::Metrics::Measure::B
     'opened_reports'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     Report.where(created_at: time_period).count
   end
 
-  def previous_total
+  def perform_previous_total_query
     Report.where(created_at: previous_time_period).count
   end
 
-  def data
+  def perform_data_query
     sql = <<-SQL.squish
       SELECT axis.*, (
         WITH new_reports AS (
diff --git a/app/lib/admin/metrics/measure/resolved_reports_measure.rb b/app/lib/admin/metrics/measure/resolved_reports_measure.rb
index 00cb24f7e..4ab746c8f 100644
--- a/app/lib/admin/metrics/measure/resolved_reports_measure.rb
+++ b/app/lib/admin/metrics/measure/resolved_reports_measure.rb
@@ -5,15 +5,17 @@ class Admin::Metrics::Measure::ResolvedReportsMeasure < Admin::Metrics::Measure:
     'resolved_reports'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     Report.resolved.where(action_taken_at: time_period).count
   end
 
-  def previous_total
+  def perform_previous_total_query
     Report.resolved.where(action_taken_at: previous_time_period).count
   end
 
-  def data
+  def perform_data_query
     sql = <<-SQL.squish
       SELECT axis.*, (
         WITH resolved_reports AS (
diff --git a/app/lib/admin/metrics/measure/tag_accounts_measure.rb b/app/lib/admin/metrics/measure/tag_accounts_measure.rb
index ef773081b..8f4512efe 100644
--- a/app/lib/admin/metrics/measure/tag_accounts_measure.rb
+++ b/app/lib/admin/metrics/measure/tag_accounts_measure.rb
@@ -9,20 +9,20 @@ class Admin::Metrics::Measure::TagAccountsMeasure < Admin::Metrics::Measure::Bas
     'tag_accounts'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     tag.history.aggregate(time_period).accounts
   end
 
-  def previous_total
+  def perform_previous_total_query
     tag.history.aggregate(previous_time_period).accounts
   end
 
-  def data
+  def perform_data_query
     time_period.map { |date| { date: date.to_time(:utc).iso8601, value: tag.history.get(date).accounts.to_s } }
   end
 
-  protected
-
   def tag
     @tag ||= Tag.find(params[:id])
   end
diff --git a/app/lib/admin/metrics/measure/tag_servers_measure.rb b/app/lib/admin/metrics/measure/tag_servers_measure.rb
index cc064f63f..11f229602 100644
--- a/app/lib/admin/metrics/measure/tag_servers_measure.rb
+++ b/app/lib/admin/metrics/measure/tag_servers_measure.rb
@@ -9,15 +9,17 @@ class Admin::Metrics::Measure::TagServersMeasure < Admin::Metrics::Measure::Base
     'tag_servers'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     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
 
-  def previous_total
+  def perform_previous_total_query
     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
 
-  def data
+  def perform_data_query
     sql = <<-SQL.squish
       SELECT axis.*, (
         SELECT count(distinct accounts.domain) AS value
@@ -38,8 +40,6 @@ class Admin::Metrics::Measure::TagServersMeasure < Admin::Metrics::Measure::Base
     rows.map { |row| { date: row['day'], value: row['value'].to_s } }
   end
 
-  protected
-
   def tag
     @tag ||= Tag.find(params[:id])
   end
diff --git a/app/lib/admin/metrics/measure/tag_uses_measure.rb b/app/lib/admin/metrics/measure/tag_uses_measure.rb
index b7667bc6c..bce86b89f 100644
--- a/app/lib/admin/metrics/measure/tag_uses_measure.rb
+++ b/app/lib/admin/metrics/measure/tag_uses_measure.rb
@@ -9,20 +9,20 @@ class Admin::Metrics::Measure::TagUsesMeasure < Admin::Metrics::Measure::BaseMea
     'tag_uses'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     tag.history.aggregate(time_period).uses
   end
 
-  def previous_total
+  def perform_previous_total_query
     tag.history.aggregate(previous_time_period).uses
   end
 
-  def data
+  def perform_data_query
     time_period.map { |date| { date: date.to_time(:utc).iso8601, value: tag.history.get(date).uses.to_s } }
   end
 
-  protected
-
   def tag
     @tag ||= Tag.find(params[:id])
   end