Skip to content

Commit

Permalink
fix(main-graph): fix 12mo and other comparisons with blanks (#4333)
Browse files Browse the repository at this point in the history
Some comparisons return __blank__ values. After recent time series fix,
this blew up when trying to parse __blank__ as a date.

This fixes the issue and adds a test for a period with __blank__ values

Co-authored-by: RobertJoonas <[email protected]>
  • Loading branch information
macobo and RobertJoonas authored Jul 10, 2024
1 parent 4d19603 commit 645b813
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 19 deletions.
38 changes: 19 additions & 19 deletions lib/plausible_web/controllers/api/stats_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -172,36 +172,36 @@ defmodule PlausibleWeb.Api.StatsController do
end
end

defp build_full_intervals(%{interval: "week", date_range: range}, labels) do
for label <- labels, into: %{} do
date = Date.from_iso8601!(label)

interval_start = Timex.beginning_of_week(date)
interval_end = Timex.end_of_week(date)
defp build_full_intervals(%{interval: "week", date_range: date_range}, labels) do
build_intervals(labels, date_range, &Timex.beginning_of_week/1, &Timex.end_of_week/1)
end

within_interval? = Enum.member?(range, interval_start) && Enum.member?(range, interval_end)
defp build_full_intervals(%{interval: "month", date_range: date_range}, labels) do
build_intervals(labels, date_range, &Timex.beginning_of_month/1, &Timex.end_of_month/1)
end

{label, within_interval?}
end
defp build_full_intervals(_query, _labels) do
nil
end

defp build_full_intervals(%{interval: "month", date_range: range}, labels) do
def build_intervals(labels, date_range, start_fn, end_fn) do
for label <- labels, into: %{} do
date = Date.from_iso8601!(label)
case Date.from_iso8601(label) do
{:ok, date} ->
interval_start = start_fn.(date)
interval_end = end_fn.(date)

interval_start = Timex.beginning_of_month(date)
interval_end = Timex.end_of_month(date)
within_interval? =
Enum.member?(date_range, interval_start) && Enum.member?(date_range, interval_end)

within_interval? = Enum.member?(range, interval_start) && Enum.member?(range, interval_end)
{label, within_interval?}

{label, within_interval?}
_ ->
{label, false}
end
end
end

defp build_full_intervals(_query, _labels) do
nil
end

def top_stats(conn, params) do
site = conn.assigns[:site]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,36 @@ defmodule PlausibleWeb.Api.StatsController.MainGraphTest do
assert [0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0] = prev
assert [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0] = curr
end

test "displays conversions per month with 12mo comparison plot", %{
conn: conn,
site: site
} do
insert(:goal, site: site, event_name: "Signup")

populate_stats(site, [
build(:event, name: "Different", timestamp: ~N[2020-01-10 00:00:00]),
build(:event, name: "Signup", timestamp: ~N[2020-02-10 00:00:00]),
build(:event, name: "Signup", timestamp: ~N[2020-03-10 00:00:00]),
build(:event, name: "Signup", timestamp: ~N[2020-04-10 00:00:00]),
build(:pageview, timestamp: ~N[2021-05-10 00:00:00]),
build(:event, name: "Signup", timestamp: ~N[2021-06-11 04:00:00]),
build(:event, name: "Signup", timestamp: ~N[2021-07-11 00:00:00]),
build(:event, name: "Signup", timestamp: ~N[2021-08-11 00:00:00])
])

filters = Jason.encode!(%{goal: "Signup"})

conn =
get(
conn,
"/api/stats/#{site.domain}/main-graph?period=12mo&date=2021-12-11&metric=events&filters=#{filters}&comparison=previous_period"
)

assert %{"plot" => curr, "comparison_plot" => prev} = json_response(conn, 200)
assert [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0] = prev
assert [0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0] = curr
end
end

describe "GET /api/stats/main-graph - bounce_rate plot" do
Expand Down

0 comments on commit 645b813

Please sign in to comment.