fix: skip unnecessary String cast on already-string search columns

This commit is contained in:
2026-07-26 16:10:38 +02:00
committed by d3vyce
parent adc0ff14c1
commit 169bf710f0
2 changed files with 21 additions and 2 deletions
+5 -2
View File
@@ -159,8 +159,11 @@ def build_search_filters(
else: else:
column = field column = field
# Build the filter (cast to String for non-text columns) # Build the filter (cast to String only when needed, to preserve
column_as_string = column.cast(String) # pg_trgm GIN index usability on already-String columns)
column_as_string = (
column if isinstance(column.type, String) else column.cast(String)
)
if config.case_sensitive: if config.case_sensitive:
filters.append(column_as_string.like(f"%{query}%")) filters.append(column_as_string.like(f"%{query}%"))
else: else:
+16
View File
@@ -372,6 +372,22 @@ class TestBuildSearchFilters:
assert len(joins) == 1 assert len(joins) == 1
def test_skips_cast_on_string_column(self):
"""String columns are filtered directly, without a CAST (keeps pg_trgm indexable)."""
from fastapi_toolsets.crud.search import build_search_filters
filters, _ = build_search_filters(User, "john", search_fields=[User.username])
assert "CAST" not in str(filters[0])
def test_casts_non_string_column(self):
"""Non-string columns (e.g. UUID) still get cast to String so ilike works."""
from fastapi_toolsets.crud.search import build_search_filters
filters, _ = build_search_filters(User, "123", search_fields=[User.id])
assert "CAST" in str(filters[0])
class TestSearchConfig: class TestSearchConfig:
"""Tests for SearchConfig options.""" """Tests for SearchConfig options."""