Skip to content

Commit eb70e8b

Browse files
committed
Refactor get columns.
1 parent c4a1234 commit eb70e8b

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:
@@ -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 & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -153,23 +153,9 @@ def django_test_expected_failures(self):
153153
"model_fields.test_autofield.SmallAutoFieldTests",
154154
},
155155
"QuerySet.select_related() not supported.": {
156-
"annotations.tests.AliasTests.test_joined_alias_annotation",
157-
"annotations.tests.NonAggregateAnnotationTestCase.test_joined_annotation",
158-
"defer.tests.DeferTests.test_defer_foreign_keys_are_deferred_and_not_traversed",
159-
"defer.tests.DeferTests.test_defer_with_select_related",
160-
"defer.tests.DeferTests.test_only_with_select_related",
161-
"defer.tests.TestDefer2.test_defer_proxy",
162-
"defer_regress.tests.DeferRegressionTest.test_basic",
163156
"defer_regress.tests.DeferRegressionTest.test_common_model_different_mask",
164-
"model_fields.test_booleanfield.BooleanFieldTests.test_select_related",
165-
"model_fields.test_foreignkey.ForeignKeyTests.test_empty_string_fk",
166157
"defer_regress.tests.DeferRegressionTest.test_defer_annotate_select_related",
167-
"defer_regress.tests.DeferRegressionTest.test_defer_with_select_related",
168-
"defer_regress.tests.DeferRegressionTest.test_only_with_select_related",
169-
"defer_regress.tests.DeferRegressionTest.test_proxy_model_defer_with_select_related",
170158
"defer_regress.tests.DeferRegressionTest.test_reverse_one_to_one_relations",
171-
"defer_regress.tests.DeferRegressionTest.test_ticket_23270",
172-
"ordering.tests.OrderingTests.test_ordering_select_related_collision",
173159
},
174160
"MongoDB does not enforce UNIQUE constraints.": {
175161
"auth_tests.test_basic.BasicTestCase.test_unicode_username",
@@ -307,23 +293,13 @@ def django_test_expected_failures(self):
307293
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_and_alias_filter_related_in_subquery",
308294
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_filter_with_subquery",
309295
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_reverse_m2m",
310-
"annotations.tests.NonAggregateAnnotationTestCase.test_joined_transformed_annotation",
311296
"annotations.tests.NonAggregateAnnotationTestCase.test_mti_annotations",
312297
"annotations.tests.NonAggregateAnnotationTestCase.test_values_with_pk_annotation",
313298
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_subquery_outerref_transform",
314299
"annotations.tests.NonAggregateAnnotationTestCase.test_annotation_with_m2m",
315300
"annotations.tests.NonAggregateAnnotationTestCase.test_chaining_annotation_filter_with_m2m",
316301
"db_functions.comparison.test_least.LeastTests.test_related_field",
317302
"db_functions.comparison.test_greatest.GreatestTests.test_related_field",
318-
"defer.tests.BigChildDeferTests.test_defer_baseclass_when_subclass_has_added_field",
319-
"defer.tests.BigChildDeferTests.test_defer_subclass",
320-
"defer.tests.BigChildDeferTests.test_defer_subclass_both",
321-
"defer.tests.BigChildDeferTests.test_only_baseclass_when_subclass_has_added_field",
322-
"defer.tests.BigChildDeferTests.test_only_subclass",
323-
"defer.tests.DeferTests.test_defer_baseclass_when_subclass_has_no_added_fields",
324-
"defer.tests.DeferTests.test_defer_of_overridden_scalar",
325-
"defer.tests.DeferTests.test_only_baseclass_when_subclass_has_no_added_fields",
326-
"defer.tests.TestDefer2.test_defer_inheritance_pk_chaining",
327303
"defer_regress.tests.DeferRegressionTest.test_ticket_16409",
328304
"expressions_case.tests.CaseExpressionTests.test_annotate_with_aggregation_in_condition",
329305
"expressions_case.tests.CaseExpressionTests.test_annotate_with_aggregation_in_predicate",
@@ -335,9 +311,6 @@ def django_test_expected_failures(self):
335311
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_condition",
336312
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_predicate",
337313
"expressions_case.tests.CaseExpressionTests.test_filter_with_aggregation_in_value",
338-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_condition",
339-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_predicate",
340-
"expressions_case.tests.CaseExpressionTests.test_filter_with_join_in_value",
341314
"expressions_case.tests.CaseExpressionTests.test_join_promotion",
342315
"expressions_case.tests.CaseExpressionTests.test_join_promotion_multiple_annotations",
343316
"expressions_case.tests.CaseExpressionTests.test_m2m_exclude",
@@ -347,10 +320,7 @@ def django_test_expected_failures(self):
347320
"lookup.tests.LookupTests.test_filter_by_reverse_related_field_transform",
348321
"lookup.tests.LookupTests.test_lookup_collision",
349322
"lookup.tests.LookupTests.test_lookup_rhs",
350-
"lookup.tests.LookupTests.test_isnull_non_boolean_value",
351323
"model_fields.test_jsonfield.TestQuerying.test_join_key_transform_annotation_expression",
352-
"model_fields.test_manytomanyfield.ManyToManyFieldDBTests.test_value_from_object_instance_with_pk",
353-
"model_fields.test_uuid.TestAsPrimaryKey.test_two_level_foreign_keys",
354324
"ordering.tests.OrderingTests.test_default_ordering",
355325
"ordering.tests.OrderingTests.test_order_by_expr_query_reuse",
356326
"ordering.tests.OrderingTests.test_order_by_fk_attname",
@@ -361,18 +331,15 @@ def django_test_expected_failures(self):
361331
"ordering.tests.OrderingTests.test_order_by_ptr_field_with_default_ordering_by_expression",
362332
"ordering.tests.OrderingTests.test_order_by_self_referential_fk",
363333
"ordering.tests.OrderingTests.test_orders_nulls_first_on_filtered_subquery",
364-
"ordering.tests.OrderingTests.test_related_ordering_duplicate_table_reference",
365334
"ordering.tests.OrderingTests.test_reverse_meta_ordering_pure",
366335
"ordering.tests.OrderingTests.test_reversed_ordering",
367336
"timezones.tests.LegacyDatabaseTests.test_query_annotation",
368337
"timezones.tests.NewDatabaseTests.test_query_annotation",
369338
"update.tests.AdvancedTests.test_update_annotated_multi_table_queryset",
370-
"update.tests.AdvancedTests.test_update_fk",
371339
"update.tests.AdvancedTests.test_update_ordered_by_inline_m2m_annotation",
372340
"update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation",
373341
"update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation_desc",
374342
"update.tests.SimpleTest.test_empty_update_with_inheritance",
375-
"update.tests.SimpleTest.test_foreign_key_update_with_id",
376343
"update.tests.SimpleTest.test_nonempty_update_with_inheritance",
377344
},
378345
"Test inspects query for SQL": {

0 commit comments

Comments
 (0)