Changes to split and pattern matched function for time_on_page
This commit is contained in:
parent
10f10c933a
commit
a299fab1fb
|
|
@ -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, "*", "")}%",
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue