From c024ac576271b7412826c3f44beb62a821f1ec2a Mon Sep 17 00:00:00 2001 From: Yongsul Kim Date: Tue, 27 May 2025 11:21:15 -0700 Subject: [PATCH] Align event filtering and ordering logic Copybara import of the project: -- d01a8fd5f079bc4fca9e4b71796dbe65312ce9ff by Leo Yongsul Kim : fix(DatabaseSessionService): Align event filtering and ordering logic This commit addresses inconsistencies in how DatabaseSessionService handles config.after_timestamp and config.num_recent_events parameters, aligning its behavior with InMemorySessionService and VertexAiSessionService. Key changes: - Made after_timestamp filtering inclusive - Corrected num_recent_events behavior to fetch the N most recent events - Refined timezone handling for after_timestamp - Updated the unit test test_get_session_with_config to includeSessionServiceType.DATABASE, allowing verification of these fixes. Fixes #911 COPYBARA_INTEGRATE_REVIEW=https://github.com/google/adk-python/pull/915 from ystory:fix/database-session-timestamp-recency 5cc8cf5f5a5c0cb3e87f6ab178a5725d3f696c88 PiperOrigin-RevId: 763874840 --- src/google/adk/sessions/database_session_service.py | 11 ++++------- tests/unittests/sessions/test_session_service.py | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/google/adk/sessions/database_session_service.py b/src/google/adk/sessions/database_session_service.py index 42d06ea..be1bb21 100644 --- a/src/google/adk/sessions/database_session_service.py +++ b/src/google/adk/sessions/database_session_service.py @@ -13,7 +13,6 @@ # limitations under the License. import copy from datetime import datetime -from datetime import timezone import json import logging from typing import Any @@ -371,10 +370,8 @@ class DatabaseSessionService(BaseSessionService): return None if config and config.after_timestamp: - after_dt = datetime.fromtimestamp( - config.after_timestamp, tz=timezone.utc - ) - timestamp_filter = StorageEvent.timestamp > after_dt + after_dt = datetime.fromtimestamp(config.after_timestamp) + timestamp_filter = StorageEvent.timestamp >= after_dt else: timestamp_filter = True @@ -382,7 +379,7 @@ class DatabaseSessionService(BaseSessionService): session_factory.query(StorageEvent) .filter(StorageEvent.session_id == storage_session.id) .filter(timestamp_filter) - .order_by(StorageEvent.timestamp.asc()) + .order_by(StorageEvent.timestamp.desc()) .limit( config.num_recent_events if config and config.num_recent_events @@ -429,7 +426,7 @@ class DatabaseSessionService(BaseSessionService): error_message=e.error_message, interrupted=e.interrupted, ) - for e in storage_events + for e in reversed(storage_events) ] return session diff --git a/tests/unittests/sessions/test_session_service.py b/tests/unittests/sessions/test_session_service.py index 59f2443..e28f7ff 100644 --- a/tests/unittests/sessions/test_session_service.py +++ b/tests/unittests/sessions/test_session_service.py @@ -315,7 +315,7 @@ async def test_append_event_complete(service_type): @pytest.mark.asyncio -@pytest.mark.parametrize('service_type', [SessionServiceType.IN_MEMORY]) +@pytest.mark.parametrize('service_type', [SessionServiceType.IN_MEMORY, SessionServiceType.DATABASE]) async def test_get_session_with_config(service_type): session_service = get_session_service(service_type) app_name = 'my_app'