Skip to content

Commit 5ede3f3

Browse files
committed
refactor compiler.
1 parent e347d97 commit 5ede3f3

File tree

1 file changed

+23
-38
lines changed

1 file changed

+23
-38
lines changed

django_mongodb/compiler.py

Lines changed: 23 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,18 @@ def execute_sql(
2323
# QuerySet.count()
2424
if self.query.annotations == {"__count": Count("*")}:
2525
return [self.get_count()]
26-
# Specify columns if there are any annotations so that annotations are
27-
# computed via $project.
28-
columns = self.get_columns() if self.query.annotations else None
26+
27+
columns = self.get_columns()
2928
try:
3029
query = self.build_query(columns)
3130
except EmptyResultSet:
3231
return None
33-
return query.fetch()
32+
33+
return (
34+
(self._make_result(row, columns) for row in query.fetch())
35+
if result_type == MULTI
36+
else self._make_result(next(query.fetch()), columns)
37+
)
3438

3539
def results_iter(
3640
self,
@@ -43,37 +47,24 @@ def results_iter(
4347
Return an iterator over the results from executing query given
4448
to this compiler. Called by QuerySet methods.
4549
"""
46-
columns = self.get_columns()
4750

4851
if results is None:
4952
# QuerySet.values() or values_list()
50-
try:
51-
results = self.build_query(columns).fetch()
52-
except EmptyResultSet:
53-
results = []
53+
results = self.execute_sql(MULTI, chunked_fetch=chunked_fetch, chunk_size=chunk_size)
5454

55-
converters = self.get_converters(columns)
56-
for entity in results:
57-
yield self._make_result(entity, columns, converters, tuple_expected=tuple_expected)
55+
fields = [s[0] for s in self.select[0 : self.col_count]]
56+
converters = self.get_converters(fields)
57+
rows = results
58+
if converters:
59+
rows = self.apply_converters(rows, converters)
60+
if tuple_expected:
61+
rows = map(tuple, rows)
62+
return rows
5863

5964
def has_results(self):
6065
return bool(self.get_count(check_exists=True))
6166

62-
def get_converters(self, expressions):
63-
converters = {}
64-
for name_expr in expressions:
65-
try:
66-
name, expr = name_expr
67-
except TypeError:
68-
# e.g., Count("*")
69-
continue
70-
backend_converters = self.connection.ops.get_db_converters(expr)
71-
field_converters = expr.get_db_converters(self.connection)
72-
if backend_converters or field_converters:
73-
converters[name] = backend_converters + field_converters
74-
return converters
75-
76-
def _make_result(self, entity, columns, converters, tuple_expected=False):
67+
def _make_result(self, entity, columns):
7768
"""
7869
Decode values for the given fields from the database entity.
7970
@@ -82,7 +73,6 @@ def _make_result(self, entity, columns, converters, tuple_expected=False):
8273
"""
8374
result = []
8475
for name, col in columns:
85-
field = col.field
8676
column_alias = getattr(col, "alias", None)
8777
obj = (
8878
# Use the related object...
@@ -91,16 +81,7 @@ def _make_result(self, entity, columns, converters, tuple_expected=False):
9181
if column_alias is not None and column_alias != self.collection_name
9282
else entity
9383
)
94-
value = obj.get(name, NOT_PROVIDED)
95-
if value is NOT_PROVIDED:
96-
value = field.get_default()
97-
elif converters:
98-
# Decode values using Django's database converters API.
99-
for converter in converters.get(name, ()):
100-
value = converter(value, col, self.connection)
101-
result.append(value)
102-
if tuple_expected:
103-
result = tuple(result)
84+
result.append(obj.get(name, NOT_PROVIDED))
10485
return result
10586

10687
def check_query(self):
@@ -239,6 +220,10 @@ def _get_ordering(self):
239220
def collection_name(self):
240221
return self.query.get_meta().db_table
241222

223+
@cached_property
224+
def collection_name(self):
225+
return self.query.get_meta().db_table
226+
242227
def get_collection(self):
243228
return self.connection.get_collection(self.collection_name)
244229

0 commit comments

Comments
 (0)