From e80c7cc5c103788a4c7e1c479af2c37cd9c958b3 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 6 Sep 2014 17:56:53 -0400 Subject: wip for #3148 --- lib/sqlalchemy/sql/elements.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'lib/sqlalchemy/sql/elements.py') diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index 870e96437..c8504f21f 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -675,6 +675,19 @@ class ColumnElement(operators.ColumnOperators, ClauseElement): """ + _resolve_label = None + """The name that should be used to identify this ColumnElement in a + select() object when "label resolution" logic is used; this refers + to using a string name in an expression like order_by() or group_by() + that wishes to target a labeled expression in the columns clause. + + The name is distinct from that of .name or ._label to account for the case + where anonymizing logic may be used to change the name that's actually + rendered at compile time; this attribute should hold onto the original + name that was user-assigned when producing a .label() construct. + + """ + _alt_names = () def self_group(self, against=None): @@ -691,6 +704,8 @@ class ColumnElement(operators.ColumnOperators, ClauseElement): else: return super(ColumnElement, self)._negate() + _allow_label_resolve = True + @util.memoized_property def type(self): return type_api.NULLTYPE @@ -1231,7 +1246,7 @@ class TextClause(Executable, ClauseElement): # help in those cases where text() is # interpreted in a column expression situation - key = _label = None + key = _label = _resolve_label = None def __init__( self, @@ -2869,8 +2884,13 @@ class Label(ColumnElement): :param obj: a :class:`.ColumnElement`. """ + + if isinstance(element, Label): + self._resolve_label = element._label + while isinstance(element, Label): element = element.element + if name: self.name = name else: @@ -2885,6 +2905,10 @@ class Label(ColumnElement): def __reduce__(self): return self.__class__, (self.name, self._element, self._type) + @util.memoized_property + def _allow_label_resolve(self): + return self.element._allow_label_resolve + @util.memoized_property def _order_by_label_element(self): return self -- cgit v1.2.1