Repository: lens
Updated Branches:
  refs/heads/master 9ef7ce736 -> d9884ec6d


http://git-wip-us.apache.org/repos/asf/lens/blob/2cfb7b09/lens-cube/src/test/java/org/apache/lens/cube/parse/TestAggregateResolver.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestAggregateResolver.java 
b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestAggregateResolver.java
index 35234a1..dd0b6dc 100644
--- 
a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestAggregateResolver.java
+++ 
b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestAggregateResolver.java
@@ -81,14 +81,14 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     // pass
     String q7 =
       "SELECT cityid, sum(testCube.msr2) from testCube where " + TWO_DAYS_RANGE
-        + " having (testCube.msr2 > 100) OR (testcube.msr2 < 100" + " AND 
max(testcube.msr3) > 1000)";
+        + " having (testCube.msr2 > 100) OR (testcube.msr2 < 100 AND 
max(testcube.msr3) > 1000)";
 
     // pass
-    String q8 = "SELECT cityid, sum(testCube.msr2) * max(testCube.msr3) from" 
+ " testCube where " + TWO_DAYS_RANGE;
+    String q8 = "SELECT cityid, sum(testCube.msr2) * max(testCube.msr3) from 
testCube where " + TWO_DAYS_RANGE;
 
     // pass
     String q9 =
-      "SELECT cityid c1, max(msr3) m3 from testCube where " + "c1 > 100 and " 
+ TWO_DAYS_RANGE + " having (msr2 < 100"
+      "SELECT cityid c1, max(msr3) m3 from testCube where c1 > 100 and " + 
TWO_DAYS_RANGE + " having (msr2 < 100"
         + " AND m3 > 1000)";
 
     String q10 = "SELECT cityid, round(testCube.msr2) from testCube where " + 
TWO_DAYS_RANGE;
@@ -97,39 +97,39 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     String q11 = "SELECT cityid from testCube where " + TWO_DAYS_RANGE + " 
having (testCube.msr2 > 100)";
 
     String expectedq1 =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
         "group by testcube.cityid", getWhereForDailyAndHourly2days(cubeName, 
"C2_testfact"));
     String expectedq2 =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) * max(testCube.msr3) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) * 
max(testCube.msr3) from ", null,
         "group by testcube.cityid", getWhereForDailyAndHourly2days(cubeName, 
"C2_testfact"));
     String expectedq3 =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
         "group by testcube.cityid", getWhereForDailyAndHourly2days(cubeName, 
"C2_testfact"));
     String expectedq4 =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
         "group by testcube.cityid having" + " sum(testCube.msr2) > 100",
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     String expectedq5 =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
         "group by testcube.cityid having" + " sum(testCube.msr2) + 
max(testCube.msr3) > 100",
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     String expectedq6 =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
         "group by testcube.cityid having" + " sum(testCube.msr2) > 100 and 
sum(testCube.msr2) < 1000",
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     String expectedq7 =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
         "group by testcube.cityid having" + " sum(testCube.msr2) > 100 OR 
(sum(testCube.msr2) < 100 AND"
           + " max(testcube.msr3) > 1000)", 
getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     String expectedq8 =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) * max(testCube.msr3) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) * 
max(testCube.msr3) from ", null,
         "group by testcube.cityid", getWhereForDailyAndHourly2days(cubeName, 
"C2_testfact"));
     String expectedq9 =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid as `c1`," + " 
max(testCube.msr3) as `m3` from ", "c1 > 100",
+      getExpectedQuery(cubeName, "SELECT testcube.cityid as `c1`, 
max(testCube.msr3) as `m3` from ", "c1 > 100",
         "group by testcube.cityid" + " having sum(testCube.msr2) < 100 AND (m3 
> 1000)",
         getWhereForDailyAndHourly2days(cubeName, "c2_testfact"));
     String expectedq10 =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
round(sum(testCube.msr2)) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, 
round(sum(testCube.msr2)) from ", null,
         "group by testcube.cityid", getWhereForDailyAndHourly2days(cubeName, 
"C2_testfact"));
     String expectedq11 =
       getExpectedQuery(cubeName, "SELECT testcube.cityid from ", null,
@@ -216,7 +216,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     CandidateFact candidateFact = cubeql.getCandidateFacts().iterator().next();
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     String expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " testCube.msr2 
from ", null, null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, testCube.msr2 from 
", null, null,
         getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
     conf2.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
@@ -247,7 +247,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     cubeql = rewriteCtx(query, conf);
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
         "group by testcube.cityid", getWhereForDailyAndHourly2days(cubeName, 
"C2_testfact"));
     compareQueries(hQL, expectedQL);
 
