Skip to content

Commit dda7baa

Browse files
committed
create JSONB Contains Filter SQL
TODO: tests coverage
1 parent e18e96a commit dda7baa

File tree

1 file changed

+34
-6
lines changed

1 file changed

+34
-6
lines changed
+34-6
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,32 @@
1-
from typing import cast
1+
from typing import (
2+
TYPE_CHECKING,
3+
cast,
4+
)
25

3-
from sqlalchemy import func
6+
from sqlalchemy import (
7+
BinaryExpression,
8+
BooleanClauseList,
9+
func,
10+
)
411
from sqlalchemy.orm import InstrumentedAttribute
5-
from sqlalchemy import BinaryExpression
612

713
from fastapi_jsonapi.types_metadata import CustomFilterSQL
8-
from pydantic.fields import FieldInfo
914

15+
if TYPE_CHECKING:
16+
from pydantic.fields import FieldInfo
1017

11-
class LowerEqualsFilterSQL(CustomFilterSQL[InstrumentedAttribute, BinaryExpression]):
18+
19+
SQLAExpressionType = BinaryExpression | BooleanClauseList
20+
21+
22+
class CustomFilterSQLA(CustomFilterSQL[InstrumentedAttribute, SQLAExpressionType]):
23+
"""Base class for custom SQLAlchemy filters"""
24+
25+
26+
class LowerEqualsFilterSQL(CustomFilterSQLA):
1227
def get_expression(
1328
self,
14-
schema_field: FieldInfo,
29+
schema_field: "FieldInfo",
1530
model_column: InstrumentedAttribute,
1631
value: str,
1732
operator: str,
@@ -22,4 +37,17 @@ def get_expression(
2237
)
2338

2439

40+
# TODO: tests coverage
41+
class JSONBContainsFilterSQL(CustomFilterSQLA):
42+
def get_expression(
43+
self,
44+
schema_field: "FieldInfo",
45+
model_column: InstrumentedAttribute,
46+
value: str,
47+
operator: str,
48+
) -> BinaryExpression:
49+
return model_column.op("@>")(value)
50+
51+
2552
sql_filter_lower_equals = LowerEqualsFilterSQL(op="lower_equals")
53+
sql_filter_jsonb_contains = JSONBContainsFilterSQL(op="jsonb_contains")

0 commit comments

Comments
 (0)