Skip to content

Commit 04f6dc7

Browse files
committed
test improvement.
1 parent d94d796 commit 04f6dc7

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

django_mongodb/compiler.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,19 @@ def pre_sql_setup(self, with_col_aliases=False):
7272
# the SELECT clause are already part of the GROUP BY.
7373
if not is_ref:
7474
group_expressions |= set(expr.get_group_by_cols())
75+
76+
for expr, *_ in self.select:
77+
group_expressions |= set(expr.get_group_by_cols())
78+
7579
having_group_by = self.having.get_group_by_cols() if self.having else ()
7680
for expr in having_group_by:
7781
group_expressions.add(expr)
7882
if isinstance(self.query.group_by, tuple | list):
7983
group_expressions |= set(self.query.group_by)
8084

85+
if self.query.group_by is None:
86+
group_expressions = set()
87+
8188
all_strings = "".join(
8289
str(col.as_mql(self, self.connection)) for col in group_expressions
8390
)

django_mongodb/features.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ class DatabaseFeatures(BaseDatabaseFeatures):
3838
"expressions.tests.NegatedExpressionTests.test_filter",
3939
"expressions_case.tests.CaseExpressionTests.test_order_by_conditional_implicit",
4040
# NotSupportedError: order_by() expression not supported.
41+
# Lookup in order_by() not supported:
42+
# argument of type '<database function>' is not iterable
43+
"aggregation.tests.AggregateTestCase.test_aggregation_order_by_not_selected_annotation_values",
4144
"db_functions.comparison.test_coalesce.CoalesceTests.test_ordering",
4245
"db_functions.tests.FunctionTests.test_nested_function_ordering",
4346
"db_functions.text.test_length.LengthTests.test_ordering",
@@ -124,6 +127,13 @@ class DatabaseFeatures(BaseDatabaseFeatures):
124127
"queries.test_explain.ExplainUnsupportedTests.test_message",
125128
# filter() on related model + update() doesn't work.
126129
"queries.tests.Queries5Tests.test_ticket9848",
130+
# Variance is not implemented in mongo as an aggregation,
131+
# we should transform it into StdDev * 2.
132+
"aggregation.test_filter_argument.FilteredAggregateTests.test_filtered_numerical_aggregates",
133+
# Sum returns 0 instead of None in mongodb.
134+
"aggregation.test_filter_argument.FilteredAggregateTests.test_plain_annotate",
135+
"aggregation.tests.AggregateTestCase.test_annotation_expressions",
136+
"aggregation.tests.AggregateTestCase.test_reverse_fkey_annotate",
127137
}
128138
# $bitAnd, #bitOr, and $bitXor are new in MongoDB 6.3.
129139
_django_test_expected_failures_bitwise = {
@@ -299,6 +309,7 @@ def django_test_expected_failures(self):
299309
"timezones.tests.NewDatabaseTests.test_query_annotation",
300310
},
301311
"Exists is not supported on MongoDB.": {
312+
"aggregation.test_filter_argument.FilteredAggregateTests.test_filtered_aggregate_ref_multiple_subquery_annotation",
302313
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_exists_none_query",
303314
"delete_regress.tests.DeleteTests.test_self_reference_with_through_m2m_at_second_level",
304315
"expressions.tests.BasicExpressionsTests.test_annotation_with_deeply_nested_outerref",
@@ -343,6 +354,14 @@ def django_test_expected_failures(self):
343354
"queries.tests.Ticket22429Tests.test_ticket_22429",
344355
},
345356
"Subquery is not supported on MongoDB.": {
357+
"aggregation.tests.AggregateAnnotationPruningTests.test_referenced_composed_subquery_requires_wrapping",
358+
"aggregation.tests.AggregateAnnotationPruningTests.test_referenced_subquery_requires_wrapping",
359+
"aggregation.tests.AggregateTestCase.test_aggregation_nested_subquery_outerref",
360+
"aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation",
361+
"aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_multivalued",
362+
"aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_related_field",
363+
"aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_values",
364+
"aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_values_collision",
346365
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_filter_with_subquery",
347366
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_subquery_outerref_transform",
348367
"annotations.tests.NonAggregateAnnotationTestCase.test_empty_queryset_annotation",
@@ -519,6 +538,7 @@ def django_test_expected_failures(self):
519538
"queries.tests.Queries6Tests.test_col_alias_quoted",
520539
},
521540
"Test executes raw SQL.": {
541+
"aggregation.tests.AggregateTestCase.test_coalesced_empty_result_set",
522542
"annotations.tests.NonAggregateAnnotationTestCase.test_raw_sql_with_inherited_field",
523543
"delete_regress.tests.DeleteLockingTest.test_concurrent_delete",
524544
"expressions.tests.BasicExpressionsTests.test_annotate_values_filter",
@@ -610,6 +630,7 @@ def django_test_expected_failures(self):
610630
"model_fields.test_jsonfield.TestQuerying.test_none_key_exclude",
611631
},
612632
"Randomized ordering isn't supported by MongoDB.": {
633+
"aggregation.tests.AggregateTestCase.test_aggregation_random_ordering",
613634
"ordering.tests.OrderingTests.test_random_ordering",
614635
},
615636
"Queries without a collection aren't supported on MongoDB.": {
@@ -625,6 +646,7 @@ def django_test_expected_failures(self):
625646
"aggregation.tests.AggregateAnnotationPruningTests.test_non_aggregate_annotation_pruned",
626647
"aggregation.tests.AggregateTestCase.test_add_implementation",
627648
"aggregation.tests.AggregateTestCase.test_aggregation_default_using_datetime_from_database",
649+
"aggregation.tests.AggregateTestCase.test_multi_arg_aggregate",
628650
# SQL custom values.
629651
"aggregation.tests.AggregateTestCase.test_aggregation_default_using_date_from_database",
630652
# No sql generate
@@ -636,7 +658,17 @@ def django_test_expected_failures(self):
636658
"aggregation.tests.AggregateAnnotationPruningTests.test_referenced_aggregate_annotation_kept",
637659
# Using a QuerySet in annotate() is not supported on MongoDB
638660
"aggregation.tests.AggregateTestCase.test_group_by_subquery_annotation",
639-
}
661+
# Query set with annotate not supported.
662+
"aggregation.tests.AggregateTestCase.test_group_by_reference_subquery",
663+
"aggregation.tests.AggregateTestCase.test_filter_in_subquery_or_aggregation",
664+
# Exists is not supported in mongodb
665+
"aggregation.tests.AggregateTestCase.test_aggregation_exists_multivalued_outeref",
666+
"aggregation.tests.AggregateTestCase.test_group_by_exists_annotation",
667+
"aggregation.tests.AggregateTestCase.test_exists_none_with_aggregate",
668+
"aggregation.tests.AggregateTestCase.test_exists_extra_where_with_aggregate",
669+
# Queryset dates not supported
670+
"aggregation.tests.AggregateTestCase.test_dates_with_aggregation",
671+
},
640672
}
641673

642674
@cached_property

django_mongodb/functions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ def aggregate(self, compiler, connection, **extra_context): # noqa: ARG001
8686
node = self
8787
lhs_mql = process_lhs(node, compiler, connection)
8888
operator = MONGO_AGGREGATION.get(self.__class__)
89+
if self.__class__ in (StdDev, Variance) and "_SAMP" in self.functions:
90+
operator = operator.replace("Pop", "Samp")
8991
return {f"${operator}": lhs_mql}
9092

9193

0 commit comments

Comments
 (0)