diff --git a/lib/plausible/stats/base.ex b/lib/plausible/stats/base.ex index 11b68d4422bcf..32fbcf772a4b1 100644 --- a/lib/plausible/stats/base.ex +++ b/lib/plausible/stats/base.ex @@ -377,7 +377,7 @@ defmodule Plausible.Stats.Base do {"imported_locations", :country} "visit:os" -> - {"imported_operating_systems", :operating_system} + {"imported_operating_systems", :os} "event:page" -> {"imported_pages", :page} @@ -463,8 +463,8 @@ defmodule Plausible.Stats.Base do :browser -> imported_q |> select_merge([i], %{browser: i.browser}) - :operating_system -> - imported_q |> select_merge([i], %{operating_system: i.operating_system}) + :os -> + imported_q |> select_merge([i], %{os: i.operating_system}) end q = @@ -538,15 +538,15 @@ defmodule Plausible.Stats.Base do browser: fragment("if(empty(?), ?, ?)", s.browser, i.browser, s.browser) }) - :operating_system -> + :os -> q |> select_merge([i, s], %{ - operating_system: + os: fragment( "if(empty(?), ?, ?)", - s.operating_system, - i.operating_system, - s.operating_system + s.os, + i.os, + s.os ) }) end diff --git a/lib/plausible/stats/breakdown.ex b/lib/plausible/stats/breakdown.ex index 9da32a96db01c..a08ffdb3aba79 100644 --- a/lib/plausible/stats/breakdown.ex +++ b/lib/plausible/stats/breakdown.ex @@ -121,12 +121,15 @@ defmodule Plausible.Stats.Breakdown do breakdown_sessions(site, new_query, "visit:entry_page", session_metrics, {limit, 1}) |> transform_keys(%{entry_page: :page}) + metrics = metrics ++ [:page] + zip_results( event_result, session_result, :page, metrics ) + |> Enum.map(&Map.take(&1, metrics)) end def breakdown(site, query, property, metrics, pagination) when property in @event_props do @@ -141,7 +144,17 @@ defmodule Plausible.Stats.Breakdown do "visit:utm_campaign" ] do query = Query.treat_page_filter_as_entry_page(query) - breakdown_sessions(site, query, property, metrics, pagination) + + results = breakdown_sessions(site, query, property, metrics, pagination) + + prop_result = + property + |> String.split(":") + |> Enum.at(1) + |> String.to_existing_atom() + + metrics = metrics ++ [prop_result] + Enum.map(results, &Map.take(&1, metrics)) end def breakdown(site, query, property, metrics, pagination) do @@ -448,7 +461,7 @@ defmodule Plausible.Stats.Breakdown do from( s in q, group_by: s.operating_system, - select_merge: %{operating_system: s.operating_system} + select_merge: %{os: s.operating_system} ) end diff --git a/lib/plausible/stats/filter_suggestions.ex b/lib/plausible/stats/filter_suggestions.ex index 219f1dc5dbc8c..538647dc2d6cf 100644 --- a/lib/plausible/stats/filter_suggestions.ex +++ b/lib/plausible/stats/filter_suggestions.ex @@ -38,13 +38,13 @@ defmodule Plausible.Stats.FilterSuggestions do filter_search = if filter_search == nil, do: "", else: filter_search filter_query = - if Enum.member?(["entry_page", :page, "exit_page"], filter_name), + if Enum.member?(["entry_page", "page", "exit_page"], filter_name), do: "%#{String.replace(filter_search, "*", "")}%", else: "%#{filter_search}%" filter_name = case filter_name do - :page -> "pathname" + "page" -> "pathname" "source" -> "referrer_source" "os" -> "operating_system" "os_version" -> "operating_system_version" diff --git a/lib/plausible_web/controllers/api/external_stats_controller.ex b/lib/plausible_web/controllers/api/external_stats_controller.ex index 65370c20ff93d..e29a61093d358 100644 --- a/lib/plausible_web/controllers/api/external_stats_controller.ex +++ b/lib/plausible_web/controllers/api/external_stats_controller.ex @@ -45,7 +45,7 @@ defmodule PlausibleWeb.Api.ExternalStatsController do Plausible.Stats.aggregate(site, query, metrics) end - json(conn, %{"results" => results}) + json(conn, %{"results" => Map.take(results, metrics)}) else {:error, msg} -> conn @@ -121,16 +121,7 @@ defmodule PlausibleWeb.Api.ExternalStatsController do "The metric `#{invalid_metric}` is not recognized. Find valid metrics from the documentation: https://plausible.io/docs/stats-api#get-apiv1statsbreakdown"} end else - metrics = - metrics - |> Enum.map(fn item -> - case item do - "visitors" -> :visitors - metric -> metric - end - end) - - {:ok, metrics} + {:ok, Enum.map(metrics, &String.to_atom/1)} end end @@ -144,7 +135,8 @@ defmodule PlausibleWeb.Api.ExternalStatsController do query <- Query.from(site.timezone, params), {:ok, metrics} <- parse_metrics(params, nil, query) do graph = Plausible.Stats.timeseries(site, query, metrics) - json(conn, %{"results" => graph}) + metrics = metrics ++ ["date"] + json(conn, %{"results" => Enum.map(graph, &Map.take(&1, metrics))}) else {:error, msg} -> conn diff --git a/lib/plausible_web/controllers/api/stats_controller.ex b/lib/plausible_web/controllers/api/stats_controller.ex index 8101e4e08872a..16221eab5a395 100644 --- a/lib/plausible_web/controllers/api/stats_controller.ex +++ b/lib/plausible_web/controllers/api/stats_controller.ex @@ -30,6 +30,7 @@ defmodule PlausibleWeb.Api.StatsController do plot = Imported.Visitors.timeseries(site, timeseries_query) |> Enum.zip_with(plot, &(&1 + &2)) + {plot, site.has_imported_stats} else {plot, false} @@ -251,8 +252,7 @@ defmodule PlausibleWeb.Api.StatsController do pagination = parse_pagination(params) - metrics = - if params["detailed"], do: [:visitors, :bounce_rate, :visit_duration], else: [:visitors] + metrics = [:visitors, :bounce_rate, :visit_duration] res = Stats.breakdown(site, query, "visit:utm_medium", metrics, pagination) @@ -282,8 +282,7 @@ defmodule PlausibleWeb.Api.StatsController do pagination = parse_pagination(params) - metrics = - if params["detailed"], do: [:visitors, :bounce_rate, :visit_duration], else: [:visitors] + metrics = [:visitors, :bounce_rate, :visit_duration] res = Stats.breakdown(site, query, "visit:utm_campaign", metrics, pagination) @@ -313,8 +312,7 @@ defmodule PlausibleWeb.Api.StatsController do pagination = parse_pagination(params) - metrics = - if params["detailed"], do: [:visitors, :bounce_rate, :visit_duration], else: [:visitors] + metrics = [:visitors, :bounce_rate, :visit_duration] res = Stats.breakdown(site, query, "visit:utm_source", metrics, pagination) @@ -381,6 +379,7 @@ defmodule PlausibleWeb.Api.StatsController do Stats.breakdown(site, query, "visit:referrer", metrics, pagination) |> maybe_add_cr(site, query, pagination, "referrer", "visit:referrer") |> transform_keys(%{"referrer" => "name"}) + |> Enum.map(&Map.drop(&1, [:visits])) %{:visitors => %{"value" => total_visitors}} = Stats.aggregate(site, query, [:visitors]) json(conn, %{referrers: referrers, total_visitors: total_visitors}) @@ -579,8 +578,8 @@ defmodule PlausibleWeb.Api.StatsController do systems = Stats.breakdown(site, query, "visit:os", [:visitors], pagination) - |> maybe_add_cr(site, query, pagination, :operating_system, "visit:os") - |> transform_keys(%{operating_system: "name"}) + |> maybe_add_cr(site, query, pagination, :os, "visit:os") + |> transform_keys(%{os: "name"}) |> maybe_add_percentages(query) if params["csv"] do