251 | | '''Note that you need to set up permissions in order to see the buttons for adding or editing reports.''' |
| 251 | === A note about SQL rewriting #rewriting |
| 252 | |
| 253 | Beyond the relatively trivial replacement of dynamic variables, the SQL query is also altered in order to support two features of the reports: |
| 254 | 1. [#sort-order changing the sort order] |
| 255 | 2. pagination support (limitation of the number of result rows displayed on each page) |
| 256 | In order to support the first feature, the sort column is inserted in the `ORDER BY` clause in the first position or in the second position if a `__group__` column is specified (an `ORDER BY` clause is created if needed). In order to support pagination, a `LIMIT ... OFFSET ...` clause is appended. |
| 257 | The query might be too complex for the automatic rewrite to work correctly, resulting in an erroneous query. In this case you still have the possibility to control exactly how the rewrite is done by manually inserting the following tokens: |
| 258 | - `@SORT_COLUMN@`, the place where the name of the selected sort column will be inserted, |
| 259 | - `@LIMIT_OFFSET@`, the place where the pagination support clause will be added |
| 260 | Note that if you write them after an SQL comment, `--`, you'll effectively disable rewriting if this is what you want! |
| 261 | |
| 262 | Let's take an example, consider the following SQL query: |
| 263 | {{{ |
| 264 | -- ## 4: Assigned, Active Tickets by Owner ## -- |
| 265 | |
| 266 | -- |
| 267 | -- List assigned tickets, group by ticket owner, sorted by priority. |
| 268 | -- |
| 269 | |
| 270 | SELECT p.value AS __color__, |
| 271 | owner AS __group__, |
| 272 | id AS ticket, summary, component, milestone, t.type AS type, severity, time AS created, |
| 273 | changetime AS _changetime, description AS _description, |
| 274 | reporter AS _reporter |
| 275 | FROM ticket t,enum p |
| 276 | WHERE status = 'assigned' |
| 277 | AND p.name=t.priority AND p.type='priority' |
| 278 | ORDER BY __group__, p.value, severity, time |
| 279 | }}} |
| 280 | |
| 281 | The automatic rewrite will be the following (4 rows per page, page 2, sorted by `component`): |
| 282 | {{{ |
| 283 | SELECT p.value AS __color__, |
| 284 | owner AS __group__, |
| 285 | id AS ticket, summary, component, milestone, t.type AS type, severity, time AS created, |
| 286 | changetime AS _changetime, description AS _description, |
| 287 | reporter AS _reporter |
| 288 | FROM ticket t,enum p |
| 289 | WHERE status = 'assigned' |
| 290 | AND p.name=t.priority AND p.type='priority' |
| 291 | ORDER BY __group__ ASC, `component` ASC, __group__, p.value, severity, time |
| 292 | LIMIT 4 OFFSET 4 |
| 293 | }}} |
| 294 | |
| 295 | The equivalent SQL query with the rewrite tokens would have been: |
| 296 | {{{ |
| 297 | SELECT p.value AS __color__, |
| 298 | owner AS __group__, |
| 299 | id AS ticket, summary, component, milestone, t.type AS type, severity, time AS created, |
| 300 | changetime AS _changetime, description AS _description, |
| 301 | reporter AS _reporter |
| 302 | FROM ticket t,enum p |
| 303 | WHERE status = 'assigned' |
| 304 | AND p.name=t.priority AND p.type='priority' |
| 305 | ORDER BY __group__, @SORT_COLUMN@, p.value, severity, time |
| 306 | @LIMIT_OFFSET@ |
| 307 | }}} |
| 308 | |
| 309 | If you want to always sort first by priority and only then by the user selected sort column, simply use the following `ORDER BY` clause: |
| 310 | {{{ |
| 311 | ORDER BY __group__, p.value, @SORT_COLUMN@, severity, time |
| 312 | }}} |