| defmodule Plausible.Stats.SamplingCache do |
| @moduledoc """ |
| Cache storing estimation for events ingested by a site in the past month. |
| |
| Used for sampling rate calculations in Plausible.Stats.Sampling. |
| """ |
| alias Plausible.Ingestion |
|
|
| import Ecto.Query |
| use Plausible.Cache |
|
|
| @cache_name :stats_sampling_cache |
|
|
| @impl true |
| def name(), do: @cache_name |
|
|
| @impl true |
| def child_id(), do: :cache_stats_sampling |
|
|
| @impl true |
| def repo(), do: Plausible.ClickhouseRepo |
|
|
| @impl true |
| def count_all() do |
| base_db_query() |
| |> repo().all() |
| |> length() |
| end |
|
|
| @impl true |
| def base_db_query() do |
| from(r in Ingestion.Counters.Record, |
| select: { |
| r.site_id, |
| selected_as(fragment("sumIf(value, metric = 'buffered')"), :events_ingested) |
| }, |
| where: fragment("toDate(event_timebucket) >= ?", ^thirty_days_ago()), |
| group_by: r.site_id |
| ) |
| end |
|
|
| @impl true |
| def get_from_source(site_id) do |
| base_db_query() |
| |> repo().all() |
| |> Map.new() |
| |> Map.get(site_id) |
| end |
|
|
| @spec consolidated_get(list(pos_integer()), Keyword.t()) :: pos_integer() | nil |
| def consolidated_get(site_ids, opts \\ []) when is_list(site_ids) do |
| events_ingested = Enum.sum_by(site_ids, &(get(&1, opts) || 0)) |
| if events_ingested > 0, do: events_ingested |
| end |
|
|
| defp thirty_days_ago() do |
| Date.shift(Date.utc_today(), day: -30) |
| end |
| end |
|
|