Refactor: Remove `filter_key` terminology from backend (#4994)

* Remove filter_key terminology from the backend

This resurfaced in a recent review, `dimension` or `filter_dimension` is the correct terminology in the backend

* Update table_decider

* Solve new issues
This commit is contained in:
Karl-Aksel Puulmann 2025-01-21 17:36:34 +02:00 committed by GitHub
parent ad4e9ee0ff
commit 714f7f4603
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 29 additions and 26 deletions

View File

@ -125,13 +125,13 @@ defmodule Plausible.Stats.Filters.QueryParser do
when operator in [:not, :has_done, :has_not_done], when operator in [:not, :has_done, :has_not_done],
do: parse_filter(filter) do: parse_filter(filter)
def parse_filter_second(_operator, filter), do: parse_filter_key(filter) def parse_filter_second(_operator, filter), do: parse_filter_dimension(filter)
defp parse_filter_key([_operator, filter_key | _rest] = filter) do defp parse_filter_dimension([_operator, filter_dimension | _rest] = filter) do
parse_filter_key_string(filter_key, "Invalid filter '#{i(filter)}") parse_filter_dimension_string(filter_dimension, "Invalid filter '#{i(filter)}")
end end
defp parse_filter_key(filter), do: {:error, "Invalid filter '#{i(filter)}'."} defp parse_filter_dimension(filter), do: {:error, "Invalid filter '#{i(filter)}'."}
defp parse_filter_rest(operator, filter) defp parse_filter_rest(operator, filter)
when operator in [ when operator in [
@ -154,11 +154,11 @@ defmodule Plausible.Stats.Filters.QueryParser do
when operator in [:not, :and, :or, :has_done, :has_not_done], when operator in [:not, :and, :or, :has_done, :has_not_done],
do: {:ok, []} do: {:ok, []}
defp parse_clauses_list([operator, filter_key, list | _rest] = filter) when is_list(list) do defp parse_clauses_list([operator, dimension, list | _rest] = filter) when is_list(list) do
all_strings? = Enum.all?(list, &is_binary/1) all_strings? = Enum.all?(list, &is_binary/1)
all_integers? = Enum.all?(list, &is_integer/1) all_integers? = Enum.all?(list, &is_integer/1)
case {filter_key, all_strings?} do case {dimension, all_strings?} do
{"visit:city", false} when all_integers? -> {"visit:city", false} when all_integers? ->
{:ok, list} {:ok, list}
@ -173,7 +173,7 @@ defmodule Plausible.Stats.Filters.QueryParser do
{"segment", _} when all_integers? -> {"segment", _} when all_integers? ->
{:ok, list} {:ok, list}
{_, true} when filter_key !== "segment" -> {_, true} when dimension !== "segment" ->
{:ok, list} {:ok, list}
_ -> _ ->
@ -321,10 +321,10 @@ defmodule Plausible.Stats.Filters.QueryParser do
defp parse_dimension_entry(key, error_message) do defp parse_dimension_entry(key, error_message) do
case { case {
parse_time(key), parse_time(key),
parse_filter_key_string(key) parse_filter_dimension_string(key)
} do } do
{{:ok, time}, _} -> {:ok, time} {{:ok, time}, _} -> {:ok, time}
{_, {:ok, filter_key}} -> {:ok, filter_key} {_, {:ok, dimension}} -> {:ok, dimension}
_ -> {:error, error_message} _ -> {:error, error_message}
end end
end end
@ -333,7 +333,7 @@ defmodule Plausible.Stats.Filters.QueryParser do
case { case {
parse_time(value), parse_time(value),
parse_metric(value), parse_metric(value),
parse_filter_key_string(value) parse_filter_dimension_string(value)
} do } do
{{:ok, time}, _, _} -> {:ok, time} {{:ok, time}, _, _} -> {:ok, time}
{_, {:ok, metric}, _} -> {:ok, metric} {_, {:ok, metric}, _} -> {:ok, metric}
@ -385,31 +385,31 @@ defmodule Plausible.Stats.Filters.QueryParser do
defp atomize_keys(value), do: value defp atomize_keys(value), do: value
defp parse_filter_key_string(filter_key, error_message \\ "") do defp parse_filter_dimension_string(dimension, error_message \\ "") do
case filter_key do case dimension do
"event:props:" <> property_name -> "event:props:" <> property_name ->
if String.length(property_name) > 0 do if String.length(property_name) > 0 do
{:ok, filter_key} {:ok, dimension}
else else
{:error, error_message} {:error, error_message}
end end
"event:" <> key -> "event:" <> key ->
if key in Filters.event_props() do if key in Filters.event_props() do
{:ok, filter_key} {:ok, dimension}
else else
{:error, error_message} {:error, error_message}
end end
"visit:" <> key -> "visit:" <> key ->
if key in Filters.visit_props() do if key in Filters.visit_props() do
{:ok, filter_key} {:ok, dimension}
else else
{:error, error_message} {:error, error_message}
end end
"segment" -> "segment" ->
{:ok, filter_key} {:ok, dimension}
_ -> _ ->
{:error, error_message} {:error, error_message}

View File

@ -109,8 +109,9 @@ defmodule Plausible.Stats.Query do
""" """
def remove_top_level_filters(query, prefixes) do def remove_top_level_filters(query, prefixes) do
new_filters = new_filters =
Enum.reject(query.filters, fn [_, filter_key | _rest] -> Enum.reject(query.filters, fn [_, dimension_or_filter_tree | _rest] ->
is_binary(filter_key) and Enum.any?(prefixes, &String.starts_with?(filter_key, &1)) is_binary(dimension_or_filter_tree) and
Enum.any?(prefixes, &String.starts_with?(dimension_or_filter_tree, &1))
end) end)
query query
@ -179,9 +180,10 @@ defmodule Plausible.Stats.Query do
@spec trace(%__MODULE__{}, [atom()]) :: %__MODULE__{} @spec trace(%__MODULE__{}, [atom()]) :: %__MODULE__{}
def trace(%__MODULE__{} = query, metrics) do def trace(%__MODULE__{} = query, metrics) do
filter_keys = filter_dimensions =
query.filters query.filters
|> Enum.map(fn [_op, prop | _rest] -> prop end) |> Enum.map(fn [_op, dimension | _rest] -> dimension end)
|> Enum.filter(&is_binary/1)
|> Enum.sort() |> Enum.sort()
|> Enum.join(";") |> Enum.join(";")
@ -192,7 +194,7 @@ defmodule Plausible.Stats.Query do
{"plausible.query.period", query.period}, {"plausible.query.period", query.period},
{"plausible.query.dimensions", query.dimensions |> Enum.join(";")}, {"plausible.query.dimensions", query.dimensions |> Enum.join(";")},
{"plausible.query.include_imported", query.include_imported}, {"plausible.query.include_imported", query.include_imported},
{"plausible.query.filter_keys", filter_keys}, {"plausible.query.filter_keys", filter_dimensions},
{"plausible.query.metrics", metrics} {"plausible.query.metrics", metrics}
]) ])

