METAMODEL-35: Improved paged queries on DB2 by carrying ORDER BY clause
to OVER function.
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java
index ef21fbf..fcb0e27 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java
@@ -100,7 +100,10 @@
                 outerQuery.select(new SelectItem(selectItem, subQuerySelectItem));
             }
 
-            innerQuery.select(new SelectItem("ROW_NUMBER() OVER()", "metamodel_row_number"));
+            final String rewrittenOrderByClause = rewriteOrderByClause(innerQuery, innerQuery.getOrderByClause());
+            final String rowOver = "ROW_NUMBER() " + "OVER(" + rewrittenOrderByClause + ")";
+            innerQuery.select(new SelectItem(rowOver, "metamodel_row_number"));
+            innerQuery.getOrderByClause().removeItems();
 
             final String baseQueryString = rewriteQuery(outerQuery);
 
diff --git a/jdbc/src/test/java/org/apache/metamodel/dialects/DB2QueryRewriterTest.java b/jdbc/src/test/java/org/apache/metamodel/dialects/DB2QueryRewriterTest.java
index b71e98a..9108461 100644
--- a/jdbc/src/test/java/org/apache/metamodel/dialects/DB2QueryRewriterTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/dialects/DB2QueryRewriterTest.java
@@ -68,7 +68,34 @@
                 "SELECT metamodel_subquery.bar FROM (SELECT sch.foo.bar, ROW_NUMBER() OVER() AS metamodel_row_number FROM sch.foo) metamodel_subquery WHERE metamodel_row_number > 400",
                 str);
     }
+    
+    public void testRewriteFirstRowWithoutOrderByClause() throws Exception {
+        Query q = new Query().from(table).select(col).setFirstRow(401);
+        String str = new DB2QueryRewriter(null).rewriteQuery(q);
 
+        assertEquals(
+                "SELECT metamodel_subquery.bar FROM (SELECT sch.foo.bar, ROW_NUMBER() OVER() AS metamodel_row_number FROM sch.foo) metamodel_subquery WHERE metamodel_row_number > 400",
+                str);
+    }
+    
+    public void testRewriteFirstRowWithOrderByClause() throws Exception {
+        Query q = new Query().from(table).select(col).setFirstRow(401);
+        q.orderBy(col);
+        String str = new DB2QueryRewriter(null).rewriteQuery(q);
+
+        assertEquals(
+                "SELECT metamodel_subquery.bar FROM (SELECT sch.foo.bar, ROW_NUMBER() OVER( ORDER BY sch.foo.bar ASC) AS metamodel_row_number FROM sch.foo) metamodel_subquery WHERE metamodel_row_number > 400",
+                str);
+    }
+
+    public void testRewriteFirstRowAndMaxRowsWithoutOrderByClause() throws Exception {
+        Query q = new Query().from(table).select(col).setFirstRow(401).setMaxRows(400);
+        String str = new DB2QueryRewriter(null).rewriteQuery(q);
+        assertEquals(
+                "SELECT metamodel_subquery.bar FROM (SELECT sch.foo.bar, ROW_NUMBER() OVER() AS metamodel_row_number FROM sch.foo) metamodel_subquery WHERE metamodel_row_number BETWEEN 401 AND 800",
+                str);
+    }
+    
     public void testRewriteFirstRowAndMaxRows() throws Exception {
         Query q = new Query().from(table).select(col).setFirstRow(401).setMaxRows(400);
         String str = new DB2QueryRewriter(null).rewriteQuery(q);
@@ -76,6 +103,15 @@
                 "SELECT metamodel_subquery.bar FROM (SELECT sch.foo.bar, ROW_NUMBER() OVER() AS metamodel_row_number FROM sch.foo) metamodel_subquery WHERE metamodel_row_number BETWEEN 401 AND 800",
                 str);
     }
+    
+    public void testRewriteFirstRowAndMaxRowsWithOrderByClause() throws Exception {
+        Query q = new Query().from(table).select(col).setFirstRow(401).setMaxRows(400);
+        q.orderBy(col);
+        String str = new DB2QueryRewriter(null).rewriteQuery(q);
+        assertEquals(
+                "SELECT metamodel_subquery.bar FROM (SELECT sch.foo.bar, ROW_NUMBER() OVER( ORDER BY sch.foo.bar ASC) AS metamodel_row_number FROM sch.foo) metamodel_subquery WHERE metamodel_row_number BETWEEN 401 AND 800",
+                str);
+    }
 
     public void testRewriteColumnType() throws Exception {
         assertEquals("SMALLINT", new DB2QueryRewriter(null).rewriteColumnType(ColumnType.BOOLEAN));