Edgewall Software

Ticket #2209: 2209-query-sort-milestone-r7443.patch

File 2209-query-sort-milestone-r7443.patch, 4.0 KB (added by Remy Blank <remy.blank@…>, 5 months ago)

Same patch, additionally fixed test cases

  • trac/ticket/query.py

    diff --git a/trac/ticket/query.py b/trac/ticket/query.py
    a b  
    517517                col = name + '.value' 
    518518            else: 
    519519                col = 't.' + name 
     520            desc = desc and ' DESC' or '' 
    520521            # FIXME: This is a somewhat ugly hack.  Can we also have the 
    521522            #        column type for this?  If it's an integer, we do first 
    522523            #        one, if text, we do 'else' 
    523524            if name in ('id', 'time', 'changetime'): 
    524                 if desc: 
    525                     sql.append("COALESCE(%s,0)=0 DESC," % col) 
    526                 else: 
    527                     sql.append("COALESCE(%s,0)=0," % col) 
     525                sql.append("COALESCE(%s,0)=0%s," % (col, desc)) 
    528526            else: 
    529                 if desc: 
    530                     sql.append("COALESCE(%s,'')='' DESC," % col) 
    531                 else: 
    532                     sql.append("COALESCE(%s,'')=''," % col) 
     527                sql.append("COALESCE(%s,'')=''%s," % (col, desc)) 
    533528            if name in enum_columns: 
    534529                # These values must be compared as ints, not as strings 
    535530                db = self.env.get_db_cnx() 
    536                 if desc: 
    537                     sql.append(db.cast(col, 'int') + ' DESC') 
    538                 else: 
    539                     sql.append(db.cast(col, 'int')) 
    540             elif name in ('milestone', 'version'): 
    541                 if name == 'milestone':  
    542                     time_col = 'milestone.due' 
    543                 else: 
    544                     time_col = 'version.time' 
    545                 if desc: 
    546                     sql.append("COALESCE(%s,0)=0 DESC,%s DESC,%s DESC" 
    547                                % (time_col, time_col, col)) 
    548                 else: 
    549                     sql.append("COALESCE(%s,0)=0,%s,%s" 
    550                                % (time_col, time_col, col)) 
     531                sql.append(db.cast(col, 'int') + desc) 
     532            elif name == 'milestone': 
     533                sql.append("COALESCE(milestone.completed,0)=0%s," 
     534                           "milestone.completed%s," 
     535                           "COALESCE(milestone.due,0)=0%s,milestone.due%s," 
     536                           "%s%s" % (desc, desc, desc, desc, col, desc)) 
     537            elif name == 'version': 
     538                sql.append("COALESCE(version.time,0)=0%s,version.time%s,%s%s" 
     539                           % (desc, desc, col, desc)) 
    551540            else: 
    552                 if desc: 
    553                     sql.append("%s DESC" % col) 
    554                 else: 
    555                     sql.append("%s" % col) 
     541                sql.append("%s%s" % (col, desc)) 
    556542            if name == self.group and not name == self.order: 
    557543                sql.append(",") 
    558544        if self.order != 'id': 
  • trac/ticket/tests/query.py

    diff --git a/trac/ticket/tests/query.py b/trac/ticket/tests/query.py
    a b  
    137137FROM ticket AS t 
    138138  LEFT OUTER JOIN enum AS priority ON (priority.type='priority' AND priority.name=priority) 
    139139  LEFT OUTER JOIN milestone ON (milestone.name=milestone) 
    140 ORDER BY COALESCE(t.milestone,'')='',COALESCE(milestone.due,0)=0,milestone.due,t.milestone,COALESCE(t.id,0)=0,t.id""") 
     140ORDER BY COALESCE(t.milestone,'')='',COALESCE(milestone.completed,0)=0,milestone.completed,COALESCE(milestone.due,0)=0,milestone.due,t.milestone,COALESCE(t.id,0)=0,t.id""") 
    141141        self.assertEqual([], args) 
    142142        tickets = query.execute(self.req) 
    143143 
     
    149149FROM ticket AS t 
    150150  LEFT OUTER JOIN enum AS priority ON (priority.type='priority' AND priority.name=priority) 
    151151  LEFT OUTER JOIN milestone ON (milestone.name=milestone) 
    152 ORDER BY COALESCE(t.milestone,'')='' DESC,COALESCE(milestone.due,0)=0 DESC,milestone.due DESC,t.milestone DESC,COALESCE(t.id,0)=0,t.id""") 
     152ORDER BY COALESCE(t.milestone,'')='' DESC,COALESCE(milestone.completed,0)=0 DESC,milestone.completed DESC,COALESCE(milestone.due,0)=0 DESC,milestone.due DESC,t.milestone DESC,COALESCE(t.id,0)=0,t.id""") 
    153153        self.assertEqual([], args) 
    154154        tickets = query.execute(self.req) 
    155155