@@ -124,11 +124,13 @@ def extra_where(self, compiler, connection): # noqa: ARG001
124124
125125
126126def join (self , compiler , connection , pushed_expressions = None ):
127+ parent_template = "parent__field__"
128+
127129 def _get_reroot_replacements (expressions ):
128130 if not expressions :
129131 return None
130132 columns = []
131- for expr in expressions :
133+ for expr in expressions . leaves () :
132134 # Determine whether the column needs to be transformed or rerouted
133135 # as part of the subquery.
134136 for hand_side in ["lhs" , "rhs" ]:
@@ -162,7 +164,6 @@ def _get_reroot_replacements(expressions):
162164 lhs_fields = []
163165 rhs_fields = []
164166 # Add a join condition for each pair of joining fields.
165- parent_template = "parent__field__"
166167 for lhs , rhs in self .join_fields :
167168 lhs , rhs = connection .ops .prepare_join_on_clause (
168169 self .parent_alias , lhs , compiler .collection_name , rhs
@@ -174,19 +175,20 @@ def _get_reroot_replacements(expressions):
174175 # Handle any join conditions besides matching field pairs.
175176 extra = self .join_field .get_extra_restriction (self .table_alias , self .parent_alias )
176177
178+ extra_conditions = []
177179 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 :
183186 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+ )
190192
191193 lookup_pipeline = [
192194 {
@@ -213,8 +215,7 @@ def _get_reroot_replacements(expressions):
213215 {"$eq" : [f"$${ parent_template } { i } " , field ]}
214216 for i , field in enumerate (rhs_fields )
215217 ]
216- + extra_condition
217- + resolved_pushed_expressions
218+ + extra_conditions
218219 }
219220 }
220221 }
0 commit comments