Skip to content

Commit 359b9af

Browse files
committed
Refactor get columns.
1 parent 06273e4 commit 359b9af

File tree

2 files changed

+25
-57
lines changed

2 files changed

+25
-57
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:
@@ -173,9 +158,17 @@ def get_columns(self):
173158
columns = (
174159
self.get_default_columns(select_mask) if self.query.default_cols else self.query.select
175160
)
161+
162+
related_columns = []
163+
if self.query.select_related:
164+
self.get_related_selections(related_columns, select_mask)
165+
if related_columns:
166+
related_columns, _ = zip(*related_columns, strict=True)
167+
176168
annotation_idx = 1
177-
result = []
178-
for column in columns:
169+
170+
def project_field(column):
171+
nonlocal annotation_idx
179172
if hasattr(column, "target"):
180173
# column is a Col.
181174
target = column.target.column
@@ -184,8 +177,13 @@ def get_columns(self):
184177
# name for $proj.
185178
target = f"__annotation{annotation_idx}"
186179
annotation_idx += 1
187-
result.append((target, column))
188-
return tuple(result) + tuple(self.query.annotation_select.items())
180+
return target, column
181+
182+
return (
183+
tuple(map(project_field, columns))
184+
+ tuple(self.query.annotation_select.items())
185+
+ tuple(map(project_field, related_columns))
186+
)
189187

190188
def _get_ordering(self):
191189
"""

django_mongodb/features.py

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -147,20 +147,8 @@ def django_test_expected_failures(self):
147147
"model_fields.test_autofield.SmallAutoFieldTests",
148148
},
149149
"QuerySet.select_related() not supported.": {
150-
"annotations.tests.AliasTests.test_joined_alias_annotation",
151-
"annotations.tests.NonAggregateAnnotationTestCase.test_joined_annotation",
152-
"defer.tests.DeferTests.test_defer_foreign_keys_are_deferred_and_not_traversed",
153-
"defer.tests.DeferTests.test_defer_with_select_related",
154-
"defer.tests.DeferTests.test_only_with_select_related",
155-
"defer.tests.TestDefer2.test_defer_proxy",
156-
"defer_regress.tests.DeferRegressionTest.test_basic",
157150
"defer_regress.tests.DeferRegressionTest.test_common_model_different_mask",
158-
"model_fields.test_booleanfield.BooleanFieldTests.test_select_related",
159-
"model_fields.test_foreignkey.ForeignKeyTests.test_empty_string_fk",
160151
"defer_regress.tests.DeferRegressionTest.test_defer_annotate_select_related",
161-
"defer_regress.tests.DeferRegressionTest.test_defer_with_select_related",
162-
"defer_regress.tests.DeferRegressionTest.test_only_with_select_related",
163-
"defer_regress.tests.DeferRegressionTest.test_proxy_model_defer_with_select_related",
164152
"defer_regress.tests.DeferRegressionTest.test_reverse_one_to_one_relations",
165153
"defer_regress.tests.DeferRegressionTest.test_ticket_23270",
166154
},
@@ -284,23 +272,13 @@ def django_test_expected_failures(self):
284272
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_and_alias_filter_related_in_subquery",
285273
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_filter_with_subquery",
286274
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_reverse_m2m",
287-
"annotations.tests.NonAggregateAnnotationTestCase.test_joined_transformed_annotation",
288275
"annotations.tests.NonAggregateAnnotationTestCase.test_mti_annotations",
289276
"annotations.tests.NonAggregateAnnotationTestCase.test_values_with_pk_annotation",
290277
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_subquery_outerref_transform",
291278
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_with_m2m",
292279
"annotations.tests.NonAggregateAnnotationTestCase.test_chaining_annotation_filter_with_m2m",
293280
"db_functions.comparison.test_least.LeastTests.test_related_field",
294281
"db_functions.comparison.test_greatest.GreatestTests.test_related_field",
295-
"defer.tests.BigChildDeferTests.test_defer_baseclass_when_subclass_has_added_field",
296-
"defer.tests.BigChildDeferTests.test_defer_subclass",
297-
"defer.tests.BigChildDeferTests.test_defer_subclass_both",
298-
"defer.tests.BigChildDeferTests.test_only_baseclass_when_subclass_has_added_field",
299-
"defer.tests.BigChildDeferTests.test_only_subclass",
300-
"defer.tests.DeferTests.test_defer_baseclass_when_subclass_has_no_added_fields",
301-
"defer.tests.DeferTests.test_defer_of_overridden_scalar",
302-
"defer.tests.DeferTests.test_only_baseclass_when_subclass_has_no_added_fields",
303-
"defer.tests.TestDefer2.test_defer_inheritance_pk_chaining",
304282
"defer_regress.tests.DeferRegressionTest.test_ticket_16409",
305283
"expressions_case.tests.CaseExpressionTests.test_annotate_with_aggregation_in_condition",
306284
"expressions_case.tests.CaseExpressionTests.test_annotate_with_aggregation_in_predicate",
@@ -312,9 +290,6 @@ def django_test_expected_failures(self):
312290
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_condition",
313291
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_predicate",
314292
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_value",
315-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_condition",
316-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_predicate",
317-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_value",
318293
"expressions_case.tests.CaseExpressionTests.test_join_promotion",
319294
"expressions_case.tests.CaseExpressionTests.test_join_promotion_multiple_annotations",
320295
"expressions_case.tests.CaseExpressionTests.test_m2m_exclude",
@@ -324,18 +299,13 @@ def django_test_expected_failures(self):
324299
"lookup.tests.LookupTests.test_filter_by_reverse_related_field_transform",
325300
"lookup.tests.LookupTests.test_lookup_collision",
326301
"lookup.tests.LookupTests.test_lookup_rhs",
327-
"lookup.tests.LookupTests.test_isnull_non_boolean_value",
328-
"model_fields.test_manytomanyfield.ManyToManyFieldDBTests.test_value_from_object_instance_with_pk",
329-
"model_fields.test_uuid.TestAsPrimaryKey.test_two_level_foreign_keys",
330302
"timezones.tests.LegacyDatabaseTests.test_query_annotation",
331303
"timezones.tests.NewDatabaseTests.test_query_annotation",
332304
"update.tests.AdvancedTests.test_update_annotated_multi_table_queryset",
333-
"update.tests.AdvancedTests.test_update_fk",
334305
"update.tests.AdvancedTests.test_update_ordered_by_inline_m2m_annotation",
335306
"update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation",
336307
"update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation_desc",
337308
"update.tests.SimpleTest.test_empty_update_with_inheritance",
338-
"update.tests.SimpleTest.test_foreign_key_update_with_id",
339309
"update.tests.SimpleTest.test_nonempty_update_with_inheritance",
340310
},
341311
"Test inspects query for SQL": {

0 commit comments

Comments
 (0)