Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 24 additions & 2 deletions lib/plausible/stats.ex
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,33 @@ defmodule Plausible.Stats do
Timeseries,
CurrentVisitors,
FilterSuggestions,
QueryRunner
QueryRunner,
QueryResult
}

def query(site, query) do
QueryRunner.run(site, query)
site |> QueryRunner.run(query) |> QueryResult.from()
end

def dashboard_query(site, query) do
{site |> QueryRunner.run(query) |> QueryResult.from(), get_dashboard_metric_labels(query)}
end

defp get_dashboard_metric_labels(query) do
context = %{
goal_filter?:
Plausible.Stats.Filters.filtering_on_dimension?(query, "event:goal",
max_depth: 0,
behavioral_filters: :ignore
),
realtime?: query.input_date_range in [:realtime, :realtime_30m],
dimensions: query.dimensions
}

query.metrics
|> Enum.map(fn metric ->
Plausible.Stats.Metrics.dashboard_metric_label(metric, context)
end)
end

def breakdown(site, query, metrics, pagination) do
Expand Down
3 changes: 2 additions & 1 deletion lib/plausible/stats/aggregate.ex
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ defmodule Plausible.Stats.Aggregate do
|> Query.set(metrics: metrics, remove_unavailable_revenue_metrics: true)
|> QueryOptimizer.optimize()

%QueryResult{results: [entry], meta: meta} = QueryRunner.run(site, query)
%QueryResult{results: [entry], meta: meta} =
site |> QueryRunner.run(query) |> QueryResult.from()

results =
query.metrics
Expand Down
3 changes: 1 addition & 2 deletions lib/plausible/stats/api_query_parser.ex
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ defmodule Plausible.Stats.ApiQueryParser do
trim_relative_date_range: false,
compare: nil,
compare_match_day_of_week: false,
legacy_time_on_page_cutoff: nil,
dashboard_metric_labels: false
legacy_time_on_page_cutoff: nil
}

def default_include(), do: @default_include
Expand Down
3 changes: 2 additions & 1 deletion lib/plausible/stats/breakdown.ex
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ defmodule Plausible.Stats.Breakdown do
remove_unavailable_revenue_metrics: true
)

%QueryResult{results: results, meta: meta} = QueryRunner.run(site, query_with_metrics)
%QueryResult{results: results, meta: meta} =
site |> QueryRunner.run(query_with_metrics) |> QueryResult.from()

%{
results: build_breakdown_result(results, query_with_metrics, metrics),
Expand Down
3 changes: 1 addition & 2 deletions lib/plausible/stats/dashboard_query_parser.ex
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ defmodule Plausible.Stats.DashboardQueryParser do
trim_relative_date_range: true,
compare: nil,
compare_match_day_of_week: true,
legacy_time_on_page_cutoff: nil,
dashboard_metric_labels: true
legacy_time_on_page_cutoff: nil
}

def default_include(), do: @default_include
Expand Down
6 changes: 2 additions & 4 deletions lib/plausible/stats/query_include.ex
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ defmodule Plausible.Stats.QueryInclude do
trim_relative_date_range: false,
compare: nil,
compare_match_day_of_week: false,
legacy_time_on_page_cutoff: nil,
dashboard_metric_labels: false
legacy_time_on_page_cutoff: nil

