Skip to content

Commit 8662abd

Browse files
committed
test improvement.
1 parent 27defc3 commit 8662abd

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-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: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
3434
"basic.tests.SelectOnSaveTests.test_select_on_save_lying_update",
3535
# Lookup in order_by() not supported:
3636
# argument of type '<database function>' is not iterable
37+
"aggregation.tests.AggregateTestCase.test_aggregation_order_by_not_selected_annotation_values",
3738
"db_functions.comparison.test_coalesce.CoalesceTests.test_ordering",
3839
"db_functions.tests.FunctionTests.test_nested_function_ordering",
3940
"db_functions.text.test_length.LengthTests.test_ordering",
@@ -137,6 +138,13 @@ class DatabaseFeatures(BaseDatabaseFeatures):
137138
# QuerySet.explain() not implemented:
138139
# https://github.com/mongodb-labs/django-mongodb/issues/28
139140
"queries.test_explain.ExplainUnsupportedTests.test_message",
141+
# Variance is not implemented in mongo as an aggregation,
142+
# we should transform it into StdDev * 2.
143+
"aggregation.test_filter_argument.FilteredAggregateTests.test_filtered_numerical_aggregates",
144+
# Sum returns 0 instead of None in mongodb.
145+
"aggregation.test_filter_argument.FilteredAggregateTests.test_plain_annotate",
146+
"aggregation.tests.AggregateTestCase.test_annotation_expressions",
147+
"aggregation.tests.AggregateTestCase.test_reverse_fkey_annotate",
140148
}
141149
# $bitAnd, #bitOr, and $bitXor are new in MongoDB 6.3.
142150
_django_test_expected_failures_bitwise = {
@@ -312,6 +320,7 @@ def django_test_expected_failures(self):
312320
"timezones.tests.NewDatabaseTests.test_query_annotation",
313321
},
314322
"Exists is not supported on MongoDB.": {
323+
"aggregation.test_filter_argument.FilteredAggregateTests.test_filtered_aggregate_ref_multiple_subquery_annotation",
315324
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_exists_none_query",
316325
"delete_regress.tests.DeleteTests.test_self_reference_with_through_m2m_at_second_level",
317326
"expressions.tests.BasicExpressionsTests.test_annotation_with_deeply_nested_outerref",
@@ -355,6 +364,14 @@ def django_test_expected_failures(self):
355364
"queries.tests.Ticket22429Tests.test_ticket_22429",
356365
},
357366
"Subquery is not supported on MongoDB.": {
367+
"aggregation.tests.AggregateAnnotationPruningTests.test_referenced_composed_subquery_requires_wrapping",
368+
"aggregation.tests.AggregateAnnotationPruningTests.test_referenced_subquery_requires_wrapping",
369+
"aggregation.tests.AggregateTestCase.test_aggregation_nested_subquery_outerref",
370+
"aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation",
371+
"aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_multivalued",
372+
"aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_related_field",
373+
"aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_values",
374+
"aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_values_collision",
358375
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_filter_with_subquery",
359376
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_subquery_outerref_transform",
360377
"annotations.tests.NonAggregateAnnotationTestCase.test_empty_queryset_annotation",
@@ -525,6 +542,7 @@ def django_test_expected_failures(self):
525542
"queries.tests.Queries6Tests.test_col_alias_quoted",
526543
},
527544
"Test executes raw SQL.": {
545+
"aggregation.tests.AggregateTestCase.test_coalesced_empty_result_set",
528546
"annotations.tests.NonAggregateAnnotationTestCase.test_raw_sql_with_inherited_field",
529547
"delete_regress.tests.DeleteLockingTest.test_concurrent_delete",
530548
"expressions.tests.BasicExpressionsTests.test_annotate_values_filter",
@@ -615,6 +633,7 @@ def django_test_expected_failures(self):
615633
"model_fields.test_jsonfield.TestQuerying.test_none_key_exclude",
616634
},
617635
"Randomized ordering isn't supported by MongoDB.": {
636+
"aggregation.tests.AggregateTestCase.test_aggregation_random_ordering",
618637
"ordering.tests.OrderingTests.test_random_ordering",
619638
},
620639
# https://github.com/mongodb-labs/django-mongodb/issues/34
@@ -642,6 +661,7 @@ def django_test_expected_failures(self):
642661
"aggregation.tests.AggregateAnnotationPruningTests.test_non_aggregate_annotation_pruned",
643662
"aggregation.tests.AggregateTestCase.test_add_implementation",
644663
"aggregation.tests.AggregateTestCase.test_aggregation_default_using_datetime_from_database",
664+
"aggregation.tests.AggregateTestCase.test_multi_arg_aggregate",
645665
# SQL custom values.
646666
"aggregation.tests.AggregateTestCase.test_aggregation_default_using_date_from_database",
647667
# No sql generate
@@ -653,7 +673,17 @@ def django_test_expected_failures(self):
653673
"aggregation.tests.AggregateAnnotationPruningTests.test_referenced_aggregate_annotation_kept",
654674
# Using a QuerySet in annotate() is not supported on MongoDB
655675
"aggregation.tests.AggregateTestCase.test_group_by_subquery_annotation",
656-
}
676+
# Query set with annotate not supported.
677+
"aggregation.tests.AggregateTestCase.test_group_by_reference_subquery",
678+
"aggregation.tests.AggregateTestCase.test_filter_in_subquery_or_aggregation",
679+
# Exists is not supported in mongodb
680+
"aggregation.tests.AggregateTestCase.test_aggregation_exists_multivalued_outeref",
681+
"aggregation.tests.AggregateTestCase.test_group_by_exists_annotation",
682+
"aggregation.tests.AggregateTestCase.test_exists_none_with_aggregate",
683+
"aggregation.tests.AggregateTestCase.test_exists_extra_where_with_aggregate",
684+
# Queryset dates not supported
685+
"aggregation.tests.AggregateTestCase.test_dates_with_aggregation",
686+
},
657687
}
658688

659689
@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)