@@ -255,7 +255,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     cubeql = rewriteCtx(query, conf);
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) as `m2` from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
as `m2` from ", null,
         "group by testcube.cityid order by m2 asc", 
getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(hQL, expectedQL);
 
@@ -263,7 +263,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     cubeql = rewriteCtx(query, conf);
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
         "group by testcube.cityid having max(testcube.msr3) > 100",
         getWhereForDailyAndHourly2days(cubeName, "C2_testfact"));
     compareQueries(hQL, expectedQL);
@@ -278,7 +278,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     CandidateFact candidateFact = cubeql.getCandidateFacts().iterator().next();
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     String expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
avg(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, avg(testCube.msr2) 
from ", null,
         "group by testcube.cityid", 
getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
 
@@ -290,7 +290,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", "testcube.msr1 < 100",
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", "testcube.msr1 < 100",
         "group by testcube.cityid", 
getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
 
@@ -301,7 +301,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " testCube.msr2 
from ", "testcube.msr2 < 100", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, testCube.msr2 from 
", "testcube.msr2 < 100", null,
         getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
 
@@ -312,8 +312,8 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
-        " group by testCube.msr1, testcube.cityid", 
getWhereForHourly2days("c1_testfact2_raw"));
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
+        " group by testCube.msr1", getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
 
     query = "SELECT cityid, sum(testCube.msr2) FROM testCube WHERE " + 
TWO_DAYS_RANGE + " group by testCube.msr3";
@@ -323,8 +323,8 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
-        " group by testCube.msr3, testcube.cityid", 
getWhereForHourly2days("c1_testfact2_raw"));
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
+        " group by testCube.msr3", getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
 
     query = "SELECT cityid, sum(testCube.msr2) FROM testCube WHERE " + 
TWO_DAYS_RANGE + " order by testCube.msr1";
@@ -334,7 +334,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
         " group by testcube.cityid order by testcube.msr1 asc", 
getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
 
@@ -345,7 +345,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
         " group by testcube.cityid order by testcube.msr3 asc", 
getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
 
