1+ import json
2+
13import pytest
24import sqlalchemy as sql
35from sqlalchemy .dialects import sqlite as sqlite_dialect
@@ -161,59 +163,46 @@ def test_decode_empty_string(self):
161163 assert token .filter_query is None
162164
163165
164- class TestBuildFilterWhereClauses :
165- def test_no_filter (self ):
166- clauses , next_filter = filter_query_sql ._build_filter_where_clauses (
167- filter_value = None ,
168- current_user = None ,
169- )
170- assert clauses == []
171- assert next_filter is None
172-
166+ class TestConvertLegacyFilterToFilterQuery :
173167 def test_created_by_literal (self ):
174- clauses , next_filter = filter_query_sql ._build_filter_where_clauses (
168+ result = filter_query_sql ._convert_legacy_filter_to_filter_query (
175169 filter_value = "created_by:alice" ,
176- current_user = None ,
177170 )
178- assert len (clauses ) == 1
179- assert next_filter == "created_by:alice"
180-
181- def test_created_by_me_resolves (self ):
182- clauses , next_filter = filter_query_sql ._build_filter_where_clauses (
171+ parsed = json .loads (result )
172+ assert parsed == {
173+ "and" : [
174+ {
175+ "value_equals" : {
176+ "key" : "system/pipeline_run.created_by" ,
177+ "value" : "alice" ,
178+ }
179+ }
180+ ]
181+ }
182+
183+ def test_created_by_me_not_resolved (self ):
184+ result = filter_query_sql ._convert_legacy_filter_to_filter_query (
183185 filter_value = "created_by:me" ,
184- current_user = "alice@example.com" ,
185- )
186- assert len (clauses ) == 1
187- assert next_filter == "created_by:alice@example.com"
188-
189- def test_created_by_me_no_current_user (self ):
190- clauses , next_filter = filter_query_sql ._build_filter_where_clauses (
191- filter_value = "created_by:me" ,
192- current_user = None ,
193186 )
194- assert len ( clauses ) == 1
195- assert next_filter == "created_by: "
187+ parsed = json . loads ( result )
188+ assert parsed [ "and" ][ 0 ][ "value_equals" ][ "value" ] == "me "
196189
197- def test_created_by_empty_value (self ):
198- clauses , next_filter = filter_query_sql ._build_filter_where_clauses (
199- filter_value = "created_by:" ,
200- current_user = None ,
201- )
202- assert len (clauses ) == 1
203- assert next_filter == "created_by:"
190+ def test_created_by_empty_raises (self ):
191+ with pytest .raises (errors .ApiValidationError , match = "non-empty value" ):
192+ filter_query_sql ._convert_legacy_filter_to_filter_query (
193+ filter_value = "created_by:" ,
194+ )
204195
205196 def test_unsupported_key_raises (self ):
206197 with pytest .raises (NotImplementedError , match = "Unsupported filter" ):
207- filter_query_sql ._build_filter_where_clauses (
198+ filter_query_sql ._convert_legacy_filter_to_filter_query (
208199 filter_value = "unknown_key:value" ,
209- current_user = None ,
210200 )
211201
212202 def test_text_search_raises (self ):
213203 with pytest .raises (NotImplementedError , match = "Text search" ):
214- filter_query_sql ._build_filter_where_clauses (
204+ filter_query_sql ._convert_legacy_filter_to_filter_query (
215205 filter_value = "some_text_without_colon" ,
216- current_user = None ,
217206 )
218207
219208
@@ -242,7 +231,7 @@ def test_mutual_exclusivity_raises(self):
242231 page_size = 10 ,
243232 )
244233
245- def test_legacy_filter_produces_clauses (self ):
234+ def test_legacy_filter_produces_annotation_clause (self ):
246235 clauses , offset , next_token = filter_query_sql .build_list_filters (
247236 filter_value = "created_by:alice" ,
248237 filter_query_value = None ,
@@ -251,8 +240,12 @@ def test_legacy_filter_produces_clauses(self):
251240 page_size = 10 ,
252241 )
253242 assert len (clauses ) == 1
243+ compiled = _compile (clauses [0 ])
244+ assert "EXISTS" in compiled .upper ()
245+ assert "pipeline_run_annotation" in compiled
254246 assert offset == 0
255- assert next_token .filter == "created_by:alice"
247+ assert next_token .filter is None
248+ assert next_token .filter_query is not None
256249
257250 def test_filter_query_produces_clauses (self ):
258251 fq = '{"and": [{"key_exists": {"key": "team"}}]}'
@@ -268,7 +261,7 @@ def test_filter_query_produces_clauses(self):
268261 assert "EXISTS" in compiled .upper ()
269262 assert next_token .filter_query == fq
270263
271- def test_page_token_restores_offset_and_filters (self ):
264+ def test_page_token_with_legacy_filter_converts (self ):
272265 token = filter_query_sql .PageToken (
273266 offset = 20 ,
274267 filter = "created_by:alice" ,
@@ -282,8 +275,11 @@ def test_page_token_restores_offset_and_filters(self):
282275 )
283276 assert offset == 20
284277 assert len (clauses ) == 1
278+ compiled = _compile (clauses [0 ])
279+ assert "EXISTS" in compiled .upper ()
285280 assert next_token .offset == 30
286- assert next_token .filter == "created_by:alice"
281+ assert next_token .filter is None
282+ assert next_token .filter_query is not None
287283
288284 def test_page_token_restores_filter_query (self ):
289285 fq = '{"and": [{"key_exists": {"key": "env"}}]}'
@@ -319,7 +315,10 @@ def test_created_by_me_resolved_in_next_token(self):
319315 page_size = 10 ,
320316 )
321317 assert len (clauses ) == 1
322- assert next_token .filter == "created_by:bob@example.com"
318+ assert next_token .filter is None
319+ assert next_token .filter_query is not None
320+ parsed_fq = json .loads (next_token .filter_query )
321+ assert parsed_fq ["and" ][0 ]["value_equals" ]["value" ] == "me"
323322
324323
325324class TestSystemKeyValidation :
0 commit comments