mirror of
https://github.com/d3vyce/fastapi-toolsets.git
synced 2026-08-04 15:44:09 +00:00
fix: skip unnecessary String cast on already-string search columns
This commit is contained in:
@@ -159,8 +159,11 @@ def build_search_filters(
|
||||
else:
|
||||
column = field
|
||||
|
||||
# Build the filter (cast to String for non-text columns)
|
||||
column_as_string = column.cast(String)
|
||||
# Build the filter (cast to String only when needed, to preserve
|
||||
# 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:
|
||||
filters.append(column_as_string.like(f"%{query}%"))
|
||||
else:
|
||||
|
||||
@@ -372,6 +372,22 @@ class TestBuildSearchFilters:
|
||||
|
||||
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:
|
||||
"""Tests for SearchConfig options."""
|
||||
|
||||
Reference in New Issue
Block a user