Skip to content

Commit a693ce9

Browse files
committed
Refactor get columns.
1 parent 317b637 commit a693ce9

File tree

2 files changed

+25
-60
lines changed

2 files changed

+25
-60
lines changed

django_mongodb/compiler.py

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -44,33 +44,16 @@ def results_iter(
4444
"""
4545
columns = self.get_columns()
4646

47-
related_columns = []
4847
if results is None:
4948
# QuerySet.values() or values_list()
5049
try:
5150
results = self.build_query(columns).fetch()
5251
except EmptyResultSet:
5352
results = []
54-
else:
55-
index = len(columns)
56-
while index < self.col_count:
57-
foreign_columns = []
58-
foreign_relation = self.select[index][0].alias
59-
while index < self.col_count and foreign_relation == self.select[index][0].alias:
60-
foreign_columns.append(self.select[index][0])
61-
index += 1
62-
related_columns.append(
63-
(
64-
foreign_relation,
65-
[(column.target.column, column) for column in foreign_columns],
66-
)
67-
)
6853

6954
converters = self.get_converters(columns)
7055
for entity in results:
71-
yield self._make_result(
72-
entity, columns, related_columns, converters, tuple_expected=tuple_expected
73-
)
56+
yield self._make_result(entity, columns, converters, tuple_expected=tuple_expected)
7457

7558
def has_results(self):
7659
return bool(self.get_count(check_exists=True))
@@ -89,17 +72,14 @@ def get_converters(self, expressions):
8972
converters[name] = backend_converters + field_converters
9073
return converters
9174

92-
def _make_result(self, entity, columns, related_columns, converters, tuple_expected=False):
75+
def _make_result(self, entity, columns, converters, tuple_expected=False):
9376
"""
9477
Decode values for the given fields from the database entity.
9578
9679
The entity is assumed to be a dict using field database column
9780
names as keys.
9881
"""
9982
result = self._apply_converters(entity, columns, converters)
100-
# Related columns.
101-
for relation, columns in related_columns:
102-
result += self._apply_converters(entity[relation], columns, converters)
10383
if tuple_expected:
10484
result = tuple(result)
10585
return result
@@ -108,7 +88,12 @@ def _apply_converters(self, entity, columns, converters):
10888
result = []
10989
for name, col in columns:
11090
field = col.field
111-
value = entity.get(name, NOT_PROVIDED)
91+
obj = (
92+
entity.get(col.alias, {})
93+
if hasattr(col, "alias") and col.alias != self.collection_name
94+
else entity
95+
)
96+
value = obj.get(name, NOT_PROVIDED)
11297
if value is NOT_PROVIDED:
11398
value = field.get_default()
11499
elif converters:
@@ -183,9 +168,17 @@ def get_columns(self):
183168
columns = (
184169
self.get_default_columns(select_mask) if self.query.default_cols else self.query.select
185170
)
171+
172+
related_columns = []
173+
if self.query.select_related:
174+
self.get_related_selections(related_columns, select_mask)
175+
if related_columns:
176+
related_columns, _ = zip(*related_columns, strict=True)
177+
186178
annotation_idx = 1
187-
result = []
188-
for column in columns:
179+
180+
def project_field(column):
181+
nonlocal annotation_idx
189182
if hasattr(column, "target"):
190183
# column is a Col.
191184
target = column.target.column
@@ -194,8 +187,13 @@ def get_columns(self):
194187
# name for $proj.
195188
target = f"__annotation{annotation_idx}"
196189
annotation_idx += 1
197-
result.append((target, column))
198-
return tuple(result) + tuple(self.query.annotation_select.items())
190+
return target, column
191+
192+
return (
193+
tuple(map(project_field, columns))
194+
+ tuple(self.query.annotation_select.items())
195+
+ tuple(map(project_field, related_columns))
196+
)
199197

200198
def _get_ordering(self):
201199
"""

django_mongodb/features.py

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -151,23 +151,9 @@ def django_test_expected_failures(self):
151151
"model_fields.test_autofield.SmallAutoFieldTests",
152152
},
153153
"QuerySet.select_related() not supported.": {
154-
"annotations.tests.AliasTests.test_joined_alias_annotation",
155-
"annotations.tests.NonAggregateAnnotationTestCase.test_joined_annotation",
156-
"defer.tests.DeferTests.test_defer_foreign_keys_are_deferred_and_not_traversed",
157-
"defer.tests.DeferTests.test_defer_with_select_related",
158-
"defer.tests.DeferTests.test_only_with_select_related",
159-
"defer.tests.TestDefer2.test_defer_proxy",
160-
"defer_regress.tests.DeferRegressionTest.test_basic",
161154
"defer_regress.tests.DeferRegressionTest.test_common_model_different_mask",
162-
"model_fields.test_booleanfield.BooleanFieldTests.test_select_related",
163-
"model_fields.test_foreignkey.ForeignKeyTests.test_empty_string_fk",
164155
"defer_regress.tests.DeferRegressionTest.test_defer_annotate_select_related",
165-
"defer_regress.tests.DeferRegressionTest.test_defer_with_select_related",
166-
"defer_regress.tests.DeferRegressionTest.test_only_with_select_related",
167-
"defer_regress.tests.DeferRegressionTest.test_proxy_model_defer_with_select_related",
168156
"defer_regress.tests.DeferRegressionTest.test_reverse_one_to_one_relations",
169-
"defer_regress.tests.DeferRegressionTest.test_ticket_23270",
170-
"ordering.tests.OrderingTests.test_ordering_select_related_collision",
171157
},
172158
"MongoDB does not enforce UNIQUE constraints.": {
173159
"auth_tests.test_basic.BasicTestCase.test_unicode_username",
@@ -305,23 +291,13 @@ def django_test_expected_failures(self):
305291
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_and_alias_filter_related_in_subquery",
306292
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_filter_with_subquery",
307293
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_reverse_m2m",
308-
"annotations.tests.NonAggregateAnnotationTestCase.test_joined_transformed_annotation",
309294
"annotations.tests.NonAggregateAnnotationTestCase.test_mti_annotations",
310295
"annotations.tests.NonAggregateAnnotationTestCase.test_values_with_pk_annotation",
311296
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_subquery_outerref_transform",
312297
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_with_m2m",
313298
"annotations.tests.NonAggregateAnnotationTestCase.test_chaining_annotation_filter_with_m2m",
314299
"db_functions.comparison.test_least.LeastTests.test_related_field",
315300
"db_functions.comparison.test_greatest.GreatestTests.test_related_field",
316-
"defer.tests.BigChildDeferTests.test_defer_baseclass_when_subclass_has_added_field",
317-
"defer.tests.BigChildDeferTests.test_defer_subclass",
318-
"defer.tests.BigChildDeferTests.test_defer_subclass_both",
319-
"defer.tests.BigChildDeferTests.test_only_baseclass_when_subclass_has_added_field",
320-
"defer.tests.BigChildDeferTests.test_only_subclass",
321-
"defer.tests.DeferTests.test_defer_baseclass_when_subclass_has_no_added_fields",
322-
"defer.tests.DeferTests.test_defer_of_overridden_scalar",
323-
"defer.tests.DeferTests.test_only_baseclass_when_subclass_has_no_added_fields",
324-
"defer.tests.TestDefer2.test_defer_inheritance_pk_chaining",
325301
"defer_regress.tests.DeferRegressionTest.test_ticket_16409",
326302
"expressions_case.tests.CaseExpressionTests.test_annotate_with_aggregation_in_condition",
327303
"expressions_case.tests.CaseExpressionTests.test_annotate_with_aggregation_in_predicate",
@@ -333,9 +309,6 @@ def django_test_expected_failures(self):
333309
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_condition",
334310
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_predicate",
335311
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_value",
336-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_condition",
337-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_predicate",
338-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_value",
339312
"expressions_case.tests.CaseExpressionTests.test_join_promotion",
340313
"expressions_case.tests.CaseExpressionTests.test_join_promotion_multiple_annotations",
341314
"expressions_case.tests.CaseExpressionTests.test_m2m_exclude",
@@ -345,10 +318,7 @@ def django_test_expected_failures(self):
345318
"lookup.tests.LookupTests.test_filter_by_reverse_related_field_transform",
346319
"lookup.tests.LookupTests.test_lookup_collision",
347320
"lookup.tests.LookupTests.test_lookup_rhs",
348-
"lookup.tests.LookupTests.test_isnull_non_boolean_value",
349321
"model_fields.test_jsonfield.TestQuerying.test_join_key_transform_annotation_expression",
350-
"model_fields.test_manytomanyfield.ManyToManyFieldDBTests.test_value_from_object_instance_with_pk",
351-
"model_fields.test_uuid.TestAsPrimaryKey.test_two_level_foreign_keys",
352322
"ordering.tests.OrderingTests.test_default_ordering",
353323
"ordering.tests.OrderingTests.test_order_by_expr_query_reuse",
354324
"ordering.tests.OrderingTests.test_order_by_fk_attname",
@@ -359,18 +329,15 @@ def django_test_expected_failures(self):
359329
"ordering.tests.OrderingTests.test_order_by_ptr_field_with_default_ordering_by_expression",
360330
"ordering.tests.OrderingTests.test_order_by_self_referential_fk",
361331
"ordering.tests.OrderingTests.test_orders_nulls_first_on_filtered_subquery",
362-
"ordering.tests.OrderingTests.test_related_ordering_duplicate_table_reference",
363332
"ordering.tests.OrderingTests.test_reverse_meta_ordering_pure",
364333
"ordering.tests.OrderingTests.test_reversed_ordering",
365334
"timezones.tests.LegacyDatabaseTests.test_query_annotation",
366335
"timezones.tests.NewDatabaseTests.test_query_annotation",
367336
"update.tests.AdvancedTests.test_update_annotated_multi_table_queryset",
368-
"update.tests.AdvancedTests.test_update_fk",
369337
"update.tests.AdvancedTests.test_update_ordered_by_inline_m2m_annotation",
370338
"update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation",
371339
"update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation_desc",
372340
"update.tests.SimpleTest.test_empty_update_with_inheritance",
373-
"update.tests.SimpleTest.test_foreign_key_update_with_id",
374341
"update.tests.SimpleTest.test_nonempty_update_with_inheritance",
375342
},
376343
"Test inspects query for SQL": {

0 commit comments

Comments
 (0)