Current section

Files

Jump to
phoenix_analytics lib phoenix_analytics queries analytics charts statuses.ex
Raw

lib/phoenix_analytics/queries/analytics/charts/statuses.ex

defmodule PhoenixAnalytics.Queries.Analytics.Charts.Statuses do
@moduledoc false
defmacro __using__(_opts) do
quote do
@table PhoenixAnalytics.Queries.Table.name()
@valid_intervals ~w(hour day month)s
def statuses_per_period(from, to, interval \\ "day") when interval in @valid_intervals do
query = """
WITH date_series AS (
SELECT unnest(range(
(SELECT GREATEST(MIN(date_trunc('day', inserted_at)), TIMESTAMP '#{from}') FROM #{@table})::TIMESTAMP,
TIMESTAMP '#{to}',
INTERVAL 1 #{interval}
)) AS period
)
SELECT
date_trunc('#{interval}', ds.period)::VARCHAR AS date,
SUM(CASE WHEN status_code BETWEEN 200 AND 299 THEN 1 ELSE 0 END),
SUM(CASE WHEN status_code BETWEEN 300 AND 399 THEN 1 ELSE 0 END),
SUM(CASE WHEN status_code BETWEEN 400 AND 499 THEN 1 ELSE 0 END),
SUM(CASE WHEN status_code BETWEEN 500 AND 599 THEN 1 ELSE 0 END),
FROM date_series ds
LEFT JOIN #{@table} ON datetrunc('#{interval}', inserted_at) = datetrunc('#{interval}', ds.period)
GROUP BY ds.period ORDER BY ds.period;
"""
query
end
end
end
end