@@ -124,11 +124,13 @@ def extra_where(self, compiler, connection): # noqa: ARG001
124
124
125
125
126
126
def join (self , compiler , connection , pushed_expressions = None ):
127
+ parent_template = "parent__field__"
128
+
127
129
def _get_reroot_replacements (expressions ):
128
130
if not expressions :
129
131
return None
130
132
columns = []
131
- for expr in expressions :
133
+ for expr in expressions . leaves () :
132
134
# Determine whether the column needs to be transformed or rerouted
133
135
# as part of the subquery.
134
136
for hand_side in ["lhs" , "rhs" ]:
@@ -162,7 +164,6 @@ def _get_reroot_replacements(expressions):
162
164
lhs_fields = []
163
165
rhs_fields = []
164
166
# Add a join condition for each pair of joining fields.
165
- parent_template = "parent__field__"
166
167
for lhs , rhs in self .join_fields :
167
168
lhs , rhs = connection .ops .prepare_join_on_clause (
168
169
self .parent_alias , lhs , compiler .collection_name , rhs
@@ -174,19 +175,20 @@ def _get_reroot_replacements(expressions):
174
175
# Handle any join conditions besides matching field pairs.
175
176
extra = self .join_field .get_extra_restriction (self .table_alias , self .parent_alias )
176
177
178
+ extra_conditions = []
177
179
if extra :
178
- replacements = _get_reroot_replacements (extra .leaves ())
179
- extra_condition = [extra .replace_expressions (replacements ).as_mql (compiler , connection )]
180
- else :
181
- extra_condition = []
182
- if self .join_type == INNER :
180
+ replacements = _get_reroot_replacements (extra )
181
+ extra_conditions .append (
182
+ extra .replace_expressions (replacements ).as_mql (compiler , connection )
183
+ )
184
+
185
+ if pushed_expressions and self .join_type == INNER :
183
186
rerooted_replacement = _get_reroot_replacements (pushed_expressions )
184
- resolved_pushed_expressions = [
185
- expr .replace_expressions (rerooted_replacement ).as_mql (compiler , connection )
186
- for expr in pushed_expressions
187
- ]
188
- else :
189
- resolved_pushed_expressions = []
187
+ extra_conditions .append (
188
+ pushed_expressions .replace_expressions (rerooted_replacement ).as_mql (
189
+ compiler , connection
190
+ )
191
+ )
190
192
191
193
lookup_pipeline = [
192
194
{
@@ -213,8 +215,7 @@ def _get_reroot_replacements(expressions):
213
215
{"$eq" : [f"$${ parent_template } { i } " , field ]}
214
216
for i , field in enumerate (rhs_fields )
215
217
]
216
- + extra_condition
217
- + resolved_pushed_expressions
218
+ + extra_conditions
218
219
}
219
220
}
220
221
}
0 commit comments