Skip to content

Commit 1b9db59

Browse files
committed
API v2: add partial_time_labels and present_index to meta
1 parent ec0c526 commit 1b9db59

4 files changed

Lines changed: 90 additions & 0 deletions

File tree

lib/plausible/stats/dashboard/query_parser.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ defmodule Plausible.Stats.Dashboard.QueryParser do
8181
compare: compare,
8282
compare_match_day_of_week: params["include"]["compare_match_day_of_week"] == true,
8383
time_labels: params["include"]["time_labels"] == true,
84+
partial_time_labels: params["include"]["partial_time_labels"] == true,
85+
present_index: params["include"]["present_index"] == true,
8486
trim_relative_date_range: true,
8587
drop_unavailable_time_on_page: true,
8688
drop_unavailable_revenue_metrics: true

lib/plausible/stats/query_include.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ defmodule Plausible.Stats.QueryInclude do
44
defstruct imports: false,
55
imports_meta: false,
66
time_labels: false,
7+
present_index: false,
8+
partial_time_labels: false,
79
total_rows: false,
810
trim_relative_date_range: false,
911
compare: nil,
@@ -19,6 +21,8 @@ defmodule Plausible.Stats.QueryInclude do
1921
imports: boolean(),
2022
imports_meta: boolean(),
2123
time_labels: boolean(),
24+
present_index: boolean(),
25+
partial_time_labels: boolean(),
2226
total_rows: boolean(),
2327
trim_relative_date_range: boolean(),
2428
compare:

lib/plausible/stats/query_result.ex

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ defmodule Plausible.Stats.QueryResult do
5757
|> add_imports_meta(runner.main_query)
5858
|> add_metric_warnings_meta(runner.main_query)
5959
|> add_time_labels_meta(runner.main_query)
60+
|> add_present_index_meta(runner.main_query)
61+
|> add_partial_time_labels_meta(runner.main_query)
6062
|> add_total_rows_meta(runner.main_query, runner.total_rows)
6163
|> Enum.sort_by(&elem(&1, 0))
6264
end
@@ -93,6 +95,30 @@ defmodule Plausible.Stats.QueryResult do
9395
end
9496
end
9597

98+
defp add_present_index_meta(meta, query) do
99+
time_labels = meta[:time_labels]
100+
101+
if query.include.present_index and is_list(time_labels) do
102+
Map.put(meta, :present_index, Plausible.Stats.Time.present_index(time_labels, query))
103+
else
104+
meta
105+
end
106+
end
107+
108+
defp add_partial_time_labels_meta(meta, query) do
109+
time_labels = meta[:time_labels]
110+
111+
if query.include.partial_time_labels and is_list(time_labels) do
112+
Map.put(
113+
meta,
114+
:partial_time_labels,
115+
Plausible.Stats.Time.partial_time_labels(time_labels, query)
116+
)
117+
else
118+
meta
119+
end
120+
end
121+
96122
defp add_total_rows_meta(meta, query, total_rows) do
97123
if query.include.total_rows do
98124
Map.put(meta, :total_rows, total_rows)

lib/plausible/stats/time.ex

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,64 @@ defmodule Plausible.Stats.Time do
120120
|> Enum.map(&format_datetime/1)
121121
end
122122

123+
def partial_time_labels(time_labels, query) do
124+
case time_dimension(query) do
125+
"time:week" ->
126+
date_range = Query.date_range(query)
127+
partial_labels(time_labels, date_range, &Date.beginning_of_week/1, &Date.end_of_week/1)
128+
129+
"time:month" ->
130+
date_range = Query.date_range(query)
131+
partial_labels(time_labels, date_range, &Date.beginning_of_month/1, &Date.end_of_month/1)
132+
133+
_ ->
134+
nil
135+
end
136+
end
137+
138+
defp partial_labels(time_labels, date_range, start_fn, end_fn) do
139+
Enum.filter(time_labels, fn label ->
140+
case Date.from_iso8601(label) do
141+
{:ok, date} ->
142+
start_in_range = Enum.member?(date_range, start_fn.(date))
143+
end_in_range = Enum.member?(date_range, end_fn.(date))
144+
not start_in_range or not end_in_range
145+
146+
_ ->
147+
false
148+
end
149+
end)
150+
end
151+
152+
def present_index(time_labels, query) do
153+
now = DateTime.now!(query.timezone)
154+
155+
current_label =
156+
case time_dimension(query) do
157+
"time:month" ->
158+
DateTime.to_date(now)
159+
|> Date.beginning_of_month()
160+
|> Date.to_string()
161+
162+
"time:week" ->
163+
DateTime.to_date(now)
164+
|> date_or_weekstart(Query.date_range(query))
165+
|> Date.to_string()
166+
167+
"time:day" ->
168+
DateTime.to_date(now)
169+
|> Date.to_string()
170+
171+
"time:hour" ->
172+
Calendar.strftime(now, "%Y-%m-%d %H:00:00")
173+
174+
"time:minute" ->
175+
Calendar.strftime(now, "%Y-%m-%d %H:%M:00")
176+
end
177+
178+
Enum.find_index(time_labels, &(&1 == current_label))
179+
end
180+
123181
def date_or_weekstart(date, date_range) do
124182
weekstart = Date.beginning_of_week(date)
125183

0 commit comments

Comments
 (0)