Skip to content

Commit

Permalink
Add different ORDER BY to each breakdown property
Browse files Browse the repository at this point in the history
  • Loading branch information
vinibrsl committed Jan 5, 2023
1 parent f5e026e commit 1f5e2e2
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 53 deletions.
53 changes: 35 additions & 18 deletions lib/plausible/stats/breakdown.ex
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ defmodule Plausible.Stats.Breakdown do

defp breakdown_events(site, query, property, metrics, pagination) do
from(e in base_event_query(site, query),
order_by: [desc: fragment("uniq(?)", e.user_id), asc: fragment("min(?)", e.timestamp)],
order_by: [desc: fragment("uniq(?)", e.user_id)],
select: %{}
)
|> do_group_by(property)
Expand Down Expand Up @@ -327,7 +327,8 @@ defmodule Plausible.Stats.Breakdown do
group_by: e.name,
where: meta.key == ^prop,
group_by: meta.value,
select_merge: %{^prop => meta.value}
select_merge: %{^prop => meta.value},
order_by: {:asc, meta.value}
)
end

Expand All @@ -340,7 +341,8 @@ defmodule Plausible.Stats.Breakdown do
inner_lateral_join: meta in fragment("meta"),
where: meta.key == ^prop,
group_by: meta.value,
select_merge: %{^prop => meta.value}
select_merge: %{^prop => meta.value},
order_by: {:asc, meta.value}
)
end

Expand All @@ -351,7 +353,8 @@ defmodule Plausible.Stats.Breakdown do
from(
e in q,
group_by: e.name,
select_merge: %{name: e.name}
select_merge: %{name: e.name},
order_by: {:asc, e.name}
)
end

Expand All @@ -362,7 +365,8 @@ defmodule Plausible.Stats.Breakdown do
from(
e in q,
group_by: e.pathname,
select_merge: %{page: e.pathname}
select_merge: %{page: e.pathname},
order_by: {:asc, e.pathname}
)
end

Expand All @@ -378,7 +382,8 @@ defmodule Plausible.Stats.Breakdown do
select_merge: %{
index: fragment("arrayJoin(indices) as index"),
page_match: fragment("array(?)[index]", ^match_exprs)
}
},
order_by: {:asc, fragment("index")}
)
end
end
Expand All @@ -389,7 +394,8 @@ defmodule Plausible.Stats.Breakdown do
group_by: s.referrer_source,
select_merge: %{
source: fragment("if(empty(?), ?, ?)", s.referrer_source, @no_ref, s.referrer_source)
}
},
order_by: {:asc, s.referrer_source}
)
end

Expand All @@ -398,7 +404,8 @@ defmodule Plausible.Stats.Breakdown do
s in q,
where: s.country_code != "\0\0" and s.country_code != "ZZ",
group_by: s.country_code,
select_merge: %{country: s.country_code}
select_merge: %{country: s.country_code},
order_by: {:asc, s.country_code}
)
end

Expand All @@ -407,7 +414,8 @@ defmodule Plausible.Stats.Breakdown do
s in q,
where: s.subdivision1_code != "",
group_by: s.subdivision1_code,
select_merge: %{region: s.subdivision1_code}
select_merge: %{region: s.subdivision1_code},
order_by: {:asc, s.subdivision1_code}
)
end

Expand All @@ -416,23 +424,26 @@ defmodule Plausible.Stats.Breakdown do
s in q,
where: s.city_geoname_id != 0,
group_by: s.city_geoname_id,
select_merge: %{city: s.city_geoname_id}
select_merge: %{city: s.city_geoname_id},
order_by: {:asc, s.city_geoname_id}
)
end

defp do_group_by(q, "visit:entry_page") do
from(
s in q,
group_by: s.entry_page,
select_merge: %{entry_page: s.entry_page}
select_merge: %{entry_page: s.entry_page},
order_by: {:asc, s.entry_page}
)
end

defp do_group_by(q, "visit:exit_page") do
from(
s in q,
group_by: s.exit_page,
select_merge: %{exit_page: s.exit_page}
select_merge: %{exit_page: s.exit_page},
order_by: {:asc, s.exit_page}
)
end

Expand All @@ -442,7 +453,8 @@ defmodule Plausible.Stats.Breakdown do
group_by: s.referrer,
select_merge: %{
referrer: fragment("if(empty(?), ?, ?)", s.referrer, @no_ref, s.referrer)
}
},
order_by: {:asc, s.referrer}
)
end

Expand Down Expand Up @@ -500,39 +512,44 @@ defmodule Plausible.Stats.Breakdown do
from(
s in q,
group_by: s.screen_size,
select_merge: %{device: s.screen_size}
select_merge: %{device: s.screen_size},
order_by: {:asc, s.screen_size}
)
end

