Skip to content

Commit b75763c

Browse files
committed
allow time dimensions when querying views_per_visit
1 parent 1bb3b02 commit b75763c

File tree

4 files changed

+83
-13
lines changed

4 files changed

+83
-13
lines changed

lib/plausible/stats/query_builder.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -510,11 +510,11 @@ defmodule Plausible.Stats.QueryBuilder do
510510
message: "Metric `#{metric}` cannot be queried with a filter on `event:page`."
511511
}}
512512

513-
length(query.dimensions) > 0 ->
513+
Enum.any?(query.dimensions, &(not Time.time_dimension?(&1))) ->
514514
{:error,
515515
%QueryError{
516516
code: :invalid_metrics,
517-
message: "Metric `#{metric}` cannot be queried with `dimensions`."
517+
message: "Metric `#{metric}` cannot be queried with non-time dimensions."
518518
}}
519519

520520
true ->

test/plausible/stats/query/query_parse_and_build_test.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2039,7 +2039,7 @@ defmodule Plausible.Stats.Query.QueryParseAndBuildTest do
20392039
assert error == "Metric `views_per_visit` cannot be queried with a filter on `event:page`."
20402040
end
20412041

2042-
test "fails validation with dimensions", %{site: site} do
2042+
test "fails validation with non-time dimensions", %{site: site} do
20432043
params = %{
20442044
"site_id" => site.domain,
20452045
"metrics" => ["views_per_visit"],
@@ -2050,7 +2050,7 @@ defmodule Plausible.Stats.Query.QueryParseAndBuildTest do
20502050
assert {:error, %QueryError{message: error}} =
20512051
Query.parse_and_build(site, params, now: @now)
20522052

2053-
assert error == "Metric `views_per_visit` cannot be queried with `dimensions`."
2053+
assert error == "Metric `views_per_visit` cannot be queried with non-time dimensions."
20542054
end
20552055
end
20562056

test/plausible_web/controllers/api/external_stats_controller/query_validations_test.exs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,11 @@ defmodule PlausibleWeb.Api.ExternalStatsController.QueryValidationsTest do
196196
}
197197
end
198198

199-
test "validates that metric views_per_visit cannot be used together with dimensions", %{
200-
conn: conn,
201-
site: site
202-
} do
199+
test "validates that metric views_per_visit cannot be used together with non-time dimensions",
200+
%{
201+
conn: conn,
202+
site: site
203+
} do
203204
conn =
204205
post(conn, "/api/v2/query", %{
205206
"site_id" => site.domain,
@@ -209,7 +210,7 @@ defmodule PlausibleWeb.Api.ExternalStatsController.QueryValidationsTest do
209210
})
210211

211212
assert json_response(conn, 400) == %{
212-
"error" => "Metric `views_per_visit` cannot be queried with `dimensions`."
213+
"error" => "Metric `views_per_visit` cannot be queried with non-time dimensions."
213214
}
214215
end
215216

test/plausible_web/controllers/api/stats_controller/main_graph_test.exs

Lines changed: 73 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,67 @@ defmodule PlausibleWeb.Api.StatsController.MainGraphTest do
605605
end
606606
end
607607

