diff --git a/apps/api/src/services/platform_operator_service.py b/apps/api/src/services/platform_operator_service.py index 907581103..94bc6036b 100644 --- a/apps/api/src/services/platform_operator_service.py +++ b/apps/api/src/services/platform_operator_service.py @@ -7310,6 +7310,23 @@ async def get_run_detail( # Channel Events # ============================================================================= + +def _exclusive_text_prefix_upper_bound(prefix: str) -> str: + if not prefix: + return "" + last = ord(prefix[-1]) + if last >= 0x10FFFF: + return "" + return f"{prefix[:-1]}{chr(last + 1)}" + + +def _provider_event_id_prefix_bounds(provider_prefix: str) -> tuple[str, str]: + prefix = provider_prefix.strip().lower() + if prefix and ":" not in prefix: + prefix = f"{prefix}:" + return prefix, _exclusive_text_prefix_upper_bound(prefix) + + async def list_recent_channel_events( *, project_id: str | None, @@ -7332,23 +7349,17 @@ async def list_recent_channel_events( if channel_type is not None: stmt = stmt.where(AwoooPConversationEvent.channel_type == channel_type) if recent_provider_prefix is not None: - if ":" in recent_provider_prefix: + prefix_lower, prefix_upper = _provider_event_id_prefix_bounds( + recent_provider_prefix + ) + if prefix_lower: stmt = stmt.where( - AwoooPConversationEvent.provider_event_id.like( - f"{provider_prefix.strip()}%" - ) + AwoooPConversationEvent.provider_event_id >= prefix_lower ) - else: - stmt = stmt.where( - text( - "LOWER(COALESCE(" - "NULLIF(source_envelope->>'provider', ''), " - "NULLIF(split_part(provider_event_id, ':', 1), ''), " - "channel_type" - ")) = :recent_provider_prefix" + if prefix_upper: + stmt = stmt.where( + AwoooPConversationEvent.provider_event_id < prefix_upper ) - ) - stmt = stmt.params(recent_provider_prefix=recent_provider_prefix) stmt = stmt.order_by( AwoooPConversationEvent.received_at.desc(), AwoooPConversationEvent.event_id.desc(), diff --git a/apps/api/tests/test_awooop_conversation_event_hot_path_indexes.py b/apps/api/tests/test_awooop_conversation_event_hot_path_indexes.py index 202f71e3a..27d746919 100644 --- a/apps/api/tests/test_awooop_conversation_event_hot_path_indexes.py +++ b/apps/api/tests/test_awooop_conversation_event_hot_path_indexes.py @@ -1,5 +1,7 @@ from pathlib import Path +from src.services.platform_operator_service import _provider_event_id_prefix_bounds + ROOT = Path(__file__).resolve().parents[1] MIGRATION = "awooop_conversation_event_hot_path_indexes_2026-07-01.sql" ROLLBACK = "awooop_conversation_event_hot_path_indexes_2026-07-01_down.sql" @@ -57,9 +59,9 @@ def test_provider_recent_indexes_match_live_hot_queries() -> None: assert "COALESCE(NULLIF(source_envelope->>'provider', '')" in coverage_source assert "ORDER BY received_at DESC" in coverage_source - assert "LOWER(COALESCE(NULLIF(source_envelope->>'provider', '')" in operator_source - assert "recent_provider_prefix" in operator_source - assert "NULLIF(split_part(provider_event_id, ':', 1), '')" in operator_source + assert "_provider_event_id_prefix_bounds" in operator_source + assert "provider_event_id >= prefix_lower" in operator_source + assert "provider_event_id < prefix_upper" in operator_source assert "idx_awooop_conv_event_project_provider_recent" in sql assert "idx_awooop_conv_event_project_provider_lower_recent" in sql @@ -69,6 +71,18 @@ def test_provider_recent_indexes_match_live_hot_queries() -> None: assert "event_id DESC" in sql +def test_recent_provider_prefix_uses_btree_range_bounds() -> None: + assert _provider_event_id_prefix_bounds("alertmanager") == ( + "alertmanager:", + "alertmanager;", + ) + assert _provider_event_id_prefix_bounds("alertmanager:received") == ( + "alertmanager:received", + "alertmanager:receivee", + ) + assert _provider_event_id_prefix_bounds(" SignOz ") == ("signoz:", "signoz;") + + def test_truth_chain_source_lookup_indexes_match_or_terms() -> None: sql = _migration_sql() truth_chain_source = _read("src/services/awooop_truth_chain_service.py")