defp do_group_by(q, "visit:os") do
from(
s in q,
group_by: s.operating_system,
select_merge: %{operating_system: s.operating_system}
select_merge: %{operating_system: s.operating_system},
order_by: {:asc, s.operating_system}
)
end

defp do_group_by(q, "visit:os_version") do
from(
s in q,
group_by: s.operating_system_version,
select_merge: %{os_version: s.operating_system_version}
select_merge: %{os_version: s.operating_system_version},
order_by: {:asc, s.operating_system_version}
)
end

defp do_group_by(q, "visit:browser") do
from(
s in q,
group_by: s.browser,
select_merge: %{browser: s.browser}
select_merge: %{browser: s.browser},
order_by: {:asc, s.browser}
)
end

defp do_group_by(q, "visit:browser_version") do
from(
s in q,
group_by: s.browser_version,
select_merge: %{browser_version: s.browser_version}
select_merge: %{browser_version: s.browser_version},
order_by: {:asc, s.browser_version}
)
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,15 +100,6 @@ defmodule PlausibleWeb.Api.StatsController.CountriesTest do
conn = get(conn, "/api/stats/#{site.domain}/countries?period=day&filters=#{filters}")

assert json_response(conn, 200) == [
%{
"code" => "GB",
"alpha_3" => "GBR",
"name" => "United Kingdom",
"flag" => "🇬🇧",
"total_visitors" => 1,
"visitors" => 1,
"conversion_rate" => 100.0
},
%{
"code" => "EE",
"alpha_3" => "EST",
Expand All @@ -117,6 +108,15 @@ defmodule PlausibleWeb.Api.StatsController.CountriesTest do
"total_visitors" => 2,
"visitors" => 1,
"conversion_rate" => 50.0
},
%{
"code" => "GB",
"alpha_3" => "GBR",
"name" => "United Kingdom",
"flag" => "🇬🇧",
"total_visitors" => 1,
"visitors" => 1,
"conversion_rate" => 100.0
}
]
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -745,21 +745,21 @@ defmodule PlausibleWeb.Api.StatsController.PagesTest do
)

assert json_response(conn, 200) == [
%{
"total_visitors" => 1,
"unique_entrances" => 1,
"total_entrances" => 1,
"name" => "/page2",
"visit_duration" => 900,
"conversion_rate" => 100.0
},
%{
"total_visitors" => 2,
"unique_entrances" => 1,
"total_entrances" => 1,
"name" => "/page1",
"visit_duration" => 0,
"conversion_rate" => 50.0
},
%{
"total_visitors" => 1,
"unique_entrances" => 1,
"total_entrances" => 1,
"name" => "/page2",
"visit_duration" => 900,
"conversion_rate" => 100.0
}
]
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -279,17 +279,17 @@ defmodule PlausibleWeb.Api.StatsController.SourcesTest do
)

assert json_response(conn, 200) == [
%{
"name" => "Google",
"visitors" => 1,
"bounce_rate" => 0,
"visit_duration" => 900
},
%{
"name" => "DuckDuckGo",
"visitors" => 1,
"bounce_rate" => 100,
"visit_duration" => 0
},
%{
"name" => "Google",
"visitors" => 1,
"bounce_rate" => 0,
"visit_duration" => 900
}
]
end
Expand Down Expand Up @@ -344,17 +344,17 @@ defmodule PlausibleWeb.Api.StatsController.SourcesTest do
)

assert json_response(conn, 200) == [
%{
"name" => "Google",
"visitors" => 1,
"bounce_rate" => 0,
"visit_duration" => 900
},
%{
"name" => "DuckDuckGo",
"visitors" => 1,
"bounce_rate" => 100,
"visit_duration" => 0
},
%{
"name" => "Google",
"visitors" => 1,
"bounce_rate" => 0,
"visit_duration" => 900
}
]

Expand Down Expand Up @@ -812,17 +812,17 @@ defmodule PlausibleWeb.Api.StatsController.SourcesTest do
)

assert json_response(conn, 200) == [
%{
"name" => "Google",
"visitors" => 1,
"conversion_rate" => 50.0,
"total_visitors" => 2
},
%{
"name" => "DuckDuckGo",
"visitors" => 1,
"conversion_rate" => 100.0,
"total_visitors" => 1
},
%{
"name" => "Google",
"visitors" => 1,
"conversion_rate" => 50.0,
"total_visitors" => 2
}
]
end
Expand Down

0 comments on commit 1f5e2e2

Please sign in to comment.