Django

Code

Changeset 7466

Show
Ignore:
Timestamp:
04/25/08 23:03:26 (2 months ago)
Author:
mtredinnick
Message:

queryset-refactor: Added a few modifications to the select column aliases from
[7457], based on a patch from Ian Kelly. Fixed #7057.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/queryset-refactor/django/db/models/sql/query.py

    r7465 r7466  
    367367        qn = self.quote_name_unless_alias 
    368368        result = ['(%s) AS %s' % (col, alias) for alias, col in self.extra_select.iteritems()] 
    369         aliases = self.extra_select.keys(
     369        aliases = set(self.extra_select.keys()
    370370        if with_aliases: 
    371             col_aliases = set(aliases
     371            col_aliases = aliases.copy(
    372372        else: 
    373373            col_aliases = set() 
     
    379379                        c_alias = 'Col%d' % len(col_aliases) 
    380380                        result.append('%s AS %s' % (r, c_alias)) 
    381                         aliases.append(c_alias) 
     381                        aliases.add(c_alias) 
    382382                        col_aliases.add(c_alias) 
    383383                    else: 
    384384                        result.append(r) 
    385                         aliases.append(r) 
     385                        aliases.add(r) 
    386386                        col_aliases.add(col[1]) 
    387387                else: 
    388388                    result.append(col.as_sql(quote_func=qn)) 
    389389                    if hasattr(col, 'alias'): 
    390                         aliases.append(col.alias) 
     390                        aliases.add(col.alias) 
    391391                        col_aliases.add(col.alias) 
    392392        elif self.default_cols: 
    393             cols = self.get_default_columns(True, with_aliases, col_aliases) 
     393            cols, new_aliases = self.get_default_columns(with_aliases, 
     394                    col_aliases) 
    394395            result.extend(cols) 
    395             aliases.extend(cols) 
     396            aliases.update(new_aliases) 
    396397        for table, col in self.related_select_cols: 
    397398            r = '%s.%s' % (qn(table), qn(col)) 
     
    399400                c_alias = 'Col%d' % len(col_aliases) 
    400401                result.append('%s AS %s' % (r, c_alias)) 
    401                 aliases.append(c_alias) 
     402                aliases.add(c_alias) 
    402403                col_aliases.add(c_alias) 
    403404            else: 
    404405                result.append(r) 
    405                 aliases.append(r) 
     406                aliases.add(r) 
    406407                col_aliases.add(col) 
    407408 
    408         self._select_aliases = set(aliases) 
     409        self._select_aliases = aliases 
    409410        return result 
    410411 
    411     def get_default_columns(self, as_str=False, with_aliases=False, 
    412             col_aliases=None): 
     412    def get_default_columns(self, with_aliases=False, col_aliases=None): 
    413413        """ 
    414414        Computes the default columns for selecting every field in the base 
    415         model. Returns a list of default (alias, column) pairs suitable for 
    416         inclusion as the select columns. If 'as_str' is True, returns a list of 
    417         strings, quoted appropriately for use in SQL directly. 
     415        model. 
     416 
     417        Returns a list of strings, quoted appropriately for use in SQL 
     418        directly, as well as a set of aliases used in the select statement. 
    418419        """ 
    419420        result = [] 
     
    423424        qn = self.quote_name_unless_alias 
    424425        qn2 = self.connection.ops.quote_name 
     426        aliases = set() 
    425427        for field, model in self.model._meta.get_fields_with_model(): 
    426428            try: 
     
    430432                        root_pk, model._meta.pk.column)) 
    431433                seen[model] = alias 
    432             if as_str: 
    433                 if with_aliases and field.column in col_aliases: 
    434                     c_alias = 'Col%d' % len(col_aliases) 
    435                     result.append('%s.%s AS %s' % (qn(alias), 
    436                         qn2(field.column), c_alias)) 
    437                 else: 
    438                     result.append('%s.%s' % (qn(alias), qn2(field.column))) 
    439             else: 
    440                 result.append((alias, field.column)) 
    441         return result 
     434            if with_aliases and field.column in col_aliases: 
     435                c_alias = 'Col%d' % len(col_aliases) 
     436                result.append('%s.%s AS %s' % (qn(alias), 
     437                    qn2(field.column), c_alias)) 
     438                col_aliases.add(c_alias) 
     439                aliases.add(c_alias) 
     440            else: 
     441                r = '%s.%s' % (qn(alias), qn2(field.column)) 
     442                result.append(r) 
     443                aliases.add(r) 
     444                if with_aliases: 
     445                    col_aliases.add(field.column) 
     446        return result, aliases 
    442447 
    443448    def get_from_clause(self):