@@ -75,130 +75,63 @@ async def load_fn(keys: List[Tuple]) -> List[Any]:
75
75
)
76
76
else :
77
77
# Use another query when relationship uses a secondary table
78
- # *[remote[1] for remote in relationship.local_remote_pairs or []]
79
78
self_model = relationship .parent .entity
80
79
81
80
self_model_key_label = relationship .local_remote_pairs [0 ][1 ].key
82
81
related_model_key_label = relationship .local_remote_pairs [1 ][1 ].key
83
82
84
83
self_model_key = relationship .local_remote_pairs [0 ][0 ].key
85
- # breakpoint()
86
- # Gets the
84
+
87
85
remote_to_use = relationship .local_remote_pairs [0 ][1 ]
88
86
query_keys = tuple ([item [0 ] for item in keys ])
89
- breakpoint ()
87
+
90
88
query = (
91
- # select(related_model)
92
89
select (
93
90
label (self_model_key_label , getattr (
94
91
self_model , self_model_key )),
95
92
related_model
96
93
)
97
- # .join(
98
- # related_model,
99
- # getattr(relationship.secondary.c, related_model_key_label) == getattr(
100
- # related_model, related_model_key)
101
- # )
102
- # .join(
103
- # relationship.secondary,
104
- # getattr(relationship.secondary.c, self_model_key_label) == getattr(
105
- # self_model, self_model_key)
106
- # )
107
- # .join(
108
- # relationship.secondary,
109
- # getattr(relationship.secondary.c, self_model_key_label) == getattr(
110
- # self_model, self_model_key)
111
- # )
112
94
.join (
113
- relationship .secondary , # Join the secondary table
114
- getattr (relationship .secondary .c , related_model_key_label ) == related_model .id # Match department_id
95
+ relationship .secondary ,
96
+ getattr (relationship .secondary .c ,
97
+ related_model_key_label ) == related_model .id
115
98
)
116
99
.join (
117
- self_model , # Join the Employee table
118
- getattr (relationship .secondary .c , self_model_key_label ) == self_model .id # Match employee_id
100
+ self_model ,
101
+ getattr (relationship .secondary .c ,
102
+ self_model_key_label ) == self_model .id
119
103
)
120
104
.filter (
121
105
remote_to_use .in_ (query_keys )
122
106
)
123
107
)
124
- # query = (
125
- # # select(related_model)
126
- # select(
127
- # related_model,
128
- # label(self_model_key_label, getattr(self_model, self_model_key))
129
- # )
130
- # .join(relationship.secondary, relationship.secondaryjoin)
131
- # .filter(
132
- # remote_to_use.in_(query_keys)
133
- # )
134
- # )
135
-
136
- # query = (
137
- # select(related_model)
138
- # .join(relationship.secondary, relationship.secondaryjoin)
139
- # .filter(
140
- # # emote_to_use.in_(keys)
141
- # tuple_(
142
- # *[remote[1] for remote in relationship.local_remote_pairs or []]
143
- # ).in_(keys)
144
- # )
145
- # )
146
108
147
109
if relationship .order_by :
148
110
query = query .order_by (* relationship .order_by )
149
111
150
112
if relationship .secondary is not None :
151
- # We need get the self_model values too, so we need to remove the slqalchemy optimization that returns only the related_model values, this is needed because we use the keys var to match the related_model and the self_model
113
+ # We need to retrieve values from both the self_model and related_model. To achieve this, we must disable the default SQLAlchemy optimization that returns only related_model values. This is necessary because we use the keys variable to match both related_model and self_model.
152
114
rows = await self ._scalars_all (query , disabled_optimization_to_secondary_tables = True )
153
115
else :
154
116
rows = await self ._scalars_all (query )
155
117
156
118
def group_by_remote_key (row : Any ) -> Tuple :
157
- if relationship .secondary is None :
158
- return tuple (
159
- [
160
- getattr (row , remote .key )
161
- for _ , remote in relationship .local_remote_pairs or []
162
- if remote .key
163
- ]
164
- )
165
- else :
166
- # Use another query when relationship uses a secondary table
167
- # breakpoint()
168
- related_model_table = relationship .entity .entity .__table__
169
- # breakpoint()
170
- # return tuple(
171
- # [
172
- # getattr(row, remote[0].key)
173
- # for remote in relationship.local_remote_pairs or []
174
- # if remote[0].key is not None and remote[0].table == related_model_table
175
- # ]
176
- # )
177
- result = []
178
- for remote in relationship .local_remote_pairs or []:
179
- if remote [0 ].key is not None and relationship .local_remote_pairs [1 ][0 ].table == related_model_table :
180
- result .extend (
181
- [
182
-
183
- getattr (row , remote [0 ].key )
184
-
185
- ]
186
- )
187
- breakpoint ()
188
- return tuple (
189
- [
190
- getattr (row , remote [0 ].key )
191
- for remote in relationship .local_remote_pairs or []
192
- if remote [0 ].key is not None and relationship .local_remote_pairs [1 ][0 ].table == related_model_table
193
- ]
194
- )
119
+ return tuple (
120
+ [
121
+ getattr (row , remote .key )
122
+ for _ , remote in relationship .local_remote_pairs or []
123
+ if remote .key
124
+ ]
125
+ )
195
126
196
127
grouped_keys : Mapping [Tuple , List [Any ]] = defaultdict (list )
197
- breakpoint ()
198
- for row in rows :
199
- grouped_keys [group_by_remote_key (row )].append (row )
200
-
201
- breakpoint ()
128
+ if relationship .secondary is None :
129
+ for row in rows :
130
+ grouped_keys [group_by_remote_key (row )].append (row )
131
+ else :
132
+ for row in rows :
133
+ grouped_keys [(row [0 ],)].append (row [1 ])
134
+
202
135
if relationship .uselist :
203
136
return [grouped_keys [key ] for key in keys ]
204
137
else :
0 commit comments