Skip to content

Commit 12aa9f3

Browse files
committed
Add tests
1 parent de490d0 commit 12aa9f3

File tree

3 files changed

+52
-5
lines changed

3 files changed

+52
-5
lines changed

lib/plausible/stats/filters/filters.ex

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ defmodule Plausible.Stats.Filters do
5757
5858
Returns an empty list when argument type is unexpected (e.g. `nil`).
5959
60-
### Examples:
60+
## Examples:
6161
6262
iex> Filters.parse("visit:browser!=Chrome")
6363
[[:is_not, "visit:browser", ["Chrome"]]]
@@ -128,6 +128,16 @@ defmodule Plausible.Stats.Filters do
128128
Transformer will receive each node (filter, and/or/not subtree) of
129129
query and must return a list of nodes to replace it with or nil
130130
to ignore and look deeper.
131+
132+
## Examples
133+
134+
iex> Filters.transform_filters([[:is, "visit:entry_page", ["/blog"]]], fn f -> [f] end)
135+
[[:is, "visit:entry_page", ["/blog"]]]
136+
137+
iex> Filters.transform_filters([[:is, "visit:entry_page", ["/blog"]]], fn _f -> nil end)
138+
[[[:is, "visit:entry_page", ["/blog"]]]]
139+
140+
131141
"""
132142
def transform_filters(filters, transformer) do
133143
filters

lib/plausible/stats/filters/query_parser.ex

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,18 @@ defmodule Plausible.Stats.Filters.QueryParser do
452452
}
453453
end
454454

455+
@doc """
456+
Finds unique segment IDs used in query filters.
457+
458+
## Examples
459+
iex> get_segment_ids([[:not, [:is, "segment", [10, 20]]], [:contains, "visit:entry_page", ["blog"]]])
460+
461+
{:ok, [10, 20]}
462+
463+
iex> get_segment_ids([[:and, [[:is, "segment", Enum.to_list(1..6)], [:is, "segment", Enum.to_list(1..6)]]]])
464+
465+
{:error, "Invalid filters. You can only use up to 10 segment filters in a query."}
466+
"""
455467
def get_segment_ids(filters) do
456468
max_segment_filters_count = 10
457469

@@ -500,13 +512,37 @@ defmodule Plausible.Stats.Filters.QueryParser do
500512
end
501513

502514
defp replace_segment_with_filter_tree([_, "segment", clauses], preloaded_segments) do
503-
[[:or, Enum.map(clauses, fn id -> [:and, Map.get(preloaded_segments, id)] end)]]
515+
if length(clauses) === 1 do
516+
[[:and, Map.get(preloaded_segments, Enum.at(clauses, 0))]]
517+
else
518+
[[:or, Enum.map(clauses, fn id -> [:and, Map.get(preloaded_segments, id)] end)]]
519+
end
504520
end
505521

506-
defp replace_segment_with_filter_tree(_filter_tree, _preloaded_segments) do
507-
nil
522+
defp replace_segment_with_filter_tree(filter, _preloaded_segments) do
523+
[filter]
508524
end
509525

526+
@doc """
527+
## Examples
528+
529+
iex> resolve_segments([[:is, "visit:entry_page", ["/home"]]], %{})
530+
{:ok, [[:is, "visit:entry_page", ["/home"]]]}
531+
532+
iex> resolve_segments([[:is, "visit:entry_page", ["/home"]], [:is, "segment", [1]]], %{1 => [[:contains, "visit:entry_page", ["blog"]], [:is, "visit:country", ["PL"]]]})
533+
{:ok, [
534+
[:is, "visit:entry_page", ["/home"]],
535+
[:and, [[:contains, "visit:entry_page", ["blog"]], [:is, "visit:country", ["PL"]]]]
536+
]}
537+
538+
iex> resolve_segments([[:is, "segment", [1, 2]]], %{1 => [[:contains, "event:goal", ["Singup"]], [:is, "visit:country", ["PL"]]], 2 => [[:contains, "event:goal", ["Sauna"]], [:is, "visit:country", ["EE"]]]})
539+
{:ok, [
540+
[:or, [
541+
[:and, [[:contains, "event:goal", ["Singup"]], [:is, "visit:country", ["PL"]]]],
542+
[:and, [[:contains, "event:goal", ["Sauna"]], [:is, "visit:country", ["EE"]]]]]
543+
]
544+
]}
545+
"""
510546
def resolve_segments(original_filters, preloaded_segments) do
511547
if Map.keys(preloaded_segments) !== [] do
512548
{:ok,

test/plausible/stats/query_parser_test.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ defmodule Plausible.Stats.Filters.QueryParserTest do
22
use Plausible
33
use Plausible.DataCase
44
use Plausible.Teams.Test
5+
import Plausible.Stats.Filters.QueryParser
6+
doctest Plausible.Stats.Filters.QueryParser
57

68
alias Plausible.Stats.DateTimeRange
79
alias Plausible.Stats.Filters
8-
import Plausible.Stats.Filters.QueryParser
910

1011
setup [:create_user, :create_site]
1112

0 commit comments

Comments
 (0)