View File

@ -121,7 +121,7 @@ defmodule Plausible.Stats.QueryOptimizer do
# Note: Only works since event:hostname is only allowed as a top level filter # Note: Only works since event:hostname is only allowed as a top level filter
hostname_filters = hostname_filters =
query.filters query.filters
|> Enum.filter(fn [_operation, filter_key | _rest] -> filter_key == "event:hostname" end) |> Enum.filter(fn [_operation, dimension | _rest] -> dimension == "event:hostname" end)
if length(hostname_filters) > 0 do if length(hostname_filters) > 0 do
extra_filters = extra_filters =
@ -136,10 +136,10 @@ defmodule Plausible.Stats.QueryOptimizer do
defp hostname_filters_for_dimension(dimension, hostname_filters) do defp hostname_filters_for_dimension(dimension, hostname_filters) do
if Map.has_key?(@dimensions_hostname_map, dimension) do if Map.has_key?(@dimensions_hostname_map, dimension) do
filter_key = Map.get(@dimensions_hostname_map, dimension) dimension = Map.get(@dimensions_hostname_map, dimension)
hostname_filters hostname_filters
|> Enum.map(fn [operation, _filter_key | rest] -> [operation, filter_key | rest] end) |> Enum.map(fn [operation, _dimension | rest] -> [operation, dimension | rest] end)
else else
[] []
end end

View File

@ -152,9 +152,10 @@ defmodule Plausible.Stats.TableDeciderTest do
end end
end end
defp make_query(filter_keys, dimensions \\ []) do defp make_query(filter_dimensions, dimensions \\ []) do
Query.from(build(:site), %{ Query.from(build(:site), %{
"filters" => Enum.map(filter_keys, fn filter_key -> ["is", filter_key, []] end), "filters" =>
Enum.map(filter_dimensions, fn filter_dimension -> ["is", filter_dimension, []] end),
"dimensions" => dimensions "dimensions" => dimensions
}) })
end end