METAMODEL-35: Improved paged queries on DB2 by carrying ORDER BY clause 4.0.x 202/head
authorGagan Deep Juneja <gagandeepjuneja@gmail.com>
Wed, 22 Jan 2014 13:15:49 +0000 (14:15 +0100)
committerKasper Sørensen <i.am.kasper.sorensen@gmail.com>
Wed, 22 Jan 2014 13:22:43 +0000 (14:22 +0100)
to OVER function.

jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java
jdbc/src/test/java/org/apache/metamodel/dialects/DB2QueryRewriterTest.java

index ef21fbf..fcb0e27 100644 (file)
@@ -100,7 +100,10 @@ public class DB2QueryRewriter extends DefaultQueryRewriter implements IQueryRewr
                 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);
 
index b71e98a..9108461 100644 (file)
@@ -68,7 +68,34 @@ public class DB2QueryRewriterTest extends TestCase {
                 "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 @@ public class DB2QueryRewriterTest extends TestCase {
                 "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));