@@ -356,7 +356,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT distinct testcube.cityid," + " 
round(testCube.msr2) from ", null, null,
+      getExpectedQuery(cubeName, "SELECT distinct testcube.cityid, 
round(testCube.msr2) from ", null, null,
         getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
 
@@ -379,7 +379,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
round(testCube.msr1) from ", null, null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, round(testCube.msr1) 
from ", null, null,
         getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
 
@@ -390,7 +390,7 @@ public class TestAggregateResolver extends TestQueryRewrite 
{
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT distinct testcube.cityid," + " 
round(testCube.msr1) from ", null, null,
+      getExpectedQuery(cubeName, "SELECT distinct testcube.cityid, 
round(testCube.msr1) from ", null, null,
         getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
 
@@ -412,14 +412,14 @@ public class TestAggregateResolver extends 
TestQueryRewrite {
     Assert.assertEquals("testFact2_raw".toLowerCase(), 
candidateFact.fact.getName().toLowerCase());
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr1) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr1) 
from ", null,
         "group by testcube.cityid", 
getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
     query = "SELECT cityid, sum(testCube.msr2) FROM testCube WHERE " + 
TWO_DAYS_RANGE + " having max(msr1) > 100";
     cubeql = rewriteCtx(query, conf);
     hQL = cubeql.toHQL();
     expectedQL =
-      getExpectedQuery(cubeName, "SELECT testcube.cityid," + " 
sum(testCube.msr2) from ", null,
+      getExpectedQuery(cubeName, "SELECT testcube.cityid, sum(testCube.msr2) 
from ", null,
         "group by testcube.cityid having max(testcube.msr1) > 100", 
getWhereForHourly2days("c1_testfact2_raw"));
     compareQueries(hQL, expectedQL);
   }

http://git-wip-us.apache.org/repos/asf/lens/blob/2cfb7b09/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java 
b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
index 053cad3..f6cec1b 100644
--- 
a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
+++ 
b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBaseCubeQueries.java
@@ -34,6 +34,7 @@ import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.lens.api.error.ErrorCollectionFactory;
 import org.apache.lens.cube.error.LensCubeErrorCode;
 import org.apache.lens.cube.error.NoCandidateFactAvailableException;
 import org.apache.lens.cube.metadata.TimeRange;
@@ -86,8 +87,11 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
     LensException e;
 
     e = getLensExceptionInRewrite("select msr11 + msr2 from basecube" + " 
where " + TWO_DAYS_RANGE, conf);
+    e.buildLensErrorResponse(new 
ErrorCollectionFactory().createErrorCollection(), null, "testid");
     assertEquals(e.getErrorCode(),
-        
LensCubeErrorCode.EXPRESSION_NOT_IN_ANY_FACT.getLensErrorInfo().getErrorCode());
+      LensCubeErrorCode.NO_FACT_HAS_COLUMN.getLensErrorInfo().getErrorCode());
+    assertTrue(e.getMessage().contains("msr11"), e.getMessage());
+    assertTrue(e.getMessage().contains("msr2"), e.getMessage());
     // no fact has the all the dimensions queried
     e = getLensExceptionInRewrite("select dim1, test_time_dim, msr3, msr13 
from basecube where "
       + TWO_DAYS_RANGE, conf);
@@ -728,6 +732,115 @@ public class TestBaseCubeQueries extends TestQueryRewrite 
{
         && hqlQuery.endsWith("mq2 on mq1.booleancut <=> mq2.booleancut"),
       hqlQuery);
   }
+
+  @Test
+  public void testMultiFactQueryCaseWhenExpressionWithChainField() throws 
Exception {
+    Configuration tconf = new Configuration(conf);
+    String hqlQuery =
+      rewrite("select sum(case when dim22 = 'x' then msr12 else 0 end) as 
case_expr, sum(msr1) from basecube where "
+          + TWO_DAYS_RANGE, tconf);
+    String expected1 =
+      getExpectedQuery(cubeName, "select sum(case when basecube.dim22 = 'x' 
then basecube.msr12 else 0 end) as "
+          + "`expr1` FROM ", null, null, getWhereForHourly2days(cubeName, 
"C1_testfact2_raw_base"));
+    String expected2 =
+      getExpectedQuery(cubeName, "select sum(basecube.msr1) as `expr2` FROM ", 
null, null,
+        getWhereForHourly2days(cubeName, "c1_testfact1_raw_base"));
+    compareContains(expected1, hqlQuery);
+    compareContains(expected2, hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith("select mq2.expr1 
`case_expr`, mq1.expr2 `sum(msr1)` from ")
+      || hqlQuery.toLowerCase().startsWith("select mq1.expr1 `case_expr`, 
mq2.expr2 `sum(msr1)` from "), hqlQuery);
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2"), hqlQuery);
+  }
+
+  @Test
+  public void testMultiFactQueryCaseWhenExpression() throws Exception {
+    Configuration tconf = new Configuration(conf);
+    String hqlQuery =
+      rewrite("select sum(case when dim13 = 'x' then msr12 else 0 end) as 
case_expr, sum(msr1) from basecube where "
+        + TWO_DAYS_RANGE, tconf);
+    String expected1 =
+      getExpectedQuery(cubeName, "select sum(case when basecube.dim13 = 'x' 
then basecube.msr12 else 0 end) as "
+        + "`expr1` FROM ", null, null, getWhereForHourly2days(cubeName, 
"C1_testfact2_raw_base"));
+    String expected2 =
+      getExpectedQuery(cubeName, "select sum(basecube.msr1) as `expr2` FROM ", 
null, null,
+        getWhereForHourly2days(cubeName, "c1_testfact1_raw_base"));
+    compareContains(expected1, hqlQuery);
+    compareContains(expected2, hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith("select mq2.expr1 
`case_expr`, mq1.expr2 `sum(msr1)` from ")
+      || hqlQuery.toLowerCase().startsWith("select mq1.expr1 `case_expr`, 
mq2.expr2 `sum(msr1)` from "), hqlQuery);
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2"), hqlQuery);
+  }
+
+  @Test
+  public void testMultiFactQueryCaseWhenExpressionWithGroupby() throws 
Exception {
+    Configuration tconf = new Configuration(conf);
+    String hqlQuery =
+      rewrite("select dim1, sum(case when dim13 = 'x' then msr12 else 0 end) 
as case_expr, sum(msr1) from basecube "
+        + "where " + TWO_DAYS_RANGE, tconf);
+    String expected1 =
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, sum(case 
when basecube.dim13 = 'x' then basecube"
+          + ".msr12 else 0 end) as `expr2` FROM ", null, " group by 
basecube.dim1 ",
+        getWhereForHourly2days(cubeName, "C1_testfact2_raw_base"));
+    String expected2 =
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, 
sum(basecube.msr1) as `expr3` FROM ", null,
+        " group by basecube.dim1 ", getWhereForHourly2days(cubeName, 
"c1_testfact1_raw_base"));
+    compareContains(expected1, hqlQuery);
+    compareContains(expected2, hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith(
+      "select coalesce(mq1.dim1, mq2.dim1) dim1, mq2.expr2 `case_expr`, 
mq1.expr3 `sum(msr1)` from ")
+      || hqlQuery.toLowerCase().startsWith(
+        "select coalesce(mq1.dim1, mq2.dim1) dim1, mq1.expr2 `case_expr`, 
mq2.expr3 `sum(msr1)` from "), hqlQuery);
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.dim1 <=> mq2.dim1"),
+      hqlQuery);
+  }
+
+  @Test
+  public void testMultiFactQueryCaseWhenExpressionWithHavingClause() throws 
Exception {
+    Configuration tconf = new Configuration(conf);
+    String hqlQuery =
+      rewrite("select sum(case when dim13 = 'x' then msr12 else 0 end) as 
case_expr, sum(msr1) from basecube "
+        + "where "
+        + TWO_DAYS_RANGE + " having sum(case when dim13 = 'x' then msr12 else 
0 end) > 100 and sum(msr1) > 500", tconf);
+    String expected1 =
+      getExpectedQuery(cubeName, "select sum(case when basecube.dim13 = 'x' 
then basecube.msr12 else 0 end) as "
+        + "`expr1` FROM ", null, " having sum(case when basecube.dim13 = 'x' 
then basecube.msr12 else 0 end) > 100",
+        getWhereForHourly2days(cubeName, "C1_testfact2_raw_base"));
+    String expected2 =
+      getExpectedQuery(cubeName, "select sum(basecube.msr1) as `expr2` FROM ", 
null, " having sum(basecube.msr1) > 500",
+        getWhereForHourly2days(cubeName, "c1_testfact1_raw_base"));
+    compareContains(expected1, hqlQuery);
+    compareContains(expected2, hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith("select mq2.expr1 
`case_expr`, mq1.expr2 `sum(msr1)` from ")
+      || hqlQuery.toLowerCase().startsWith("select mq1.expr1 `case_expr`, 
mq2.expr2 `sum(msr1)` from "), hqlQuery);
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2"), hqlQuery);
+  }
+
+  @Test
+  public void testMultiFactQueryCaseWhenExpressionWithGroubyAndHavingClause() 
throws Exception {
+    Configuration tconf = new Configuration(conf);
+    String hqlQuery =
+      rewrite("select dim1, sum(case when dim13 = 'x' then msr12 else 0 end) 
as case_expr, sum(msr1) from basecube "
+        + "where "
+        + TWO_DAYS_RANGE + " having sum(case when dim13 = 'x' then msr12 else 
0 end) > 100 and sum(msr1) > 500", tconf);
+    String expected1 =
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, sum(case 
when basecube.dim13 = 'x' then basecube"
+          + ".msr12 else  0 end) as `expr2` FROM ", null,
+        " group by basecube.dim1 having sum(case when basecube.dim13 = 'x' 
then basecube.msr12 else 0 end) > 100",
+        getWhereForHourly2days(cubeName, "C1_testfact2_raw_base"));
+    String expected2 =
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, 
sum(basecube.msr1) as `expr3` FROM ", null,
+        " group by basecube.dim1 having sum(basecube.msr1) > 500",
+        getWhereForHourly2days(cubeName, "c1_testfact1_raw_base"));
+    compareContains(expected1, hqlQuery);
+    compareContains(expected2, hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith(
+      "select coalesce(mq1.dim1, mq2.dim1) dim1, mq2.expr2 `case_expr`, 
mq1.expr3 `sum(msr1)` from ")
+      || hqlQuery.toLowerCase().startsWith(
+        "select coalesce(mq1.dim1, mq2.dim1) dim1, mq1.expr2 `case_expr`, 
mq2.expr3 `sum(msr1)` from "), hqlQuery);
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.dim1 <=> mq2.dim1"),
+      hqlQuery);
+  }
+
   @Test
   public void testFallbackPartCol() throws Exception {
     Configuration conf = getConfWithStorages("C1");

Reply via email to