diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 8b40edd..f736e27 100644
|
a
|
b
|
from django.db import connection
|
| 16 | 16 | from django.db.models import signals |
| 17 | 17 | from django.db.models.fields import FieldDoesNotExist |
| 18 | 18 | from django.db.models.query_utils import select_related_descend |
| 19 | | from django.db.models.sql import aggregates |
| | 19 | from django.db.models.sql import aggregates as aggregates_module |
| 20 | 20 | from django.db.models.sql.where import WhereNode, EverythingNode, AND, OR |
| 21 | 21 | from django.core.exceptions import FieldError |
| 22 | 22 | from datastructures import EmptyResultSet, Empty, MultiJoin |
| … |
… |
class BaseQuery(object):
|
| 40 | 40 | |
| 41 | 41 | alias_prefix = 'T' |
| 42 | 42 | query_terms = QUERY_TERMS |
| 43 | | |
| | 43 | aggregates = aggregates_module |
| | 44 | |
| 44 | 45 | def __init__(self, model, connection, where=WhereNode): |
| 45 | 46 | self.model = model |
| 46 | 47 | self.connection = connection |
| … |
… |
class BaseQuery(object):
|
| 198 | 199 | obj._setup_query() |
| 199 | 200 | return obj |
| 200 | 201 | |
| | 202 | def normalize(self, aggregate, value): |
| | 203 | """ |
| | 204 | Returns a normalized Python object from the given aggregate object |
| | 205 | and raw database value. |
| | 206 | """ |
| | 207 | return self.connection.ops.db_aggregate_to_value(aggregate, value) |
| | 208 | |
| 201 | 209 | def results_iter(self): |
| 202 | 210 | """ |
| 203 | 211 | Returns an iterator over the results from executing this query. |
| 204 | 212 | """ |
| 205 | 213 | resolve_columns = hasattr(self, 'resolve_columns') |
| 206 | 214 | fields = None |
| 207 | | normalize = self.connection.ops.db_aggregate_to_value |
| 208 | 215 | for rows in self.execute_sql(MULTI): |
| 209 | 216 | for row in rows: |
| 210 | 217 | if resolve_columns: |
| … |
… |
class BaseQuery(object):
|
| 221 | 228 | if self.aggregate_select: |
| 222 | 229 | aggregate_start = len(self.extra_select.keys()) + len(self.select) |
| 223 | 230 | row = row[:aggregate_start] + tuple( |
| 224 | | normalize(aggregate, value) |
| | 231 | self.normalize(aggregate, value) |
| 225 | 232 | for (alias, aggregate), value |
| 226 | 233 | in zip(self.aggregate_select.items(), row[aggregate_start:]) |
| 227 | 234 | ) |
| … |
… |
class BaseQuery(object):
|
| 263 | 270 | query.select_related = False |
| 264 | 271 | query.related_select_cols = [] |
| 265 | 272 | query.related_select_fields = [] |
| 266 | | |
| 267 | | normalize = self.connection.ops.db_aggregate_to_value |
| | 273 | |
| 268 | 274 | return dict( |
| 269 | | (alias, normalize(aggregate, val)) |
| | 275 | (alias, self.normalize(aggregate, val)) |
| 270 | 276 | for (alias, aggregate), val |
| 271 | 277 | in zip(query.aggregate_select.items(), query.execute_sql(SINGLE)) |
| 272 | 278 | ) |
| … |
… |
class BaseQuery(object):
|
| 1178 | 1184 | aggregate_expr.lookup in self.aggregate_select.keys()): |
| 1179 | 1185 | # Aggregate is over an annotation |
| 1180 | 1186 | field_name = field_list[0] |
| 1181 | | aggregate = aggregate_expr.add_to_query(self, aggregates, |
| | 1187 | aggregate = aggregate_expr.add_to_query(self, self.aggregates, |
| 1182 | 1188 | col=field_name, |
| 1183 | 1189 | source=self.aggregate_select[field_name], |
| 1184 | 1190 | is_summary=is_summary) |
| … |
… |
class BaseQuery(object):
|
| 1197 | 1203 | for column_alias in join_list: |
| 1198 | 1204 | self.promote_alias(column_alias, unconditional=True) |
| 1199 | 1205 | |
| 1200 | | aggregate = aggregate_expr.add_to_query(self, aggregates, |
| | 1206 | aggregate = aggregate_expr.add_to_query(self, self.aggregates, |
| 1201 | 1207 | col=(join_list[-1], col), |
| 1202 | 1208 | source=target, |
| 1203 | 1209 | is_summary=is_summary) |
| … |
… |
class BaseQuery(object):
|
| 1211 | 1217 | col = (opts.db_table, field.column) |
| 1212 | 1218 | else: |
| 1213 | 1219 | col = field_name |
| 1214 | | aggregate = aggregate_expr.add_to_query(self, aggregates, |
| | 1220 | aggregate = aggregate_expr.add_to_query(self, self.aggregates, |
| 1215 | 1221 | col=col, |
| 1216 | 1222 | source=field, |
| 1217 | 1223 | is_summary=is_summary) |
| … |
… |
class BaseQuery(object):
|
| 1790 | 1796 | """ |
| 1791 | 1797 | if not self.distinct: |
| 1792 | 1798 | if not self.select: |
| 1793 | | count = aggregates.Count('*', is_summary=True) |
| | 1799 | count = self.aggregates.Count('*', is_summary=True) |
| 1794 | 1800 | else: |
| 1795 | 1801 | assert len(self.select) == 1, \ |
| 1796 | 1802 | "Cannot add count col with multiple cols in 'select': %r" % self.select |
| 1797 | | count = aggregates.Count(self.select[0]) |
| | 1803 | count = self.aggregates.Count(self.select[0]) |
| 1798 | 1804 | else: |
| 1799 | 1805 | opts = self.model._meta |
| 1800 | 1806 | if not self.select: |
| 1801 | | count = aggregates.Count((self.join((None, opts.db_table, None, None)), opts.pk.column), |
| | 1807 | count = self.aggregates.Count((self.join((None, opts.db_table, None, None)), opts.pk.column), |
| 1802 | 1808 | is_summary=True, distinct=True) |
| 1803 | 1809 | else: |
| 1804 | 1810 | # Because of SQL portability issues, multi-column, distinct |
| … |
… |
class BaseQuery(object):
|
| 1806 | 1812 | assert len(self.select) == 1, \ |
| 1807 | 1813 | "Cannot add count col with multiple cols in 'select'." |
| 1808 | 1814 | |
| 1809 | | count = aggregates.Count(self.select[0], distinct=True) |
| | 1815 | count = self.aggregates.Count(self.select[0], distinct=True) |
| 1810 | 1816 | # Distinct handling is done in Count(), so don't do it at this |
| 1811 | 1817 | # level. |
| 1812 | 1818 | self.distinct = False |