fix: Case Insensitive Query Filters (#5162)

This commit is contained in:
Michael Genson
2025-03-10 05:56:12 -05:00
committed by GitHub
parent 4ecfd8ec78
commit ad59e653da
2 changed files with 43 additions and 2 deletions

View File

@@ -180,6 +180,9 @@ class QueryFilterBuilderComponent:
if v is None:
continue
if isinstance(model_attr_type, sqltypes.String):
sanitized_values[i] = v.lower()
if self.relationship is RelationalKeyword.LIKE or self.relationship is RelationalKeyword.NOT_LIKE:
if not isinstance(model_attr_type, sqltypes.String):
raise ValueError(
@@ -336,6 +339,9 @@ class QueryFilterBuilder:
def _get_filter_element(
component: QueryFilterBuilderComponent, model, model_attr, model_attr_type
) -> sa.ColumnElement:
if isinstance(model_attr_type, sqltypes.String):
model_attr = sa.func.lower(model_attr)
# Keywords
if component.relationship is RelationalKeyword.IS:
element = model_attr.is_(component.validate(model_attr_type))
@@ -351,9 +357,9 @@ class QueryFilterBuilder:
for v in component.validate(model_attr_type):
element = sa.and_(element, primary_model_attr.any(model_attr == v))
elif component.relationship is RelationalKeyword.LIKE:
element = model_attr.like(component.validate(model_attr_type))
element = model_attr.ilike(component.validate(model_attr_type))
elif component.relationship is RelationalKeyword.NOT_LIKE:
element = model_attr.not_like(component.validate(model_attr_type))
element = model_attr.not_ilike(component.validate(model_attr_type))
# Operators
elif component.relationship is RelationalOperator.EQ: