add sql filter "contains"

This commit is contained in:
Alexander Kalinovsky
2025-02-05 23:35:02 +01:00
parent e24f9e0f79
commit 329c1361a2
6 changed files with 42 additions and 31 deletions

View File

@@ -11,12 +11,13 @@ from typing import (
TYPE_CHECKING,
)
from pydantic import BaseModel
from sqlmodel import SQLModel, BigInteger, Field, select, func, column
from sqlmodel import SQLModel, BigInteger, Field, select, func, column, col
from sqlmodel.ext.asyncio.session import AsyncSession
from sqlmodel.sql.expression import SelectOfScalar
from sqlmodel.main import SQLModelMetaclass, RelationshipInfo
from .descriptors import EntityDescriptor, EntityField, FieldDescriptor, Filter
from .entity_metadata import EntityMetadata
from . import session_dep
@@ -233,30 +234,33 @@ class BotEntity[CreateSchemaType: BaseModel, UpdateSchemaType: BaseModel](
cls, select_statement: SelectOfScalar[Self], static_filter: list[Filter]
):
for sfilt in static_filter:
column = col(getattr(cls, sfilt.field_name))
if sfilt.operator == "==":
condition = column(sfilt.field_name).__eq__(sfilt.value)
condition = column.__eq__(sfilt.value)
elif sfilt.operator == "!=":
condition = column(sfilt.field_name).__ne__(sfilt.value)
condition = column.__ne__(sfilt.value)
elif sfilt.operator == "<":
condition = column(sfilt.field_name).__lt__(sfilt.value)
condition = column.__lt__(sfilt.value)
elif sfilt.operator == "<=":
condition = column(sfilt.field_name).__le__(sfilt.value)
condition = column.__le__(sfilt.value)
elif sfilt.operator == ">":
condition = column(sfilt.field_name).__gt__(sfilt.value)
condition = column.__gt__(sfilt.value)
elif sfilt.operator == ">=":
condition = column(sfilt.field_name).__ge__(sfilt.value)
condition = column.__ge__(sfilt.value)
elif sfilt.operator == "ilike":
condition = column(sfilt.field_name).ilike(f"%{sfilt.value}%")
condition = column.ilike(f"%{sfilt.value}%")
elif sfilt.operator == "like":
condition = column(sfilt.field_name).like(f"%{sfilt.value}%")
condition = column.like(f"%{sfilt.value}%")
elif sfilt.operator == "in":
condition = column(sfilt.field_name).in_(sfilt.value)
condition = column.in_(sfilt.value)
elif sfilt.operator == "not in":
condition = column(sfilt.field_name).notin_(sfilt.value)
elif sfilt.operator == "is":
condition = column(sfilt.field_name).is_(None)
elif sfilt.operator == "is not":
condition = column(sfilt.field_name).isnot(None)
condition = column.notin_(sfilt.value)
elif sfilt.operator == "is none":
condition = column.is_(None)
elif sfilt.operator == "is not none":
condition = column.isnot(None)
elif sfilt.operator == "contains":
condition = sfilt.value == column.any_()
else:
condition = None
if condition is not None: