Changes to split and pattern matched function for time_on_page

This commit is contained in:
Vignesh Joglekar 2021-06-11 02:20:26 -05:00
parent 10f10c933a
commit a299fab1fb
2 changed files with 72 additions and 36 deletions

View File

@ -679,7 +679,9 @@ defmodule Plausible.Stats.Clickhouse do
|> Enum.into(%{}) |> Enum.into(%{})
end end
def page_times_by_page_url(site, query, page_list \\ nil) do def page_times_by_page_url(site, query, page_list \\ nil)
def page_times_by_page_url(site, query, _page_list = nil) do
{negated, updatedPageSelection} = query.filters["page"] |> check_negated_filter() {negated, updatedPageSelection} = query.filters["page"] |> check_negated_filter()
{_, pageRegex} = updatedPageSelection |> convert_path_regex() {_, pageRegex} = updatedPageSelection |> convert_path_regex()
@ -699,9 +701,11 @@ defmodule Plausible.Stats.Clickhouse do
{base_query_raw, base_query_raw_params} = ClickhouseRepo.to_sql(:all, q) {base_query_raw, base_query_raw_params} = ClickhouseRepo.to_sql(:all, q)
page_selector = if page_list == nil, do: [pageRegex], else: [page_list && (Enum.count(page_list) > 0 && page_list) || ["/"]] time_query = "
SELECT
time_query = "SELECT avg(ifNotFinite(avgTime, null))
FROM
(SELECT
p, p,
sum(td)/count(case when p2 != p then 1 end) as avgTime sum(td)/count(case when p2 != p then 1 end) as avgTime
FROM FROM
@ -717,22 +721,54 @@ defmodule Plausible.Stats.Clickhouse do
neighbor(s, 1) as s2 neighbor(s, 1) as s2
FROM (#{base_query_raw})) FROM (#{base_query_raw}))
WHERE s=s2 AND WHERE s=s2 AND
#{ #{if negated, do: "not(match(p, ?))", else: "match(p, ?)"}
if page_list == nil do GROUP BY p,p2,s)
if negated, do: "not(match(p, ?))", else: "match(p, ?)" GROUP BY p)"
else
"p IN tuple(?)" time_query |> ClickhouseRepo.query(base_query_raw_params ++ [pageRegex])
end end
}
def page_times_by_page_url(site, query, page_list) do
q =
from(
e in base_query_w_sessions(site, %Query{
query
| filters: Map.delete(query.filters, "page")
}),
select: {
fragment("? as p", e.pathname),
fragment("? as t", e.timestamp),
fragment("? as s", e.session_id)
},
order_by: [e.session_id, e.timestamp]
)
{base_query_raw, base_query_raw_params} = ClickhouseRepo.to_sql(:all, q)
time_query = "
SELECT
p,
sum(td)/count(case when p2 != p then 1 end) as avgTime
FROM
(SELECT
p,
p2,
sum(t2-t) as td
FROM
(SELECT
*,
neighbor(t, 1) as t2,
neighbor(p, 1) as p2,
neighbor(s, 1) as s2
FROM (#{base_query_raw}))
WHERE s=s2 AND p IN tuple(?)
GROUP BY p,p2,s) GROUP BY p,p2,s)
GROUP BY p" GROUP BY p"
time_query = if page_list == nil, do: "SELECT avg(ifNotFinite(avgTime, null)) FROM (#{time_query})", else: time_query time_query
|> ClickhouseRepo.query(
time_query |> ClickhouseRepo.query( base_query_raw_params ++ [(Enum.count(page_list) > 0 && page_list) || ["/"]]
base_query_raw_params ++ page_selector
) )
end end
defp add_percentages(stat_list) do defp add_percentages(stat_list) do
@ -1649,6 +1685,8 @@ defmodule Plausible.Stats.Clickhouse do
end end
def make_suggestions(site, query, filter_name, filter_search) do def make_suggestions(site, query, filter_name, filter_search) do
filter_search = if filter_search == nil, do: "", else: filter_search
filter_query = 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, "*", "")}%", do: "%#{String.replace(filter_search, "*", "")}%",

View File

@ -110,14 +110,12 @@ defmodule PlausibleWeb.Api.StatsController do
Task.yield_many( Task.yield_many(
[ [
Task.async(fn -> Task.async(fn ->
{:ok, page_times} = {:ok, page_times} = Stats.page_times_by_page_url(site, query)
Stats.page_times_by_page_url(site, query)
page_times page_times
end), end),
Task.async(fn -> Task.async(fn ->
{:ok, page_times} = {:ok, page_times} = Stats.page_times_by_page_url(site, prev_query)
Stats.page_times_by_page_url(site, prev_query)
page_times page_times
end) end)
@ -133,7 +131,7 @@ defmodule PlausibleWeb.Api.StatsController do
{:ok, page_times} -> {:ok, page_times} ->
result = Enum.at(page_times.rows, 0) result = Enum.at(page_times.rows, 0)
result = if result, do: Enum.at(result, 0), else: nil result = if result, do: Enum.at(result, 0), else: nil
if result, do: {:ok, round(result)}, else: {:nil, nil} if result, do: {:ok, round(result)}, else: {nil, nil}
_ -> _ ->
response response