[rt-users] 3.6.3 - sorting on Custom Fields still not working?

Joop JoopvandeWege at mococo.nl
Tue Feb 13 03:14:12 EST 2007


Joop wrote:
> OK. RT-3.6.3 has the possibility to log sql statements. Please turn this 
> on and try to find the query which is not producing the correct results. 
> We might be talking about different things.
> I'll do the same in the clients RT with patch and without, hoping they 
> don't mind the slight interruption.
> The problem that we were facing is that you start with entering CF's and 
> ordering is fine until either you delete some CF's or start moving them 
> around and then suddenly the ordering isn't correct any more, the reason 
> is that Oracle gets its rows, probably, in entered order until you 
> disturb it by deleted records. This makes it hard to reproduce in a test 
> environment by entering CF's and looking whether they come out in order 
> or not.

The patch that I send to Ruslan is meant to fix the ordering on, for 
example, the customfields which are displayed when looking at a ticket. 
In my case we discovered this problem because we use AssetTracker alot 
with lots of customfields and suddenly they started being displayed in a 
different order. I'm talking about this page:
http://localhost/rt3/AssetTracker/Asset/ModifyFields.html?id=163 and the 
query from this is:
  SELECT main.*
   FROM (SELECT   main.ID
             FROM customfields main, objectcustomfields objectcustomfields_1
            WHERE (   (objectcustomfields_1.objectid = '2')
                   OR (objectcustomfields_1.objectid = '0')
                  )
              AND ((main.disabled = '0'))
              AND ((main.lookuptype =
 
'RTx::AssetTracker::Type-RTx::AssetTracker::Asset'
                   )
                  )
              AND ((main.ID = objectcustomfields_1.customfield))
         ORDER BY objectcustomfields_1.objectid ASC,
                  objectcustomfields_1.sortorder ASC) distinctquery,
        customfields main
  WHERE (main.ID = distinctquery.ID)

And when using the original Oracle.pm its:
SELECT main.*
   FROM (SELECT   main.ID
             FROM customfields main, objectcustomfields objectcustomfields_1
            WHERE (   (objectcustomfields_1.objectid = '2')
                   OR (objectcustomfields_1.objectid = '0')
                  )
              AND ((main.disabled = '0'))
              AND ((main.lookuptype =
 
'RTx::AssetTracker::Type-RTx::AssetTracker::Asset'
                   )
                  )
              AND ((main.ID = objectcustomfields_1.customfield))
         GROUP BY main.ID
         ORDER BY MIN (objectcustomfields_1.objectid) ASC,
                  MIN (objectcustomfields_1.sortorder) ASC) distinctquery,
        customfields main
  WHERE (main.ID = distinctquery.ID)

Notice the extra GROUP BY main.ID and ORDER BY MIN(..) statements.

When I perform a search like this, ticket SQL:
Queue = 'Purmerend' AND 'CF.{Soort Hulp}' LIKE 'Eerste lijn'
I get an Oracle SQL statement about the same as you but not quite so I'm 
not sure this is the correct search that I'm doing.
This is what I get:
SELECT *
   FROM (SELECT limitquery.*, ROWNUM limitrownum
           FROM (SELECT   main.*
                     FROM (SELECT DISTINCT main.ID
                                      FROM (((tickets main LEFT JOIN 
objectcustomfields objectcustomfields_1
                                           ON 
((objectcustomfields_1.objectid =
 
     '0'
                                               )
                                              )
                                          OR 
(objectcustomfields_1.objectid =
 
main.queue
                                             ))
                                           LEFT JOIN
                                           customfields customfields_2
                                           ON (customfields_2.ID =
 
objectcustomfields_1.customfield
                                              ))
                                           LEFT JOIN
                                           objectcustomfieldvalues 
objectcustomfieldvalues_3
                                           ON 
((objectcustomfieldvalues_3.objectid =
 
main.ID
                                               )
                                              )
                                         AND 
(objectcustomfieldvalues_3.customfield =
 
customfields_2.ID
                                             )
                                         AND 
((objectcustomfieldvalues_3.disabled =
 
     '0'
                                              )
                                             )
                                         AND 
((objectcustomfieldvalues_3.objecttype =
 
'RT::Ticket'
                                              )
                                             ))
                                     WHERE ((customfields_2.NAME = 
'Soort Hulp'
                                            )
                                           )
                                       AND ((main.effectiveid = main.ID))
                                       AND ((main.status != 'deleted'))
                                       AND ((main.TYPE = 'ticket'))
                                       AND (    (main.queue = '22')
                                            AND 
((objectcustomfieldvalues_3.content LIKE
 
'Eerste lijn'
                                                 )
                                                )
                                           )) distinctquery,
                          tickets main
                    WHERE (main.ID = distinctquery.ID)
                 ORDER BY main.ID DESC) limitquery
          WHERE ROWNUM <= 50)
  WHERE limitrownum >= 1

And this is your query:
SELECT *
   FROM (SELECT limitquery.*, ROWNUM limitrownum
           FROM (SELECT main.*
                   FROM (SELECT   main.ID
                             FROM ((((tickets main LEFT JOIN 
objectcustomfields objectcustomfields_1
                                  ON ((objectcustomfields_1.objectid = '0'))
                                 OR (objectcustomfields_1.objectid = 
main.queue
                                    ))
                                  LEFT JOIN
                                  customfields customfields_2
                                  ON (customfields_2.ID =
 
objectcustomfields_1.customfield
                                     ))
                                  LEFT JOIN
                                  objectcustomfieldvalues 
objectcustomfieldvalues_3
                                  ON ((objectcustomfieldvalues_3.objectid =
 
main.ID
                                      )
                                     )
                                AND (objectcustomfieldvalues_3.customfield =
 
customfields_2.ID
                                    )
                                AND ((objectcustomfieldvalues_3.disabled 
= '0'
                                     )
                                    )
                                AND ((objectcustomfieldvalues_3.objecttype =
 
'RT::Ticket'
                                     )
                                    ))
                                  LEFT JOIN
                                  customfieldvalues customfieldvalues_4
                                  ON ((customfieldvalues_4.NAME =
 
objectcustomfieldvalues_3.content
                                      )
                                     )
                                AND (customfieldvalues_4.customfield =
 
objectcustomfieldvalues_3.customfield
                                    ))
                            WHERE ((main.effectiveid = main.ID))
                              AND ((main.status != 'deleted'))
                              AND ((main.TYPE = 'ticket'))
                              AND (((main.owner = '86')))
                         GROUP BY main.ID
                         ORDER BY MIN (customfieldvalues_4.sortorder) ASC,
                                  MIN 
(objectcustomfieldvalues_3.content) ASC) distinctquery,
                        tickets main
                  WHERE (main.ID = distinctquery.ID)) limitquery
          WHERE ROWNUM <= 50)
  WHERE limitrownum >= 1;

Could you post the TicketSQL for your search?
You can get this from the QueryBuilder page and than 'Advanced'

Thanks in advance,

Joop



More information about the rt-users mailing list