@type date_range_tuple() :: {:date_range, Date.t(), Date.t()}
@type datetime_range_tuple() :: {:datetime_range, DateTime.t(), DateTime.t()}
Expand All @@ -23,7 +22,6 @@ defmodule Plausible.Stats.QueryInclude do
compare:
nil | :previous_period | :year_over_year | date_range_tuple() | datetime_range_tuple(),
compare_match_day_of_week: boolean(),
legacy_time_on_page_cutoff: any(),
dashboard_metric_labels: boolean()
legacy_time_on_page_cutoff: any()
}
end
29 changes: 1 addition & 28 deletions lib/plausible/stats/query_result.ex
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ defmodule Plausible.Stats.QueryResult do
"""

use Plausible
alias Plausible.Stats.{Query, QueryRunner, QueryInclude}
alias Plausible.Stats.{Query, QueryRunner}

defstruct results: [],
meta: %{},
Expand Down Expand Up @@ -62,7 +62,6 @@ defmodule Plausible.Stats.QueryResult do
%{}
|> add_imports_meta(runner.main_query)
|> add_metric_warnings_meta(runner.main_query)
|> add_dashboard_metric_labels(runner.main_query)
|> add_time_labels_meta(runner.main_query)
|> add_total_rows_meta(runner.main_query, runner.total_rows)
end
Expand Down Expand Up @@ -91,32 +90,6 @@ defmodule Plausible.Stats.QueryResult do
end
end

defp add_dashboard_metric_labels(meta, %Query{
include: %QueryInclude{dashboard_metric_labels: false}
}) do
meta
end

defp add_dashboard_metric_labels(meta, query) do
context = %{
goal_filter?:
Plausible.Stats.Filters.filtering_on_dimension?(query, "event:goal",
max_depth: 0,
behavioral_filters: :ignore
),
realtime?: query.input_date_range in [:realtime, :realtime_30m],
dimensions: query.dimensions
}

metric_labels =
query.metrics
|> Enum.map(fn metric ->
Plausible.Stats.Metrics.dashboard_metric_label(metric, context)
end)

Map.put(meta, :metric_labels, metric_labels)
end

defp add_time_labels_meta(meta, query) do
if query.include.time_labels do
Map.put(meta, :time_labels, Plausible.Stats.Time.time_labels(query))
Expand Down
2 changes: 0 additions & 2 deletions lib/plausible/stats/query_runner.ex
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ defmodule Plausible.Stats.QueryRunner do
Comparisons,
Compare,
QueryOptimizer,
QueryResult,
Metrics,
SQL,
Util,
Expand All @@ -41,7 +40,6 @@ defmodule Plausible.Stats.QueryRunner do
|> add_comparison_query()
|> execute_comparison_query()
|> build_results_list()
|> QueryResult.from()
end

defp execute_main_query(%__MODULE__{main_query: query, site: site} = runner) do
Expand Down
13 changes: 11 additions & 2 deletions lib/plausible/stats/timeseries.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,16 @@ defmodule Plausible.Stats.Timeseries do

use Plausible
use Plausible.ClickhouseRepo
alias Plausible.Stats.{Comparisons, Query, QueryRunner, Metrics, Time, QueryOptimizer}

alias Plausible.Stats.{
Comparisons,
Query,
QueryRunner,
QueryResult,
Metrics,
Time,
QueryOptimizer
}

@time_dimension %{
"month" => "time:month",
Expand All @@ -34,7 +43,7 @@ defmodule Plausible.Stats.Timeseries do
else: nil
)

query_result = QueryRunner.run(site, query)
query_result = site |> QueryRunner.run(query) |> QueryResult.from()

{
build_result(query_result, query, fn entry -> entry end),
Expand Down
6 changes: 3 additions & 3 deletions lib/plausible_web/live/components/dashboard/report_list.ex
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,17 @@ defmodule PlausibleWeb.Components.Dashboard.ReportList do
col_min_width: @col_min_width
)

if assigns.query_result.loading || !assigns.query_result.ok? do
if assigns.data.loading || !assigns.data.ok? do
~H"""
"""
else
%QueryResult{results: results, meta: meta, query: query} = assigns.query_result.result
{%QueryResult{results: results, query: query}, metric_labels} = assigns.data.result

assigns =
assign(assigns,
results: results,
metric_keys: query[:metrics],
metric_labels: meta[:metric_labels],
metric_labels: metric_labels,
empty?: Enum.empty?(results)
)

Expand Down
10 changes: 4 additions & 6 deletions lib/plausible_web/live/dashboard/pages.ex
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ defmodule PlausibleWeb.Live.Dashboard.Pages do
alias PlausibleWeb.Components.Dashboard.Tile

alias Plausible.Stats
alias Plausible.Stats.{ParsedQueryParams, QueryBuilder, QueryResult}
alias Plausible.Stats.{ParsedQueryParams, QueryBuilder}

@tabs [
%{
Expand Down Expand Up @@ -79,7 +79,7 @@ defmodule PlausibleWeb.Live.Dashboard.Pages do
key_label={get_tab_info(@active_tab, :key_label)}
dimension={get_tab_info(@active_tab, :dimension)}
params={@params}
query_result={@query_result}
data={@data}
external_link_fn={@external_link_fn}
/>
</Tile.tile>
Expand Down Expand Up @@ -107,7 +107,7 @@ defmodule PlausibleWeb.Live.Dashboard.Pages do
defp load_stats(socket) do
%{active_tab: active_tab, site: site, params: params} = socket.assigns

assign_async(socket, :query_result, fn ->
assign_async(socket, :data, fn ->
metrics = choose_metrics(params)
dimension = get_tab_info(active_tab, :dimension)

Expand All @@ -121,9 +121,7 @@ defmodule PlausibleWeb.Live.Dashboard.Pages do

query = QueryBuilder.build!(site, params)

%QueryResult{} = query_result = Stats.query(site, query)

{:ok, %{query_result: query_result}}
{:ok, %{data: Stats.dashboard_query(site, query)}}
end)
end

Expand Down
50 changes: 17 additions & 33 deletions test/plausible/stats/query/query_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -127,29 +127,25 @@ defmodule Plausible.Stats.QueryTest do
end
end

describe "include.dashboard_metric_labels" do
describe "including metric labels" do
test "visitors -> Visitors (default)", %{site: site} do
{:ok, query} =
QueryBuilder.build(site,
metrics: [:visitors],
input_date_range: :all,
include: [dashboard_metric_labels: true]
input_date_range: :all
)

%Stats.QueryResult{meta: meta} = Stats.query(site, query)
assert ["Visitors"] = meta[:metric_labels]
assert {_, ["Visitors"]} = Stats.dashboard_query(site, query)
end

test "visitors -> Current visitors (realtime)", %{site: site} do
{:ok, query} =
QueryBuilder.build(site,
metrics: [:visitors],
input_date_range: :realtime,
include: [dashboard_metric_labels: true]
input_date_range: :realtime
)

%Stats.QueryResult{meta: meta} = Stats.query(site, query)
assert ["Current visitors"] = meta[:metric_labels]
assert {_, ["Current visitors"]} = Stats.dashboard_query(site, query)
end

test "visitors -> Current visitors (realtime and goal filtered)", %{site: site} do
Expand All @@ -159,12 +155,10 @@ defmodule Plausible.Stats.QueryTest do
QueryBuilder.build(site,
metrics: [:visitors],
input_date_range: :realtime,
filters: [[:is, "event:goal", ["Signup"]]],
include: [dashboard_metric_labels: true]
filters: [[:is, "event:goal", ["Signup"]]]
)

%Stats.QueryResult{meta: meta} = Stats.query(site, query)
assert ["Current visitors"] = meta[:metric_labels]
assert {_, ["Current visitors"]} = Stats.dashboard_query(site, query)
end

test "visitors -> Conversions (goal filtered)", %{site: site} do
Expand All @@ -174,51 +168,43 @@ defmodule Plausible.Stats.QueryTest do
QueryBuilder.build(site,
metrics: [:visitors],
input_date_range: :all,
filters: [[:is, "event:goal", ["Signup"]]],
include: [dashboard_metric_labels: true]
filters: [[:is, "event:goal", ["Signup"]]]
)

%Stats.QueryResult{meta: meta} = Stats.query(site, query)
assert ["Conversions"] = meta[:metric_labels]
assert {_, ["Conversions"]} = Stats.dashboard_query(site, query)
end

test "visitors -> Unique entrances (visit:entry_page dimension)", %{site: site} do
{:ok, query} =
QueryBuilder.build(site,
metrics: [:visitors],
input_date_range: :all,
dimensions: ["visit:entry_page"],
include: [dashboard_metric_labels: true]
dimensions: ["visit:entry_page"]
)

%Stats.QueryResult{meta: meta} = Stats.query(site, query)
assert ["Unique entrances"] = meta[:metric_labels]
assert {_, ["Unique entrances"]} = Stats.dashboard_query(site, query)
end

test "visitors -> Unique exits (visit:exit_page dimension)", %{site: site} do
{:ok, query} =
QueryBuilder.build(site,
metrics: [:visitors],
input_date_range: :all,
dimensions: ["visit:exit_page"],
include: [dashboard_metric_labels: true]
dimensions: ["visit:exit_page"]
)

%Stats.QueryResult{meta: meta} = Stats.query(site, query)
assert ["Unique exits"] = meta[:metric_labels]
assert {_, ["Unique exits"]} = Stats.dashboard_query(site, query)
end

test "conversion_rate -> CR (default)", %{site: site} do
{:ok, query} =
QueryBuilder.build(site,
metrics: [:conversion_rate],
input_date_range: :all,
dimensions: ["event:goal"],
include: [dashboard_metric_labels: true]
dimensions: ["event:goal"]
)

%Stats.QueryResult{meta: meta} = Stats.query(site, query)
assert ["CR"] = meta[:metric_labels]
assert {_, ["CR"]} = Stats.dashboard_query(site, query)
end

test "maintains order with multiple metrics", %{site: site} do
Expand All @@ -228,12 +214,10 @@ defmodule Plausible.Stats.QueryTest do
QueryBuilder.build(site,
metrics: [:conversion_rate, :visitors],
input_date_range: :all,
filters: [[:is, "event:goal", ["Signup"]]],
include: [dashboard_metric_labels: true]
filters: [[:is, "event:goal", ["Signup"]]]
)

%Stats.QueryResult{meta: meta} = Stats.query(site, query)
assert ["CR", "Conversions"] = meta[:metric_labels]
assert {_, ["CR", "Conversions"]} = Stats.dashboard_query(site, query)
end
end
end
Loading
Loading