Skip to content

Commit 4f972a7

Browse files
committed
Add quarter hour grouping
1 parent cf220c6 commit 4f972a7

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

gefapi/services/stats_service.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,14 @@ def _get_execution_time_series(
578578
else_=Execution.start_date,
579579
)
580580

581-
timestamp_bucket = func.date_trunc(trunc_format, event_timestamp)
581+
if group_by == "quarter_hour":
582+
interval_seconds = 900 # 15 minutes
583+
timestamp_bucket = func.to_timestamp(
584+
func.floor(func.extract("epoch", event_timestamp) / interval_seconds)
585+
* interval_seconds
586+
)
587+
else:
588+
timestamp_bucket = func.date_trunc(trunc_format, event_timestamp)
582589

583590
query = db.session.query(
584591
timestamp_bucket.label("timestamp"),

tests/services/test_stats_service.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,37 @@ def test_get_cache_info_unavailable(self, mock_get_redis_cache):
289289
assert result["available"] is False
290290
assert "error" in result
291291

292+
@patch("gefapi.services.stats_service.db")
293+
def test_execution_time_series_quarter_hour_bucket(self, mock_db):
294+
"""Quarter-hour grouping should return 15 minute buckets."""
295+
query_mock = MagicMock()
296+
mock_db.session.query.return_value = query_mock
297+
298+
query_mock.join.return_value = query_mock
299+
query_mock.filter.return_value = query_mock
300+
query_mock.group_by.return_value = query_mock
301+
query_mock.all.return_value = [
302+
SimpleNamespace(
303+
timestamp=datetime(2025, 1, 1, 10, 15, 0),
304+
total=3,
305+
status="FINISHED",
306+
slug="productivity-v2.0.0",
307+
)
308+
]
309+
310+
result = StatsService._get_execution_time_series(
311+
"last_day", "quarter_hour", None, None
312+
)
313+
314+
assert result == [
315+
{
316+
"timestamp": "2025-01-01T10:15:00",
317+
"total": 3,
318+
"by_status": {"FINISHED": 3},
319+
"by_task": {"productivity": 3},
320+
}
321+
]
322+
292323
@patch("gefapi.services.stats_service.db")
293324
def test_execution_time_series_aggregates_totals(self, mock_db):
294325
"""Total counts should reflect aggregated values from the query."""

0 commit comments

Comments
 (0)