Skip to content

Commit b68183f

Browse files
committed
Fix aliasing issues.
1 parent 8b13b53 commit b68183f

File tree

2 files changed

+35
-23
lines changed

2 files changed

+35
-23
lines changed

django_mongodb/compiler.py

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -459,12 +459,8 @@ def get_combinator_queries(self):
459459
)
460460
)
461461
compiler_.pre_sql_setup()
462-
# Standardize columns as main query required.
463462
columns = compiler_.get_columns()
464-
if self.query.values_select:
465-
_, exprs = zip(*columns, strict=True)
466-
columns = tuple(zip(main_query_fields, exprs, strict=True))
467-
parts.append((compiler_.build_query(columns), compiler_.collection_name))
463+
parts.append((compiler_.build_query(columns), compiler_, columns))
468464
except EmptyResultSet:
469465
# Omit the empty queryset with UNION.
470466
if self.query.combinator == "union":
@@ -473,24 +469,39 @@ def get_combinator_queries(self):
473469
# Raise EmptyResultSet if all the combinator queries are empty.
474470
if not parts:
475471
raise EmptyResultSet
476-
combinator_pipeline = parts.pop(0)[0].get_pipeline()
477-
for part, collection in parts:
478-
combinator_pipeline.append(
479-
{"$unionWith": {"coll": collection, "pipeline": part.get_pipeline()}}
480-
)
481-
if not self.query.combinator_all:
482-
ids = {}
483-
for alias, expr in main_query_columns:
484-
# Unfold foreign fields.
485-
if isinstance(expr, Col) and expr.alias != self.collection_name:
486-
ids[self._unfold_column(expr)] = expr.as_mql(self, self.connection)
487-
else:
488-
ids[alias] = f"${alias}"
489-
combinator_pipeline.append({"$group": {"_id": ids}})
490-
projected_fields = self._fold_columns(ids)
491-
combinator_pipeline.append({"$addFields": projected_fields})
492-
if "_id" not in projected_fields:
493-
combinator_pipeline.append({"$unset": "_id"})
472+
combinator_pipeline = []
473+
for part, compiler_, columns in parts:
474+
inner_pipeline = part.get_pipeline()
475+
# Standardize result fields.
476+
fields = {}
477+
# When a .count() is called, the main_query_field has length 1
478+
# otherwise it has the same length as columns.
479+
for alias, (ref, expr) in zip(main_query_fields, columns, strict=False):
480+
if isinstance(expr, Col) and expr.alias != compiler_.collection_name:
481+
fields[expr.alias] = 1
482+
else:
483+
fields[alias] = f"${ref}" if alias != ref else 1
484+
inner_pipeline.append({"$project": fields})
485+
# Combine query with the current combinator pipeline.
486+
if combinator_pipeline:
487+
combinator_pipeline.append(
488+
{"$unionWith": {"coll": compiler_.collection_name, "pipeline": inner_pipeline}}
489+
)
490+
else:
491+
combinator_pipeline = inner_pipeline
492+
if not self.query.combinator_all:
493+
ids = {}
494+
for alias, expr in main_query_columns:
495+
# Unfold foreign fields.
496+
if isinstance(expr, Col) and expr.alias != self.collection_name:
497+
ids[self._unfold_column(expr)] = expr.as_mql(self, self.connection)
498+
else:
499+
ids[alias] = f"${alias}"
500+
combinator_pipeline.append({"$group": {"_id": ids}})
501+
projected_fields = self._fold_columns(ids)
502+
combinator_pipeline.append({"$addFields": projected_fields})
503+
if "_id" not in projected_fields:
504+
combinator_pipeline.append({"$unset": "_id"})
494505
return combinator_pipeline
495506

496507
def get_lookup_pipeline(self):

django_mongodb/features.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ def django_test_expected_failures(self):
254254
"Test assumes integer primary key.": {
255255
"db_functions.comparison.test_cast.CastTests.test_cast_to_integer_foreign_key",
256256
"model_fields.test_foreignkey.ForeignKeyTests.test_to_python",
257+
"queries.test_qs_combinators.QuerySetSetOperationTests.test_order_raises_on_non_selected_column",
257258
},
258259
"Exists is not supported on MongoDB.": {
259260
"aggregation.test_filter_argument.FilteredAggregateTests.test_filtered_aggregate_on_exists",

0 commit comments

Comments
 (0)