Hi McKinley,

I have not analyzed your problem in detail but probably in this case (multiple 
order by columns) DBFuncExpr is not suitable.
You really should consider creating a class derived from DBColumnExpr 
specifically for ROW_NUMBER() OVER...
You may take the implementation of DBFuncExpr as a guideline.

We may then be able to add this expression to the 
org.apache.empire.db.expr.column package.
Good luck.

Rainer


McKinley wrote:
> Re: Rowlimits: OFFSET and LIMIT
> 
> Wow, I had to really hack to make DBFuncExpr work with multiple
> order-by columns.  Take note of the SQL comment in my function
> template. This is because I could not cleanly use the question mark
> with a DBOrderByInfo (yes, I know, I know). Anyway, the Object[]
> params work great on the {#}, but the ? want the first argument to be
> a DBColumnExpr and not a DBExpr which DBOrderByInfo. I tried to have
> the first column hit the ? and direct the " DESC" or "" string to the
> first {0}. That got type checked to DATETIME (the type of the column)
> in this case. If I just ignore using ? every works great.
> 
> Any thoughts on how this usage might be facilitated by changes to the
> function and abstract function arrangement?
> 
>       public void page(int limit, int offset, DBOrderByInfo[] orderBy)
> {
>               this.limit = limit;
>               this.offset = offset;
>               this.orderBy = orderBy;
>               if(rowNum != null) subCmd.removeSelect(rowNum);
> 
>               StringBuilder sql = new StringBuilder("ROW_NUMBER() OVER
> (ORDER BY {0}");
>               if(rowNumParams == null || rowNumParams.length !=
> orderBy.length)
>                       rowNumParams = new Object[orderBy.length];
>               rowNumParams[0] = orderBy[0];
>               for(int i = 1; i < orderBy.length; i++){
>                       rowNumParams[i] = orderBy[i];
>                       sql.append(", {").append(i).append('}');
>               }
>               sql.append(')').append("--remove ? \n"); // HACK!!!
> 
>               rowNum = new DBFuncExpr(orderBy[0].expr, sql.toString(),
> rowNumParams, null, false, DataType.INTEGER)
>                       .as("RowNum");
>               subCmd.select(rowNum);
>               subQuery = new DBQuery(subCmd);
>         this.select(subQuery.getQueryColumns());
>         this.select.remove(subQuery.findQueryColumn(etsr.UserID));
>         this.where(subQuery.findQueryColumn(rowNum).isBetween(offset,
> offset + limit));
>       }
> 
> Thanks,
> 
> McKinley
> 
> >>>> Thanks for reporting back. Did you use DESC in your ORDER BY? If
> you
> >>>> don't have wiki access you might consider posting the wiki markup
> in
> >>>> the issue tracker. I registered for the wiki, but didn't now get
> >>>> access by default.
> >>>>
> >>>> I'll be testing ROW_NUMBER on SQL Server tomorrow and will let you
> >>>> know what I find.

Reply via email to