You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by am...@apache.org on 2013/06/07 14:31:44 UTC

svn commit: r1490611 - in /hive/branches/HIVE-4115/ql/src: java/org/apache/hadoop/hive/ql/cube/parse/CubeQueryContext.java test/org/apache/hadoop/hive/ql/cube/processors/TestCubeDriver.java

Author: amareshwari
Date: Fri Jun  7 12:31:44 2013
New Revision: 1490611

URL: http://svn.apache.org/r1490611
Log:
Make union query as subquery

Modified:
    hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/parse/CubeQueryContext.java
    hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/processors/TestCubeDriver.java

Modified: hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/parse/CubeQueryContext.java
URL: http://svn.apache.org/viewvc/hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/parse/CubeQueryContext.java?rev=1490611&r1=1490610&r2=1490611&view=diff
==============================================================================
--- hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/parse/CubeQueryContext.java (original)
+++ hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/parse/CubeQueryContext.java Fri Jun  7 12:31:44 2013
@@ -726,6 +726,25 @@ public class CubeQueryContext {
     return queryFormat.toString();
   }
 
+  private final String unionQueryFormat = "SELECT * FROM %s";
+  String getUnionQueryFormat() {
+    StringBuilder queryFormat = new StringBuilder();
+    queryFormat.append(unionQueryFormat);
+    if (getGroupByTree() != null) {
+      queryFormat.append(" GROUP BY %s");
+    }
+    if (getHavingTree() != null) {
+      queryFormat.append(" HAVING %s");
+    }
+    if (getOrderByTree() != null) {
+      queryFormat.append(" ORDER BY %s");
+    }
+    if (getLimitValue() != null) {
+      queryFormat.append(" LIMIT %s");
+    }
+    return queryFormat.toString();
+  }
+
   private Object[] getQueryTreeStrings(String factStorageTable)
       throws SemanticException {
     List<String> qstrs = new ArrayList<String>();
@@ -750,6 +769,24 @@ public class CubeQueryContext {
     return qstrs.toArray(new String[0]);
   }
 
+  private Object[] getUnionQueryTreeStrings(String baseQuery) {
+    List<String> qstrs = new ArrayList<String>();
+    qstrs.add("(" + baseQuery + ") "+ getAliasForTabName(cube.getName()));
+    if (getGroupByTree() != null) {
+      qstrs.add(getGroupByTree());
+    }
+    if (getHavingTree() != null) {
+      qstrs.add(getHavingTree());
+    }
+    if (getOrderByTree() != null) {
+      qstrs.add(getOrderByTree());
+    }
+    if (getLimitValue() != null) {
+      qstrs.add(String.valueOf(getLimitValue()));
+    }
+    return qstrs.toArray(new String[0]);
+  }
+
   private String getFromString() throws SemanticException {
     String fromString = null;
     if (joinTree == null) {
@@ -827,6 +864,12 @@ public class CubeQueryContext {
     return String.format(qfmt, getQueryTreeStrings(tableName));
   }
 
+  private String getUnionQuery(String baseQuery) {
+    String qfmt = getUnionQueryFormat();
+    LOG.info("union query format:" + qfmt);
+    return String.format(qfmt, getUnionQueryTreeStrings(baseQuery));
+
+  }
   private void appendWhereClause(StringBuilder whereWithoutTimerange,
       String whereClause, boolean hasMore) {
     if (hasMore) {
@@ -919,7 +962,11 @@ public class CubeQueryContext {
           query.append(" UNION ALL ");
         }
       }
-      return query.toString();
+      if (partColMap.keySet().size() > 1) {
+        return getUnionQuery(query.toString());
+      } else {
+        return query.toString();
+      }
     } else {
       return toHQL(null);
     }

Modified: hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/processors/TestCubeDriver.java
URL: http://svn.apache.org/viewvc/hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/processors/TestCubeDriver.java?rev=1490611&r1=1490610&r2=1490611&view=diff
==============================================================================
--- hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/processors/TestCubeDriver.java (original)
+++ hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/processors/TestCubeDriver.java Fri Jun  7 12:31:44 2013
@@ -131,7 +131,15 @@ public class TestCubeDriver {
       }
       i++;
     }
-    return expected.toString();
+    if (numTabs > 1) {
+      String query = "select * from (" + expected.toString() + ")" + cubeName;
+      if (postWhereExpr != null) {
+        query += " " + postWhereExpr;
+      }
+      return query;
+    } else {
+      return expected.toString();
+    }
   }
 
   public String getExpectedQuery(String cubeName, String selExpr,
@@ -171,7 +179,15 @@ public class TestCubeDriver {
       }
       i++;
     }
-    return expected.toString();
+    if (numTabs > 1) {
+      String query = "select * from (" + expected.toString() + ")" + cubeName;
+      if (postWhereExpr != null) {
+        query += " " + postWhereExpr;
+      }
+      return query;
+    } else {
+      return expected.toString();
+    }
   }
 
   private Map<String, String> getWhereForDailyAndHourly2days(String cubeName,
@@ -280,10 +296,12 @@ public class TestCubeDriver {
   }
 
   private void compareQueries(String expected, String actual) {
+    System.out.println("Expected:" + expected);
     expected = expected.replaceAll("\\W", "");
     actual = actual.replaceAll("\\W", "");
     Assert.assertTrue(expected.equalsIgnoreCase(actual));
   }
+
   @Test
   public void testCubeWhereQuery() throws Exception {
     String hqlQuery = driver.compileCubeQuery("select SUM(msr2) from testCube" +