Skip to content

Commit 042d47c

Browse files
committed
query added
1 parent 6096927 commit 042d47c

1 file changed

Lines changed: 26 additions & 12 deletions

File tree

src/google/adk/sessions/firestore_session_service.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import asyncio
2222
import logging
23+
from datetime import datetime, timezone
2324
from typing import Any, Dict, Optional
2425

2526
from google.cloud import firestore
@@ -121,19 +122,32 @@ def _get_from_firestore():
121122
last_update_time=update_timestamp,
122123
)
123124

124-
# Fetch events without ordering from the database to avoid index requirements.
125+
# Build the query for events.
126+
# Note: This requires a composite index in Firestore on the 'timestamp' field.
125127
events_ref = session_ref.collection(EVENTS_SUBCOLLECTION)
126-
event_docs = events_ref.stream()
127-
events_list = [_from_firestore_doc_to_event(doc) for doc in event_docs]
128-
# Sort the events in the application code instead.
129-
events_list.sort(key=lambda e: e.timestamp)
130-
session.events = events_list
131-
132-
if config:
133-
if config.num_recent_events:
134-
session.events = session.events[-config.num_recent_events :]
135-
elif config.after_timestamp:
136-
session.events = [e for e in session.events if e.timestamp > config.after_timestamp]
128+
query = events_ref
129+
130+
if config and config.num_recent_events:
131+
query = query.order_by(
132+
"timestamp", direction=firestore.Query.DESCENDING
133+
).limit(config.num_recent_events)
134+
event_docs = query.stream()
135+
events_list = [_from_firestore_doc_to_event(doc) for doc in event_docs]
136+
# Reverse the list to have events in chronological order.
137+
events_list.reverse()
138+
session.events = events_list
139+
else:
140+
if config and config.after_timestamp:
141+
# Firestore timestamps can be compared with datetime objects.
142+
after_dt = datetime.fromtimestamp(
143+
config.after_timestamp, tz=timezone.utc
144+
)
145+
query = query.where(filter=FieldFilter("timestamp", ">", after_dt))
146+
147+
query = query.order_by("timestamp", direction=firestore.Query.ASCENDING)
148+
event_docs = query.stream()
149+
events_list = [_from_firestore_doc_to_event(doc) for doc in event_docs]
150+
session.events = events_list
137151

138152
return session
139153

0 commit comments

Comments
 (0)