Skip to content

Commit fa00523

Browse files
committed
fixes tests
1 parent 07f2cf4 commit fa00523

File tree

3 files changed

+33
-21
lines changed

3 files changed

+33
-21
lines changed

services/web/server/src/simcore_service_webserver/projects/_jobs_repository.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,25 @@ def _apply_job_parent_resource_name_filter(
4040
def _apply_metadata_filter(
4141
query: sa.sql.Select, any_of_metadata_fields: list[dict[str, str]]
4242
) -> sa.sql.Select:
43+
"""Apply metadata filters to query.
4344
45+
For PostgreSQL JSONB fields, we need to extract the text value using ->> operator
46+
before applying string comparison operators like ILIKE.
47+
"""
4448
assert any_of_metadata_fields # nosec
4549

46-
expressions = [
47-
projects_metadata.c.custom[key].ilike(
48-
# NOTE: we use ilike to be case insensitive
49-
# NOTE: supports glob wildcards
50-
pattern.replace("*", "%")
51-
)
52-
for field in any_of_metadata_fields
53-
for key, pattern in field.items()
54-
]
50+
expressions = []
51+
for field in any_of_metadata_fields:
52+
for key, pattern in field.items():
53+
# Use ->> operator to extract the text value from JSONB
54+
# Then apply ILIKE for case-insensitive pattern matching
55+
sql_pattern = pattern.replace(
56+
"*", "%"
57+
) # Convert glob-like pattern to SQL LIKE
58+
expressions.append(
59+
projects_metadata.c.custom[key].astext.ilike(sql_pattern)
60+
)
61+
5562
return query.where(sa.or_(*expressions))
5663

5764

@@ -88,7 +95,7 @@ async def list_projects_marked_as_jobs(
8895
pagination_offset: int = 0,
8996
pagination_limit: int = 10,
9097
filter_by_job_parent_resource_name_prefix: str | None = None,
91-
filter_by_any_of_metadata_fields: list[dict[str, str]] | None = None,
98+
filter_by_any_custom_metadata: list[dict[str, str]] | None = None,
9299
) -> tuple[int, list[ProjectJobDBGet]]:
93100
"""Lists projects marked as jobs for a specific user and product
94101
@@ -127,6 +134,11 @@ async def list_projects_marked_as_jobs(
127134
project_to_groups,
128135
projects_to_jobs.c.project_uuid == project_to_groups.c.project_uuid,
129136
)
137+
.join(
138+
# NOTE: avoids `SAWarning: SELECT statement has a cartesian product ...`
139+
projects,
140+
projects_to_jobs.c.project_uuid == projects.c.uuid,
141+
)
130142
.outerjoin(
131143
projects_metadata,
132144
projects_to_jobs.c.project_uuid == projects_metadata.c.project_uuid,
@@ -149,9 +161,9 @@ async def list_projects_marked_as_jobs(
149161
access_query, filter_by_job_parent_resource_name_prefix
150162
)
151163

152-
if filter_by_any_of_metadata_fields:
164+
if filter_by_any_custom_metadata:
153165
access_query = _apply_metadata_filter(
154-
access_query, filter_by_any_of_metadata_fields
166+
access_query, filter_by_any_custom_metadata
155167
)
156168

157169
# Step 4. Convert access_query to a subquery

services/web/server/src/simcore_service_webserver/projects/_jobs_service.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ async def list_my_projects_marked_as_jobs(
5757
offset: int = 0,
5858
limit: int = 10,
5959
filter_by_job_parent_resource_name_prefix: str | None = None,
60-
filter_by_any_of_metadata: list[dict[str, str]] | None = None,
60+
filter_by_any_custom_metadata: list[dict[str, str]] | None = None,
6161
) -> tuple[int, list[ProjectJobDBGet]]:
6262
"""
6363
Lists paginated projects marked as jobs for the given user and product.
@@ -70,5 +70,5 @@ async def list_my_projects_marked_as_jobs(
7070
pagination_offset=offset,
7171
pagination_limit=limit,
7272
filter_by_job_parent_resource_name_prefix=filter_by_job_parent_resource_name_prefix,
73-
filter_by_any_of_metadata_fields=filter_by_any_of_metadata,
73+
filter_by_any_custom_metadata=filter_by_any_custom_metadata,
7474
)

services/web/server/tests/unit/with_dbs/02/test_projects__jobs_service.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ async def test_filter_projects_by_metadata(
242242
app=client.app,
243243
product_name=osparc_product_name,
244244
user_id=user_id,
245-
filter_by_any_of_metadata=filter_exact,
245+
filter_by_any_custom_metadata=filter_exact,
246246
)
247247
assert total_count == 1
248248
assert len(result) == 1
@@ -254,7 +254,7 @@ async def test_filter_projects_by_metadata(
254254
app=client.app,
255255
product_name=osparc_product_name,
256256
user_id=user_id,
257-
filter_by_any_of_metadata=filter_multiple_keys,
257+
filter_by_any_custom_metadata=filter_multiple_keys,
258258
)
259259
assert total_count == 1
260260
assert len(result) == 1
@@ -269,7 +269,7 @@ async def test_filter_projects_by_metadata(
269269
app=client.app,
270270
product_name=osparc_product_name,
271271
user_id=user_id,
272-
filter_by_any_of_metadata=filter_alternative,
272+
filter_by_any_custom_metadata=filter_alternative,
273273
)
274274
assert total_count == 1
275275
assert len(result) == 1
@@ -281,7 +281,7 @@ async def test_filter_projects_by_metadata(
281281
app=client.app,
282282
product_name=osparc_product_name,
283283
user_id=user_id,
284-
filter_by_any_of_metadata=filter_non_matching,
284+
filter_by_any_custom_metadata=filter_non_matching,
285285
)
286286
assert total_count == 0
287287
assert len(result) == 0
@@ -293,7 +293,7 @@ async def test_filter_projects_by_metadata(
293293
app=client.app,
294294
product_name=osparc_product_name,
295295
user_id=user_id,
296-
filter_by_any_of_metadata=filter_wildcard,
296+
filter_by_any_custom_metadata=filter_wildcard,
297297
)
298298
assert total_count == 1
299299
assert len(result) == 1
@@ -305,7 +305,7 @@ async def test_filter_projects_by_metadata(
305305
product_name=osparc_product_name,
306306
user_id=user_id,
307307
filter_by_job_parent_resource_name_prefix="test/resource",
308-
filter_by_any_of_metadata=[{"category": "simulation"}],
308+
filter_by_any_custom_metadata=[{"category": "simulation"}],
309309
)
310310
assert total_count == 1
311311
assert len(result) == 1
@@ -317,7 +317,7 @@ async def test_filter_projects_by_metadata(
317317
product_name=osparc_product_name,
318318
user_id=user_id,
319319
filter_by_job_parent_resource_name_prefix="non-matching",
320-
filter_by_any_of_metadata=[{"category": "simulation"}],
320+
filter_by_any_custom_metadata=[{"category": "simulation"}],
321321
)
322322
assert total_count == 0
323323
assert len(result) == 0

0 commit comments

Comments
 (0)