608+
describe "views_per_visit plot" do
609+
setup [:create_user, :log_in, :create_site, :create_legacy_site_import]
610+
611+
test "views_per_visit for 28 days in weekly buckets (native data only)", %{
612+
conn: conn,
613+
site: site
614+
} do
615+
populate_stats(site, [
616+
build(:pageview, user_id: 1, timestamp: ~N[2021-01-04 00:00:00]),
617+
build(:pageview, user_id: 1, timestamp: ~N[2021-01-04 00:05:00]),
618+
build(:pageview, user_id: 2, timestamp: ~N[2021-01-18 00:00:00]),
619+
build(:pageview, user_id: 2, timestamp: ~N[2021-01-18 00:05:00]),
620+
build(:pageview, user_id: 2, timestamp: ~N[2021-01-18 00:10:00])
621+
])
622+
623+
response =
624+
do_query(conn, site, %{
625+
"date_range" => "28d",
626+
"relative_date" => "2021-01-29",
627+
"metrics" => ["views_per_visit"],
628+
"dimensions" => ["time:week"]
629+
})
630+
631+
assert response["results"] == [
632+
%{"dimensions" => ["2021-01-04"], "metrics" => [2.0]},
633+
%{"dimensions" => ["2021-01-18"], "metrics" => [3.0]}
634+
]
635+
end
636+
637+
test "views_per_visit for a year in monthly buckets (with imported data)", %{
638+
conn: conn,
639+
site: site
640+
} do
641+
populate_stats(site, [
642+
# January 2021 - only imported
643+
build(:imported_visitors, date: ~D[2021-01-01], visits: 6, pageviews: 7),
644+
# March 2021 - imported + native combined
645+
build(:imported_visitors, date: ~D[2021-03-01], visits: 1, pageviews: 4),
646+
build(:pageview, user_id: 1, timestamp: ~N[2021-03-15 00:00:00]),
647+
build(:pageview, user_id: 1, timestamp: ~N[2021-03-15 00:05:00]),
648+
# September 2021 - only native
649+
build(:pageview, user_id: 2, timestamp: ~N[2021-09-01 00:00:00])
650+
])
651+
652+
response =
653+
do_query(conn, site, %{
654+
"date_range" => "year",
655+
"relative_date" => "2021-01-01",
656+
"metrics" => ["views_per_visit"],
657+
"dimensions" => ["time:month"],
658+
"include" => %{"imports" => true}
659+
})
660+
661+
assert response["results"] == [
662+
%{"dimensions" => ["2021-01-01"], "metrics" => [1.17]},
663+
%{"dimensions" => ["2021-03-01"], "metrics" => [3.0]},
664+
%{"dimensions" => ["2021-09-01"], "metrics" => [1.0]}
665+
]
666+
end
667+
end
668+
608669
describe "visitors plot" do
609670
setup [:create_user, :log_in, :create_site, :create_legacy_site_import]
610671

@@ -1469,7 +1530,9 @@ defmodule PlausibleWeb.Api.StatsController.MainGraphTest do
14691530
"metrics" => ["visitors"],
14701531
"dimensions" => ["time:hour"],
14711532
"include" => %{"time_labels" => true}
1472-
}, now: ~U[2021-01-08 08:05:00Z])
1533+
},
1534+
now: ~U[2021-01-08 08:05:00Z]
1535+
)
14731536

14741537
assert response["meta"]["time_labels"] == [
14751538
"2021-01-08 00:00:00",
@@ -1508,7 +1571,9 @@ defmodule PlausibleWeb.Api.StatsController.MainGraphTest do
15081571
"metrics" => ["visitors"],
15091572
"dimensions" => ["time:day"],
15101573
"include" => %{"time_labels" => true}
1511-
}, now: ~U[2021-01-07 12:00:00Z])
1574+
},
1575+
now: ~U[2021-01-07 12:00:00Z]
1576+
)
15121577

15131578
assert response["meta"]["time_labels"] == [
15141579
"2021-01-01",
@@ -1547,7 +1612,9 @@ defmodule PlausibleWeb.Api.StatsController.MainGraphTest do
15471612
"metrics" => ["visitors"],
15481613
"dimensions" => ["time:month"],
15491614
"include" => %{"time_labels" => true}
1550-
}, now: ~U[2021-02-07 12:00:00Z])
1615+
},
1616+
now: ~U[2021-02-07 12:00:00Z]
1617+
)
15511618

15521619
assert response["meta"]["time_labels"] == ["2021-01-01", "2021-02-01"]
15531620

@@ -1763,7 +1830,9 @@ defmodule PlausibleWeb.Api.StatsController.MainGraphTest do
17631830
"metrics" => ["visitors"],
17641831
"dimensions" => ["time:hour"],
17651832
"include" => %{"compare" => "previous_period", "time_labels" => true}
1766-
}, now: ~U[2021-01-08 08:05:00Z])
1833+
},
1834+
now: ~U[2021-01-08 08:05:00Z]
1835+
)
17671836

17681837
results = response["results"]
17691838

0 commit comments

Comments
 (0)