defmodule Plausible.Stats.Legacy.Aggregate do @moduledoc """ Builds aggregate results for the Stats API v1. Avoid adding new logic here. """ use Plausible.ClickhouseRepo alias Plausible.Stats.{Query, QueryRunner, QueryResult, QueryOptimizer} def aggregate(site, query, metrics) do query = query |> Query.set(metrics: metrics) |> Query.set_include(:drop_unavailable_revenue_metrics, true) |> QueryOptimizer.optimize() %QueryResult{results: [entry], meta: meta} = QueryRunner.run(site, query) results = query.metrics |> Enum.with_index() |> Enum.map(fn {metric, index} -> { metric, metric_map(entry, index, metric) } end) |> Enum.into(%{}) %{results: results, meta: meta} end def metric_map( %{metrics: metrics, comparison: %{metrics: comparison_metrics, change: change}}, index, metric ) do %{ value: get_value(metrics, index, metric), comparison_value: get_value(comparison_metrics, index, metric), change: Enum.at(change, index) } end def metric_map(%{metrics: metrics}, index, metric) do %{ value: get_value(metrics, index, metric) } end def get_value(metric_list, index, metric) do metric_list |> Enum.at(index) |> maybe_round_value(metric) end @metrics_to_round [:bounce_rate, :visit_duration, :sample_percent] defp maybe_round_value(nil, _metric), do: nil defp maybe_round_value(value, metric) when metric in @metrics_to_round, do: round(value) defp maybe_round_value(value, _metric), do: value end