22
33from forestadmin .agent_toolkit .utils .context import User
44from forestadmin .datasource_toolkit .decorators .collection_decorator import CollectionDecorator
5- from forestadmin .datasource_toolkit .interfaces .fields import is_many_to_one
5+ from forestadmin .datasource_toolkit .interfaces .fields import ManyToOne , is_many_to_one
6+ from forestadmin .datasource_toolkit .interfaces .query .condition_tree .nodes .leaf import ConditionTreeLeaf
67from forestadmin .datasource_toolkit .interfaces .query .filter .paginated import PaginatedFilter
78from forestadmin .datasource_toolkit .interfaces .query .filter .unpaginated import Filter
89from forestadmin .datasource_toolkit .interfaces .query .projections import Projection
1112
1213class LazyJoinCollectionDecorator (CollectionDecorator ):
1314 async def list (self , caller : User , filter_ : PaginatedFilter , projection : Projection ) -> List [RecordsDataAlias ]:
14- refined_filter = cast (PaginatedFilter , await self ._refine_filter (caller , filter_ ))
1515 simplified_projection = self ._get_projection_without_useless_joins (projection )
1616
17+ refined_filter = cast (PaginatedFilter , await self ._refine_filter (caller , filter_ ))
1718 ret = await self .child_collection .list (caller , refined_filter , simplified_projection )
1819
1920 return self ._apply_joins_on_records (projection , simplified_projection , ret )
@@ -26,14 +27,14 @@ async def _refine_filter(
2627
2728 _filter .condition_tree = _filter .condition_tree .replace (
2829 lambda leaf : (
29- {
30- "field" : self ._get_fk_field_for_projection (leaf .field ),
31- "operator" : leaf .operator ,
32- "value" : leaf .value ,
33- }
30+ ConditionTreeLeaf (
31+ self ._get_fk_field_for_projection (leaf .field ),
32+ leaf .operator ,
33+ leaf .value ,
34+ )
3435 if self ._is_useless_join (leaf .field .split (":" )[0 ], _filter .condition_tree .projection )
3536 else leaf
36- ) # type:ignore
37+ )
3738 )
3839
3940 return _filter
@@ -50,10 +51,9 @@ def _is_useless_join(self, relation: str, projection: Projection) -> bool:
5051
5152 def _get_fk_field_for_projection (self , projection : str ) -> str :
5253 relation_name = projection .split (":" )[0 ]
53- relation_schema = self .schema ["fields" ][relation_name ]
54+ relation_schema = cast ( ManyToOne , self .schema ["fields" ][relation_name ])
5455
55- # assert is_many_to_one(relation_schema)
56- return relation_schema ["foreign_key" ] # type:ignore
56+ return relation_schema ["foreign_key" ]
5757
5858 def _get_projection_without_useless_joins (self , projection : Projection ) -> Projection :
5959 returned_projection = Projection (* projection )
0 commit comments