Refs #27624 -- Optimized sql.Query creation by moving immutable/singleton attributes to class attributes.
This commit is contained in:
parent
5659015d3c
commit
6d5709ce7d
|
@ -155,6 +155,66 @@ class Query(BaseExpression):
|
||||||
base_table_class = BaseTable
|
base_table_class = BaseTable
|
||||||
join_class = Join
|
join_class = Join
|
||||||
|
|
||||||
|
default_cols = True
|
||||||
|
default_ordering = True
|
||||||
|
standard_ordering = True
|
||||||
|
|
||||||
|
filter_is_sticky = False
|
||||||
|
subquery = False
|
||||||
|
|
||||||
|
# SQL-related attributes.
|
||||||
|
# Select and related select clauses are expressions to use in the SELECT
|
||||||
|
# clause of the query. The select is used for cases where we want to set up
|
||||||
|
# the select clause to contain other than default fields (values(),
|
||||||
|
# subqueries...). Note that annotations go to annotations dictionary.
|
||||||
|
select = ()
|
||||||
|
# The group_by attribute can have one of the following forms:
|
||||||
|
# - None: no group by at all in the query
|
||||||
|
# - A tuple of expressions: group by (at least) those expressions.
|
||||||
|
# String refs are also allowed for now.
|
||||||
|
# - True: group by all select fields of the model
|
||||||
|
# See compiler.get_group_by() for details.
|
||||||
|
group_by = None
|
||||||
|
order_by = ()
|
||||||
|
low_mark = 0 # Used for offset/limit.
|
||||||
|
high_mark = None # Used for offset/limit.
|
||||||
|
distinct = False
|
||||||
|
distinct_fields = ()
|
||||||
|
select_for_update = False
|
||||||
|
select_for_update_nowait = False
|
||||||
|
select_for_update_skip_locked = False
|
||||||
|
select_for_update_of = ()
|
||||||
|
select_for_no_key_update = False
|
||||||
|
select_related = False
|
||||||
|
# Arbitrary limit for select_related to prevents infinite recursion.
|
||||||
|
max_depth = 5
|
||||||
|
# Holds the selects defined by a call to values() or values_list()
|
||||||
|
# excluding annotation_select and extra_select.
|
||||||
|
values_select = ()
|
||||||
|
|
||||||
|
# SQL annotation-related attributes.
|
||||||
|
annotation_select_mask = None
|
||||||
|
_annotation_select_cache = None
|
||||||
|
|
||||||
|
# Set combination attributes.
|
||||||
|
combinator = None
|
||||||
|
combinator_all = False
|
||||||
|
combined_queries = ()
|
||||||
|
|
||||||
|
# These are for extensions. The contents are more or less appended verbatim
|
||||||
|
# to the appropriate clause.
|
||||||
|
extra_select_mask = None
|
||||||
|
_extra_select_cache = None
|
||||||
|
|
||||||
|
extra_tables = ()
|
||||||
|
extra_order_by = ()
|
||||||
|
|
||||||
|
# A tuple that is a set of model field names and either True, if these are
|
||||||
|
# the fields to defer, or False if these are the only fields to load.
|
||||||
|
deferred_loading = (frozenset(), True)
|
||||||
|
|
||||||
|
explain_info = None
|
||||||
|
|
||||||
def __init__(self, model, alias_cols=True):
|
def __init__(self, model, alias_cols=True):
|
||||||
self.model = model
|
self.model = model
|
||||||
self.alias_refcount = {}
|
self.alias_refcount = {}
|
||||||
|
@ -172,74 +232,17 @@ class Query(BaseExpression):
|
||||||
# Map external tables to whether they are aliased.
|
# Map external tables to whether they are aliased.
|
||||||
self.external_aliases = {}
|
self.external_aliases = {}
|
||||||
self.table_map = {} # Maps table names to list of aliases.
|
self.table_map = {} # Maps table names to list of aliases.
|
||||||
self.default_cols = True
|
|
||||||
self.default_ordering = True
|
|
||||||
self.standard_ordering = True
|
|
||||||
self.used_aliases = set()
|
self.used_aliases = set()
|
||||||
self.filter_is_sticky = False
|
|
||||||
self.subquery = False
|
|
||||||
|
|
||||||
# SQL-related attributes
|
|
||||||
# Select and related select clauses are expressions to use in the
|
|
||||||
# SELECT clause of the query.
|
|
||||||
# The select is used for cases where we want to set up the select
|
|
||||||
# clause to contain other than default fields (values(), subqueries...)
|
|
||||||
# Note that annotations go to annotations dictionary.
|
|
||||||
self.select = ()
|
|
||||||
self.where = WhereNode()
|
self.where = WhereNode()
|
||||||
# The group_by attribute can have one of the following forms:
|
# Maps alias -> Annotation Expression.
|
||||||
# - None: no group by at all in the query
|
self.annotations = {}
|
||||||
# - A tuple of expressions: group by (at least) those expressions.
|
|
||||||
# String refs are also allowed for now.
|
|
||||||
# - True: group by all select fields of the model
|
|
||||||
# See compiler.get_group_by() for details.
|
|
||||||
self.group_by = None
|
|
||||||
self.order_by = ()
|
|
||||||
self.low_mark, self.high_mark = 0, None # Used for offset/limit
|
|
||||||
self.distinct = False
|
|
||||||
self.distinct_fields = ()
|
|
||||||
self.select_for_update = False
|
|
||||||
self.select_for_update_nowait = False
|
|
||||||
self.select_for_update_skip_locked = False
|
|
||||||
self.select_for_update_of = ()
|
|
||||||
self.select_for_no_key_update = False
|
|
||||||
|
|
||||||
self.select_related = False
|
|
||||||
# Arbitrary limit for select_related to prevents infinite recursion.
|
|
||||||
self.max_depth = 5
|
|
||||||
|
|
||||||
# Holds the selects defined by a call to values() or values_list()
|
|
||||||
# excluding annotation_select and extra_select.
|
|
||||||
self.values_select = ()
|
|
||||||
|
|
||||||
# SQL annotation-related attributes
|
|
||||||
self.annotations = {} # Maps alias -> Annotation Expression
|
|
||||||
self.annotation_select_mask = None
|
|
||||||
self._annotation_select_cache = None
|
|
||||||
|
|
||||||
# Set combination attributes
|
|
||||||
self.combinator = None
|
|
||||||
self.combinator_all = False
|
|
||||||
self.combined_queries = ()
|
|
||||||
|
|
||||||
# These are for extensions. The contents are more or less appended
|
# These are for extensions. The contents are more or less appended
|
||||||
# verbatim to the appropriate clause.
|
# verbatim to the appropriate clause.
|
||||||
self.extra = {} # Maps col_alias -> (col_sql, params).
|
self.extra = {} # Maps col_alias -> (col_sql, params).
|
||||||
self.extra_select_mask = None
|
|
||||||
self._extra_select_cache = None
|
|
||||||
|
|
||||||
self.extra_tables = ()
|
|
||||||
self.extra_order_by = ()
|
|
||||||
|
|
||||||
# A tuple that is a set of model field names and either True, if these
|
|
||||||
# are the fields to defer, or False if these are the only fields to
|
|
||||||
# load.
|
|
||||||
self.deferred_loading = (frozenset(), True)
|
|
||||||
|
|
||||||
self._filtered_relations = {}
|
self._filtered_relations = {}
|
||||||
|
|
||||||
self.explain_info = None
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def output_field(self):
|
def output_field(self):
|
||||||
if len(self.select) == 1:
|
if len(self.select) == 1:
|
||||||
|
|
Loading…
Reference in New Issue