Skip to content

Commit 4e69b33

Browse files
committed
has_done is now session-based not user-based
1 parent 0223bb7 commit 4e69b33

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

lib/plausible/stats/sql/where_builder.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ defmodule Plausible.Stats.SQL.WhereBuilder do
100100

101101
dynamic(
102102
[t],
103-
t.user_id in subquery(from(e in "events_v2", where: ^condition, select: e.user_id))
103+
t.session_id in subquery(from(e in "events_v2", where: ^condition, select: e.session_id))
104104
)
105105
end
106106

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

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4473,6 +4473,40 @@ defmodule PlausibleWeb.Api.ExternalStatsController.QueryTest do
44734473
end
44744474

44754475
describe "behavioral (has_done/has_not_done) filters" do
4476+
test "has_done does counting by sessions", %{conn: conn, site: site} do
4477+
populate_stats(site, [
4478+
# Session 1
4479+
build(:event, name: "Conversion", user_id: 1, timestamp: ~N[2021-01-01 00:00:00]),
4480+
build(:event, name: "pageview", user_id: 1, timestamp: ~N[2021-01-01 00:01:00]),
4481+
# Session 2
4482+
build(:event, name: "pageview", user_id: 1, timestamp: ~N[2021-01-02 00:00:00]),
4483+
build(:event, name: "pageview", user_id: 1, timestamp: ~N[2021-01-02 00:01:00]),
4484+
# Session 3
4485+
build(:event, name: "Conversion", user_id: 1, timestamp: ~N[2021-01-03 00:00:00]),
4486+
build(:event, name: "pageview", user_id: 1, timestamp: ~N[2021-01-03 00:01:00]),
4487+
build(:event, name: "pageview", user_id: 1, timestamp: ~N[2021-01-03 00:02:00]),
4488+
build(:event, name: "pageview", user_id: 1, timestamp: ~N[2021-01-03 00:03:00]),
4489+
# Session 4
4490+
build(:event, name: "Conversion", user_id: 2, timestamp: ~N[2021-01-01 00:00:00]),
4491+
build(:event, name: "pageview", user_id: 2, timestamp: ~N[2021-01-01 00:01:00]),
4492+
build(:event, name: "pageview", user_id: 2, timestamp: ~N[2021-01-01 00:02:00]),
4493+
build(:event, name: "pageview", user_id: 2, timestamp: ~N[2021-01-01 00:03:00]),
4494+
build(:event, name: "pageview", user_id: 2, timestamp: ~N[2021-01-01 00:04:00])
4495+
])
4496+
4497+
conn =
4498+
post(conn, "/api/v2/query-internal-test", %{
4499+
"site_id" => site.domain,
4500+
"metrics" => ["visitors", "visits", "events", "pageviews"],
4501+
"date_range" => "all",
4502+
"filters" => [["has_done", ["is", "event:name", ["Conversion"]]]]
4503+
})
4504+
4505+
assert json_response(conn, 200)["results"] == [
4506+
%{"dimensions" => [], "metrics" => [2, 3, 11, 8]}
4507+
]
4508+
end
4509+
44764510
test "has_done returns all events by users who match condition if no further filters are provided",
44774511
%{conn: conn, site: site} do
44784512
populate_stats(site, [
@@ -4584,10 +4618,10 @@ defmodule PlausibleWeb.Api.ExternalStatsController.QueryTest do
45844618
test "has_done with complex event:props and event:name filters", %{conn: conn, site: site} do
45854619
populate_stats(site, [
45864620
build(:event, name: "Purchase", user_id: 1, timestamp: ~N[2021-01-01 00:00:00]),
4587-
build(:event, name: "Purchase", user_id: 1, timestamp: ~N[2021-01-02 00:00:00]),
4588-
build(:event, name: "Purchase", user_id: 1, timestamp: ~N[2021-01-03 00:00:00]),
4621+
build(:event, name: "Purchase", user_id: 1, timestamp: ~N[2021-01-01 00:10:00]),
4622+
build(:event, name: "Purchase", user_id: 1, timestamp: ~N[2021-01-01 00:20:00]),
45894623
build(:event, name: "pageview", user_id: 2, timestamp: ~N[2021-01-01 00:00:00]),
4590-
build(:event, name: "Purchase", user_id: 2, timestamp: ~N[2021-01-03 00:00:00]),
4624+
build(:event, name: "Purchase", user_id: 2, timestamp: ~N[2021-01-01 00:10:00]),
45914625
build(:event,
45924626
name: "Signup",
45934627
user_id: 3,

0 commit comments

Comments
 (0)