Repository: lens
Updated Branches:
  refs/heads/master 6e11d780f -> 3b3f42da5


LENS-730 : Fix issues with column aliases in multifact query


Project: http://git-wip-us.apache.org/repos/asf/lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/3b3f42da
Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/3b3f42da
Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/3b3f42da

Branch: refs/heads/master
Commit: 3b3f42da51808e1bb0d23357e1bfaecaca978896
Parents: 6e11d78
Author: Amareshwari Sriramadasu <amareshw...@apache.org>
Authored: Wed Apr 27 09:52:06 2016 +0530
Committer: Amareshwari Sriramadasu <amareshw...@apache.org>
Committed: Wed Apr 27 09:52:06 2016 +0530

----------------------------------------------------------------------
 .../lens/cube/parse/AggregateResolver.java      |   4 +-
 .../apache/lens/cube/parse/ColumnResolver.java  |  44 +++--
 .../lens/cube/parse/ExpressionResolver.java     |   2 +-
 .../apache/lens/cube/parse/CubeTestSetup.java   |   5 +
 .../lens/cube/parse/TestBaseCubeQueries.java    | 165 ++++++++++++++++---
 .../lens/cube/parse/TestBridgeTableQueries.java |  46 +++---
 .../lens/cube/parse/TestCubeRewriter.java       |  10 +-
 .../lens/cube/parse/TestExpressionResolver.java |  12 +-
 8 files changed, 210 insertions(+), 78 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lens/blob/3b3f42da/lens-cube/src/main/java/org/apache/lens/cube/parse/AggregateResolver.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/AggregateResolver.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/AggregateResolver.java
index fd7036a..1593a54 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/AggregateResolver.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/AggregateResolver.java
@@ -170,8 +170,8 @@ class AggregateResolver implements ContextRewriter {
       ASTNode tabident = HQLParser.findNodeByPath(node, TOK_TABLE_OR_COL, 
Identifier);
       ASTNode colIdent = (ASTNode) node.getChild(1);
 
-      colname = colIdent.getText();
-      tabname = tabident.getText();
+      colname = colIdent.getText().toLowerCase();
+      tabname = tabident.getText().toLowerCase();
     }
 
     String msrname = StringUtils.isBlank(tabname) ? colname : tabname + "." + 
colname;

http://git-wip-us.apache.org/repos/asf/lens/blob/3b3f42da/lens-cube/src/main/java/org/apache/lens/cube/parse/ColumnResolver.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/ColumnResolver.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/ColumnResolver.java
index 75aa3f4..58a1d4d 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/ColumnResolver.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/ColumnResolver.java
@@ -61,10 +61,10 @@ class ColumnResolver implements ContextRewriter {
     }
     getColsForSelectTree(cubeql);
     getColsForWhereTree(cubeql);
-    getColsForTree(cubeql, cubeql.getJoinAST(), cubeql);
-    getColsForTree(cubeql, cubeql.getGroupByAST(), cubeql);
-    getColsForTree(cubeql, cubeql.getHavingAST(), cubeql);
-    getColsForTree(cubeql, cubeql.getOrderByAST(), cubeql);
+    getColsForTree(cubeql, cubeql.getJoinAST(), cubeql, true);
+    getColsForTree(cubeql, cubeql.getGroupByAST(), cubeql, true);
+    getColsForTree(cubeql, cubeql.getHavingAST(), cubeql, true);
+    getColsForTree(cubeql, cubeql.getOrderByAST(), cubeql, true);
 
     // Update join dimension tables
     for (String table : cubeql.getTblAliasToColumns().keySet()) {
@@ -77,7 +77,8 @@ class ColumnResolver implements ContextRewriter {
   }
 
   // finds columns in AST passed.
-  static void getColsForTree(final CubeQueryContext cubeql, ASTNode tree, 
final TrackQueriedColumns tqc)
+  static void getColsForTree(final CubeQueryContext cubeql, ASTNode tree, 
final TrackQueriedColumns tqc,
+    final boolean skipAliases)
     throws LensException {
     if (tree == null) {
       return;
@@ -98,7 +99,7 @@ class ColumnResolver implements ContextRewriter {
           // Take child ident.totext
           ASTNode ident = (ASTNode) node.getChild(0);
           String column = ident.getText().toLowerCase();
-          if (cubeql.getExprToAliasMap().values().contains(column)) {
+          if (skipAliases && 
cubeql.getExprToAliasMap().values().contains(column)) {
             // column is an existing alias
             return;
           }
@@ -137,18 +138,12 @@ class ColumnResolver implements ContextRewriter {
   // Updates alias for each selected expression.
   // Alias is updated as follows:
   // Case 1: If select expression does not have an alias
-  // ** And the expression has only one column queried, the column name is put
-  // as
-  // select alias.
-  // ** If the expression has more than one column queried, the alias is
-  // constructed as
-  // 'expr' + index of the expression.
+  // ** And the expression is the column queried, the column name is put as 
select alias.
+  // ** If the expression is not just simple column queried, the alias is
+  // constructed as 'expr' + index of the expression.
   // Case 2: If select expression already has alias
   // ** Adds it to exprToAlias map
-  // ** and the alias does not have spaces, the select alias and final alias is
-  // same.
-  // ** If alias has spaces, select alias is constructed as 'expr' + index of
-  // the expression
+  // ** and the alias is constructed as 'expr' + index of the expression.
   // and user given alias is the final alias of the expression.
   private static final String SELECT_ALIAS_PREFIX = "expr";
 
@@ -156,24 +151,23 @@ class ColumnResolver implements ContextRewriter {
     int exprInd = 1;
     for (int i = 0; i < cubeql.getSelectAST().getChildCount(); i++) {
       ASTNode selectExpr = (ASTNode) cubeql.getSelectAST().getChild(i);
-      Set<String> cols = new HashSet<String>();
+      ASTNode selectExprChild = (ASTNode)selectExpr.getChild(0);
+      Set<String> cols = new HashSet<>();
       addColumnsForSelectExpr(cubeql, selectExpr, cubeql.getSelectAST(), cols);
       ASTNode alias = HQLParser.findNodeByPath(selectExpr, Identifier);
       String selectAlias;
       String selectFinalAlias = null;
       if (alias != null) {
         cubeql.addExprToAlias(selectExpr, alias);
-        if (HQLParser.hasSpaces(alias.getText())) {
-          selectFinalAlias = alias.getText();
-          selectAlias = SELECT_ALIAS_PREFIX + exprInd;
-        } else {
-          selectAlias = alias.getText().trim();
-        }
-      } else if (cols.size() == 1) {
-        // add the column name as alias
+        selectFinalAlias = alias.getText();
+        selectAlias = SELECT_ALIAS_PREFIX + exprInd;
+      } else if (cols.size() == 1 && (selectExprChild.getToken().getType() == 
TOK_TABLE_OR_COL
+        || selectExprChild.getToken().getType() == DOT)) {
+        // select expression is same as the column
         selectAlias = cols.iterator().next().toLowerCase();
       } else {
         selectAlias = SELECT_ALIAS_PREFIX + exprInd;
+        selectFinalAlias = HQLParser.getString(selectExprChild);
       }
       exprInd++;
       cubeql.addSelectAlias(selectAlias, selectFinalAlias);

http://git-wip-us.apache.org/repos/asf/lens/blob/3b3f42da/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java 
b/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java
index 04c3c45..c3d15d0 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java
@@ -238,7 +238,7 @@ class ExpressionResolver implements ContextRewriter {
 
     void resolveColumns(CubeQueryContext cubeql) throws LensException {
       // finds all columns and table aliases in the expression
-      ColumnResolver.getColsForTree(cubeql, finalAST, this);
+      ColumnResolver.getColsForTree(cubeql, finalAST, this, false);
     }
 
     Date getStartTime() {

http://git-wip-us.apache.org/repos/asf/lens/blob/3b3f42da/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java 
b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
index 379e873..73e6221 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
@@ -948,6 +948,8 @@ public class CubeTestSetup {
       null));
     cubeMeasures2.add(new ColumnMeasure(new FieldSchema("msr14", "bigint", 
"fourth measure"), "Measure4", null,
       "COUNT", null));
+    cubeMeasures2.add(new ColumnMeasure(new FieldSchema("directMsr", "bigint", 
"fifth measure"), "Direct Measure",
+      null, "SUM", null));
 
     cubeDimensions2.add(new BaseDimAttribute(new FieldSchema("dim11", 
"string", "basedim")));
     cubeDimensions2.add(new ReferencedDimAttribute(new FieldSchema("dim12", 
"int", "ref dim"), "Dim2 refer",
@@ -1149,6 +1151,8 @@ public class CubeTestSetup {
       "user sports", "substr(sports, 3)"));
     baseExprs.add(new ExprColumn(new FieldSchema("sportids_abbr", 
"array<string>", ""),
       "user sports", "case when sportids == 1 then 'CKT' when sportids == 2 
then 'FTB' else 'NON' end"));
+    baseExprs.add(new ExprColumn(new FieldSchema("directMsrExpr", "bigint", 
""),
+      "Direct Measure", new ExprSpec("directMsr + 0", null, null), new 
ExprSpec("msr13 + msr14", null, null)));
     client.createCube(BASE_CUBE_NAME, cubeMeasures2, cubeDimensions2, 
baseExprs, joinChains, cubeProperties);
 
     Map<String, String> derivedProperties = new HashMap<>();
@@ -1167,6 +1171,7 @@ public class CubeTestSetup {
     measures.add("msr12");
     measures.add("msr13");
     measures.add("msr14");
+    measures.add("directmsr");
     dimensions = new HashSet<>();
     dimensions.add("cityid");
     dimensions.add("stateid");

http://git-wip-us.apache.org/repos/asf/lens/blob/3b3f42da/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 fec5d51..fcf975e 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
@@ -384,19 +384,137 @@ public class TestBaseCubeQueries extends 
TestQueryRewrite {
     String hqlQuery =
       rewrite("select dim1 d1, msr12 `my msr12`, roundedmsr2 m2 from basecube 
where " + TWO_DAYS_RANGE, conf);
     String expected1 =
-      getExpectedQuery(cubeName, "select basecube.dim1 as `d1`, 
sum(basecube.msr12) as `expr2` FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `expr1`, 
sum(basecube.msr12) as `expr2` FROM ", null,
         " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, 
"C1_testFact2_BASE"));
     String expected2 =
-      getExpectedQuery(cubeName, "select basecube.dim1 as `d1`, 
round(sum(basecube.msr2)/1000) as `m2` FROM ", null,
-        " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, 
"C1_testFact1_BASE"));
+      getExpectedQuery(cubeName, "select basecube.dim1 as `expr1`, 
round(sum(basecube.msr2)/1000) as `expr3` FROM ",
+        null, " group by basecube.dim1", 
getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
+    compareContains(expected1, hqlQuery);
+    compareContains(expected2, hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith(
+      "select coalesce(mq1.expr1, mq2.expr1) `d1`, mq2.expr2 `my msr12`, 
mq1.expr3 `m2` from ")
+      || hqlQuery.toLowerCase().startsWith(
+        "select coalesce(mq1.expr1, mq2.expr1) `d1`, mq1.expr2 `my msr12`, 
mq2.expr3 `m2` from "), hqlQuery);
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.expr1 <=> mq2.expr1"),
+      hqlQuery);
+  }
+
+  @Test
+  public void testMultiFactQueryWithColumnAliasesAsFunctions() throws 
Exception {
+    String hqlQuery =
+      rewrite("select dim1 d1, msr12 `sum(msr12)`, roundedmsr2 as 
`round(sum(msr2)/1000)` from basecube where "
+        + TWO_DAYS_RANGE, conf);
+    String expected1 =
+      getExpectedQuery(cubeName, "select basecube.dim1 as `expr1`, 
sum(basecube.msr12) as `expr2` FROM ", null,
+        " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, 
"C1_testFact2_BASE"));
+    String expected2 =
+      getExpectedQuery(cubeName, "select basecube.dim1 as `expr1`, 
round(sum(basecube.msr2)/1000) as `expr3` FROM ",
+        null, " group by basecube.dim1", 
getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
+    compareContains(expected1, hqlQuery);
+    compareContains(expected2, hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith(
+        "select coalesce(mq1.expr1, mq2.expr1) `d1`, mq2.expr2 `sum(msr12)`, 
mq1.expr3 `round(sum(msr2)/1000)` from ")
+        || hqlQuery.toLowerCase().startsWith(
+        "select coalesce(mq1.expr1, mq2.expr1) `d1`, mq1.expr2 `sum(msr12)`, 
mq2.expr3 `round(sum(msr2)/1000)` from "),
+      hqlQuery);
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.expr1 <=> mq2.expr1"),
+      hqlQuery);
+  }
+
+  @Test
+  public void testMultiFactQueryWithAliasAsColumnName() throws Exception {
+    String hqlQuery =
+      rewrite("select dim1 d1, msr12 `my msr12`, roundedmsr2 as `msr2` from 
basecube where " + TWO_DAYS_RANGE, conf);
+
+    String expected1 =
+      getExpectedQuery(cubeName, "select basecube.dim1 as `expr1`, 
sum(basecube.msr12) as `expr2` FROM ", null,
+        " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, 
"C1_testFact2_BASE"));
+    String expected2 =
+      getExpectedQuery(cubeName, "select basecube.dim1 as `expr1`, 
round(sum(basecube.msr2)/1000) as `expr3` FROM ",
+        null, " group by basecube.dim1", 
getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
     compareContains(expected1, hqlQuery);
     compareContains(expected2, hqlQuery);
     assertTrue(hqlQuery.toLowerCase().startsWith(
-      "select coalesce(mq1.d1, mq2.d1) d1, mq2.expr2 `my msr12`, mq1.m2 m2 
from ")
-      ||
-      hqlQuery.toLowerCase().startsWith("select coalesce(mq1.d1, mq2.d1) d1, 
mq1.expr2 `my msr12`, mq2.m2 m2 from "),
+        "select coalesce(mq1.expr1, mq2.expr1) `d1`, mq2.expr2 `my msr12`, 
mq1.expr3 `msr2` from ")
+        || hqlQuery.toLowerCase().startsWith(
+        "select coalesce(mq1.expr1, mq2.expr1) `d1`, mq1.expr2 `my msr12`, 
mq2.expr3 `msr2` from "),
+      hqlQuery);
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.expr1 <=> mq2.expr1"),
+      hqlQuery);
+  }
+
+  @Test
+  public void testMultiFactQueryWithAliasAsExpressionName() throws Exception {
+    String hqlQuery =
+      rewrite("select dim1 d1, msr12 `my msr12`, roundedmsr2 as `roundedmsr2` 
from basecube where " + TWO_DAYS_RANGE,
+        conf);
+
+    String expected1 =
+      getExpectedQuery(cubeName, "select basecube.dim1 as `expr1`, 
sum(basecube.msr12) as `expr2` FROM ", null,
+        " group by basecube.dim1", getWhereForDailyAndHourly2days(cubeName, 
"C1_testFact2_BASE"));
+    String expected2 =
+      getExpectedQuery(cubeName, "select basecube.dim1 as `expr1`, 
round(sum(basecube.msr2)/1000) as `expr3` FROM ",
+        null, " group by basecube.dim1", 
getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
+    compareContains(expected1, hqlQuery);
+    compareContains(expected2, hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith(
+        "select coalesce(mq1.expr1, mq2.expr1) `d1`, mq2.expr2 `my msr12`, 
mq1.expr3 `roundedmsr2` from ")
+        || hqlQuery.toLowerCase().startsWith(
+        "select coalesce(mq1.expr1, mq2.expr1) `d1`, mq1.expr2 `my msr12`, 
mq2.expr3 `roundedmsr2` from "),
+      hqlQuery);
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.expr1 <=> mq2.expr1"),
+      hqlQuery);
+  }
+
+  @Test
+  public void testMultiFactQueryWithExprOnDimsWithoutAliases() throws 
Exception {
+    String hqlQuery =
+      rewrite("select func1(dim1), func2(dim1), msr12, roundedmsr2 from 
basecube where " + TWO_DAYS_RANGE, conf);
+    String expected1 =
+      getExpectedQuery(cubeName, "select func1(basecube.dim1) as `expr1`, 
func2(basecube.dim1)  as `expr2`,"
+        + " sum(basecube.msr12) as `msr12` FROM ", null,
+        " group by func1(basecube.dim1), func2(basecube.dim1)",
+        getWhereForDailyAndHourly2days(cubeName, "C1_testFact2_BASE"));
+    String expected2 =
+      getExpectedQuery(cubeName, "select func1(basecube.dim1) as `expr1`, 
func2(basecube.dim1)  as `expr2`,"
+        + " round(sum(basecube.msr2)/1000) as `roundedmsr2` FROM ", null,
+        " group by func1(basecube.dim1), func2(basecube.dim1)",
+        getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
+    compareContains(expected1, hqlQuery);
+    compareContains(expected2, hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith("select coalesce(mq1.expr1, 
mq2.expr1) `func1( dim1 )`,"
+      + " coalesce(mq1.expr2, mq2.expr2) `func2( dim1 )`, mq2.msr12 msr12, 
mq1.roundedmsr2 roundedmsr2 from ")
+      || hqlQuery.toLowerCase().startsWith("select coalesce(mq1.expr1, 
mq2.expr1) `func1( dim1 )`,"
+        + " coalesce(mq1.expr2, mq2.expr2) `func2( dim1 )`, mq1.msr12 msr12, 
mq2.roundedmsr2 roundedmsr2 from "),
+      hqlQuery);
+    assertTrue(hqlQuery.contains("mq1 full outer join ")
+      && hqlQuery.endsWith("mq2 on mq1.expr1 <=> mq2.expr1 AND mq1.expr2 <=> 
mq2.expr2"), hqlQuery);
+  }
+
+  @Test
+  public void testMultiFactQueryWithDirectMsr() throws Exception {
+    String hqlQuery =
+      rewrite("select func1(dim1), directMsrExpr as directMsr, roundedmsr2 
from basecube where " + TWO_DAYS_RANGE,
+        conf);
+    String expected1 =
+      getExpectedQuery(cubeName, "select func1(basecube.dim1) as `expr1`, 
max(basecube.msr13) + count(basecube . msr14)"
+        + " as `expr2` FROM ", null,
+        " group by func1(basecube.dim1)", 
getWhereForDailyAndHourly2days(cubeName, "C1_testFact3_BASE"));
+    String expected2 =
+      getExpectedQuery(cubeName, "select func1(basecube.dim1) as expr1, 
round(sum(basecube.msr2)/1000) as `roundedmsr2`"
+        + " FROM ", null, " group by func1(basecube.dim1)",
+        getWhereForDailyAndHourly2days(cubeName, "C1_testFact1_BASE"));
+    compareContains(expected1, hqlQuery);
+    compareContains(expected2, hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith(
+      "select coalesce(mq1.expr1, mq2.expr1) `func1( dim1 )`, mq2.expr2 
`directmsr`, mq1.roundedmsr2 roundedmsr2 "
+        + "from ")
+      || hqlQuery.toLowerCase().startsWith(
+        "select coalesce(mq1.expr1, mq2.expr1) `func1( dim1 )`, mq1.expr2 
`directmsr`, mq2.roundedmsr2 roundedmsr2 "
+          + "from "),
+      hqlQuery.toLowerCase());
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.expr1 <=> mq2.expr1"),
       hqlQuery);
-    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.d1 <=> mq2.d1"), hqlQuery);
   }
 
   @Test
@@ -404,17 +522,17 @@ public class TestBaseCubeQueries extends TestQueryRewrite 
{
    // query with non default aggregate
     String hqlQuery = rewrite("select dim1, avg(msr12), avg(msr2) from 
basecube where " + TWO_DAYS_RANGE, conf);
     String expected1 =
-      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, 
avg(basecube.msr12) as `msr12` FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, 
avg(basecube.msr12) as `expr2` FROM ", null,
         " group by basecube.dim1", getWhereForHourly2days(cubeName, 
"C1_testfact2_raw_base"));
     String expected2 =
-      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, 
avg(basecube.msr2)) as `msr2` FROM ", null,
+      getExpectedQuery(cubeName, "select basecube.dim1 as `dim1`, 
avg(basecube.msr2)) 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.msr12 msr12, mq1.msr2 
msr2 from ")
+      "select coalesce(mq1.dim1, mq2.dim1) dim1, mq2.expr2 `avg( msr12 )`, 
mq1.expr3 `avg( msr2 )` from ")
       || hqlQuery.toLowerCase().startsWith(
-        "select coalesce(mq1.dim1, mq2.dim1) dim1, mq1.msr12 msr12, mq2.msr2 
msr2 from "), hqlQuery);
+        "select coalesce(mq1.dim1, mq2.dim1) dim1, mq1.expr2 `avg( msr12 )`, 
mq2.expr3 `avg( msr2 )` from "), hqlQuery);
 
     assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.dim1 <=> mq2.dim1"),
       hqlQuery);
@@ -500,17 +618,15 @@ public class TestBaseCubeQueries extends TestQueryRewrite 
{
         getWhereForHourly2days(cubeName, "C1_testfact3_raw_base"));
     String expected2 =
       getExpectedQuery(cubeName, "select basecube.dim1 != 'x' AND 
basecube.dim2 != 10 as `booleancut`,"
-          + " round(sum(basecube.msr2)/1000) as `msr2` FROM ", null,
+          + " round(sum(basecube.msr2)/1000) as `expr2` FROM ", null,
         " group by basecube.dim1 != 'x' AND basecube.dim2 != 10",
         getWhereForHourly2days(cubeName, "C1_testfact1_raw_base"));
     compareContains(expected1, hqlQuery);
     compareContains(expected2, hqlQuery);
-    assertTrue(hqlQuery.toLowerCase()
-      .startsWith("select coalesce(mq1.booleancut, mq2.booleancut) booleancut, 
mq2.msr2 msr2,"
-        + " mq1.expr3 expr3 from ")
-      || hqlQuery.toLowerCase()
-        .startsWith("select coalesce(mq1.booleancut, mq2.booleancut) 
booleancut, mq1.msr2 msr2,"
-          + " mq2.expr3 expr3 from "), hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith("select 
coalesce(mq1.booleancut, mq2.booleancut) booleancut, "
+      + "mq2.expr2 `round((sum( msr2 ) / 1000 ))`, mq1.expr3 `avg(( msr13 + 
msr14 ))` from ")
+      || hqlQuery.toLowerCase().startsWith("select coalesce(mq1.booleancut, 
mq2.booleancut) booleancut, "
+        + "mq1.expr2 `round((sum( msr2 ) / 1000 ))`, mq2.expr3 `avg(( msr13 + 
msr14 ))` from "), hqlQuery);
     assertTrue(hqlQuery.contains("mq1 full outer join ")
       && hqlQuery.endsWith("mq2 on mq1.booleancut <=> mq2.booleancut"),
       hqlQuery);
@@ -533,17 +649,16 @@ public class TestBaseCubeQueries extends TestQueryRewrite 
{
         getWhereForHourly2days(cubeName, "C1_testfact3_raw_base"));
     String expected2 =
       getExpectedQuery(cubeName, "select basecube.dim1 != 'x' AND 
basecube.dim2 != 10 as `booleancut`,"
-          + " round(sum(basecube.msr2)/1000) as `msr2` FROM ", "(basecube.dim1 
!= 'x' AND basecube.dim2 != 10) == true",
+          + " round(sum(basecube.msr2)/1000) as `expr2` FROM ",
+        "(basecube.dim1 != 'x' AND basecube.dim2 != 10) == true",
         " group by basecube.dim1 != 'x' AND basecube.dim2 != 10",
         getWhereForHourly2days(cubeName, "C1_testfact1_raw_base"));
     compareContains(expected1, hqlQuery);
     compareContains(expected2, hqlQuery);
-    assertTrue(hqlQuery.toLowerCase()
-      .startsWith("select coalesce(mq1.booleancut, mq2.booleancut) booleancut, 
mq2.msr2 msr2,"
-        + " mq1.expr3 expr3 from ")
-      || hqlQuery.toLowerCase()
-        .startsWith("select coalesce(mq1.booleancut, mq2.booleancut) 
booleancut, mq1.msr2 msr2,"
-          + " mq2.expr3 expr3 from "), hqlQuery);
+    assertTrue(hqlQuery.toLowerCase().startsWith("select 
coalesce(mq1.booleancut, mq2.booleancut) booleancut, "
+      + "mq2.expr2 `round((sum( msr2 ) / 1000 ))`, mq1.expr3 `avg(( msr13 + 
msr14 ))` from ")
+      || hqlQuery.toLowerCase().startsWith("select coalesce(mq1.booleancut, 
mq2.booleancut) booleancut, "
+        + "mq1.expr2 `round((sum( msr2 ) / 1000 ))`, mq2.expr3 `avg(( msr13 + 
msr14 ))` from "), hqlQuery);
     assertTrue(hqlQuery.contains("mq1 full outer join ")
         && hqlQuery.endsWith("mq2 on mq1.booleancut <=> mq2.booleancut"),
       hqlQuery);

http://git-wip-us.apache.org/repos/asf/lens/blob/3b3f42da/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java
 
b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java
index e8905c1..b89ed2c 100644
--- 
a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java
+++ 
b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java
@@ -150,7 +150,7 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
 
   @Test
   public void testBridgeTablesWithMultipleFacts() throws Exception {
-    String query = "select usersports.name, sum(msr2), sum(msr12) from 
basecube where " + TWO_DAYS_RANGE;
+    String query = "select usersports.name, msr2, msr12 from basecube where " 
+ TWO_DAYS_RANGE;
     String hqlQuery = rewrite(query, hConf);
     String expected1 = getExpectedQuery("basecube",
         "select usersports.balias0 as `name`, sum(basecube.msr2) as `msr2` 
FROM ", " join " + getDbName()
@@ -180,7 +180,7 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
       hqlQuery);
 
     // run with chain ref column
-    query = "select sports, sum(msr2), sum(msr12) from basecube where " + 
TWO_DAYS_RANGE;
+    query = "select sports, msr2, msr12 from basecube where " + TWO_DAYS_RANGE;
     hqlQuery = rewrite(query, hConf);
     expected1 = getExpectedQuery("basecube",
       "select usersports.balias0 as `sports`, sum(basecube.msr2) as `msr2` 
FROM ", " join " + getDbName()
@@ -433,7 +433,7 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
 
   @Test
   public void testBridgeTablesWithMultipleFactsWithFilterBeforeFlattening() 
throws Exception {
-    String query = "select usersports.name, sum(msr2), sum(msr12) from 
basecube where " + TWO_DAYS_RANGE
+    String query = "select usersports.name, msr2, msr12 from basecube where " 
+ TWO_DAYS_RANGE
       + " and usersports.name = 'CRICKET'";
     String hqlQuery = rewrite(query, hConf);
     String expected1 = getExpectedQuery("basecube",
@@ -463,7 +463,7 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
     assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.name <=> mq2.name"),
       hqlQuery);
     // run with chain ref column
-    query = "select sports, sum(msr2), sum(msr12) from basecube where " + 
TWO_DAYS_RANGE + " and sports = 'CRICKET'";
+    query = "select sports, msr2, msr12 from basecube where " + TWO_DAYS_RANGE 
+ " and sports = 'CRICKET'";
     hqlQuery = rewrite(query, hConf);
     expected1 = getExpectedQuery("basecube",
       "select usersports.balias0 as `sports`, sum(basecube.msr2) as `msr2` 
FROM ", " join " + getDbName()
@@ -498,7 +498,7 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
   public void testBridgeTablesWithMultipleFactsWithFilterAfterFlattening() 
throws Exception {
     Configuration conf = new Configuration(hConf);
     conf.setBoolean(CubeQueryConfUtil.DO_FLATTENING_OF_BRIDGE_TABLE_EARLY, 
true);
-    String query = "select usersports.name, sum(msr2), sum(msr12) from 
basecube where " + TWO_DAYS_RANGE
+    String query = "select usersports.name, msr2, msr12 from basecube where " 
+ TWO_DAYS_RANGE
       + " and usersports.name = 'CRICKET,FOOTBALL'";
     String hqlQuery = rewrite(query, conf);
     String expected1 = getExpectedQuery("basecube",
@@ -528,7 +528,7 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
     assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.name <=> mq2.name"),
       hqlQuery);
     // run with chain ref column
-    query = "select sports, sum(msr2), sum(msr12) from basecube where " + 
TWO_DAYS_RANGE
+    query = "select sports, msr2, msr12 from basecube where " + TWO_DAYS_RANGE
       + " and sports = 'CRICKET,FOOTBALL'";
     hqlQuery = rewrite(query, conf);
     expected1 = getExpectedQuery("basecube",
@@ -658,11 +658,11 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
   }
   @Test
   public void testBridgeTablesWithMultipleFactsWithExprBeforeFlattening() 
throws Exception {
-    String query = "select substr(usersports.name, 3), sum(msr2), sum(msr12) 
from basecube where " + TWO_DAYS_RANGE
+    String query = "select substr(usersports.name, 3), msr2, msr12 from 
basecube where " + TWO_DAYS_RANGE
       + " and usersports.name in ('CRICKET', 'FOOTBALL')";
     String hqlQuery = rewrite(query, hConf);
     String expected1 = getExpectedQuery("basecube",
-      "select usersports.balias0 as `name`, sum(basecube.msr2) as `msr2` FROM 
", " join " + getDbName()
+      "select usersports.balias0 as `expr1`, sum(basecube.msr2) as `msr2` FROM 
", " join " + getDbName()
         + "c1_usertable userdim ON basecube.userid = userdim.id "
         + " join (select user_interests.user_id as user_id, 
collect_set(substr(usersports.name, 3)) as balias0, "
         + " collect_set(usersports.name) as balias1 from"
@@ -673,7 +673,7 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
         + " group by usersports.balias0", null,
       getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
     String expected2 = getExpectedQuery("basecube",
-      "select usersports.balias0 as `name`, sum(basecube.msr12) as `msr12` 
FROM ", " join " + getDbName()
+      "select usersports.balias0 as `expr1`, sum(basecube.msr12) as `msr12` 
FROM ", " join " + getDbName()
         + "c1_usertable userdim ON basecube.userid = userdim.id "
         + " join (select user_interests.user_id as user_id, 
collect_set(substr(usersports.name, 3)) as balias0, "
         + " collect_set(usersports.name) as balias1 from"
@@ -686,13 +686,16 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
     String lower = hqlQuery.toLowerCase();
-    assertTrue(lower.startsWith("select coalesce(mq1.name, mq2.name) name, 
mq2.msr2 msr2, mq1.msr12 msr12 from ")
-      || lower.startsWith("select coalesce(mq1.name, mq2.name) name, mq1.msr2 
msr2, mq2.msr12 msr12 from "), hqlQuery);
+    assertTrue(lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) 
`substr(( usersports . name ), 3 )`,"
+      + " mq2.msr2 msr2, mq1.msr12 msr12 from ")
+      || lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) `substr(( 
usersports . name ), 3 )`, mq1.msr2 msr2, "
+        + "mq2.msr12 msr12 from "),
+      hqlQuery);
 
-    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.name <=> mq2.name"),
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.expr1 <=> mq2.expr1"),
       hqlQuery);
     // run with chain ref column
-    query = "select sports_abbr, sum(msr2), sum(msr12) from basecube where " + 
TWO_DAYS_RANGE + " and sports in "
+    query = "select sports_abbr, msr2, msr12 from basecube where " + 
TWO_DAYS_RANGE + " and sports in "
       + "('CRICKET', 'FOOTBALL')";
     hqlQuery = rewrite(query, hConf);
     expected1 = getExpectedQuery("basecube",
@@ -735,11 +738,11 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
   public void testBridgeTablesWithMultipleFactsWithExprAfterFlattening() 
throws Exception {
     Configuration conf = new Configuration(hConf);
     conf.setBoolean(CubeQueryConfUtil.DO_FLATTENING_OF_BRIDGE_TABLE_EARLY, 
true);
-    String query = "select substr(usersports.name, 3), sum(msr2), sum(msr12) 
from basecube where " + TWO_DAYS_RANGE
+    String query = "select substr(usersports.name, 3), msr2, msr12 from 
basecube where " + TWO_DAYS_RANGE
       + " and usersports.name = 'CRICKET,FOOTBALL'";
     String hqlQuery = rewrite(query, conf);
     String expected1 = getExpectedQuery("basecube",
-      "select substr(usersports.name, 3) as `name`, sum(basecube.msr2) as 
`msr2` FROM ", " join " + getDbName()
+      "select substr(usersports.name, 3) as `expr1`, sum(basecube.msr2) as 
`msr2` FROM ", " join " + getDbName()
         + "c1_usertable userdim ON basecube.userid = userdim.id "
         + " join (select user_interests.user_id as 
user_id,collect_set(usersports.name) as name" + " from "
         + getDbName() + "c1_user_interests_tbl user_interests" + " join " + 
getDbName()
@@ -748,7 +751,7 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
       " and usersports.name = 'CRICKET,FOOTBALL' group by 
substr(usersports.name, 3)", null,
       getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
     String expected2 = getExpectedQuery("basecube",
-      "select substr(usersports.name, 3) as `name`, sum(basecube.msr12) as 
`msr12` FROM ", " join " + getDbName()
+      "select substr(usersports.name, 3) as `expr1`, sum(basecube.msr12) as 
`msr12` FROM ", " join " + getDbName()
         + "c1_usertable userdim ON basecube.userid = userdim.id "
         + " join (select user_interests.user_id as 
user_id,collect_set(usersports.name) as name" + " from "
         + getDbName() + "c1_user_interests_tbl user_interests" + " join " + 
getDbName()
@@ -759,13 +762,16 @@ public class TestBridgeTableQueries extends 
TestQueryRewrite {
     TestCubeRewriter.compareContains(expected1, hqlQuery);
     TestCubeRewriter.compareContains(expected2, hqlQuery);
     String lower = hqlQuery.toLowerCase();
-    assertTrue(lower.startsWith("select coalesce(mq1.name, mq2.name) name, 
mq2.msr2 msr2, mq1.msr12 msr12 from ")
-      || lower.startsWith("select coalesce(mq1.name, mq2.name) name, mq1.msr2 
msr2, mq2.msr12 msr12 from "), hqlQuery);
+    assertTrue(lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) 
`substr(( usersports . name ), 3 )`,"
+      + " mq2.msr2 msr2, mq1.msr12 msr12 from ")
+      || lower.startsWith("select coalesce(mq1.expr1, mq2.expr1) `substr(( 
usersports . name ), 3 )`, mq1.msr2 msr2,"
+        + " mq2.msr12 msr12 from "),
+      hqlQuery);
 
-    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.name <=> mq2.name"),
+    assertTrue(hqlQuery.contains("mq1 full outer join ") && 
hqlQuery.endsWith("mq2 on mq1.expr1 <=> mq2.expr1"),
       hqlQuery);
     // run with chain ref column
-    query = "select sports_abbr, sum(msr2), sum(msr12) from basecube where " + 
TWO_DAYS_RANGE + " and sports = "
+    query = "select sports_abbr, msr2, msr12 from basecube where " + 
TWO_DAYS_RANGE + " and sports = "
       + "'CRICKET,FOOTBALL'";
     hqlQuery = rewrite(query, conf);
     expected1 = getExpectedQuery("basecube",

http://git-wip-us.apache.org/repos/asf/lens/blob/3b3f42da/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java 
b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
index 6ee45d8..a223449 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java
@@ -553,13 +553,15 @@ public class TestCubeRewriter extends TestQueryRewrite {
     String whereCond = "zipcode = 'a' and cityid = 'b' and (" + 
TWO_DAYS_RANGE_SPLIT_OVER_UPDATE_PERIODS + ")";
     String hqlQuery = rewrite("select zipcode, count(msr4), sum(msr15) from 
testCube where " + whereCond, conf);
     System.out.println(hqlQuery);
-    String possibleStart1 = "SELECT COALESCE(mq1.zipcode, mq2.zipcode) 
zipcode, mq1.msr4 msr4, mq2.msr15 msr15 FROM ";
-    String possibleStart2 = "SELECT COALESCE(mq1.zipcode, mq2.zipcode) 
zipcode, mq2.msr4 msr4, mq1.msr15 msr15 FROM ";
+    String possibleStart1 = "SELECT COALESCE(mq1.zipcode, mq2.zipcode) 
zipcode, mq1.expr2 `count( msr4 )`,"
+      + " mq2.expr3 `sum( msr15 )` FROM ";
+    String possibleStart2 = "SELECT COALESCE(mq1.zipcode, mq2.zipcode) 
zipcode, mq2.expr2 `count( msr4 )`,"
+      + " mq1.expr3 `sum( msr15 )` FROM ";
 
     assertTrue(hqlQuery.startsWith(possibleStart1) || 
hqlQuery.startsWith(possibleStart2));
-    compareContains(rewrite("select zipcode as `zipcode`, sum(msr15) as 
`msr15` from testcube where " + whereCond,
+    compareContains(rewrite("select zipcode as `zipcode`, sum(msr15) as 
`expr3` from testcube where " + whereCond,
       conf), hqlQuery);
-    compareContains(rewrite("select zipcode as `zipcode`, count(msr4) as 
`msr4` from testcube where " + whereCond,
+    compareContains(rewrite("select zipcode as `zipcode`, count(msr4) as 
`expr2` from testcube where " + whereCond,
       conf), hqlQuery);
     assertTrue(hqlQuery.endsWith("on mq1.zipcode <=> mq2.zipcode"));
     // No time_range_in should be remaining

http://git-wip-us.apache.org/repos/asf/lens/blob/3b3f42da/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java
 
b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java
index fa07b67..d54e8b9 100644
--- 
a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java
+++ 
b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java
@@ -145,8 +145,18 @@ public class TestExpressionResolver extends 
TestQueryRewrite {
       getExpectedQuery("tc", "select substr(tc.dim1, 3) as `subdim1`, 
avg(tc.msr1 + tc.msr2) FROM ", null,
         " and subdim1 != 'XYZ' group by substr(tc.dim1, 3)", 
getWhereForHourly2days("tc", "C1_testfact2_raw"));
     TestCubeRewriter.compareQueries(hqlQuery, expected);
+  }
 
+  @Test
+  public void testCubeQueryExpressionWithAliasAsColumnName() throws Exception {
+    String hqlQuery = rewrite("select dim1 as d1, roundedmsr2 as msr2 from 
testCube" + " where " + TWO_DAYS_RANGE,
+      conf);
+    String expected =
+      getExpectedQuery(cubeName, "select testcube.dim1 as `d1`, 
round(sum(testcube.msr2)/1000) as `msr2` FROM ", null,
+        " group by testcube.dim1", getWhereForDailyAndHourly2days(cubeName, 
"c1_summary1"));
+    TestCubeRewriter.compareQueries(hqlQuery, expected);
   }
+
   @Test
   public void testExpressionInGroupbyToSelect() throws Exception {
     // expression with groupby
@@ -158,8 +168,8 @@ public class TestExpressionResolver extends 
TestQueryRewrite {
         + " avg(testCube.msr1 + testCube.msr2) FROM ", null, " and 
substr(testCube.dim1, 3) != 'XYZ'"
           + " group by testCube.dim1 != 'x' AND testCube.dim2 != 10", 
getWhereForHourly2days("C1_testfact2_raw"));
     TestCubeRewriter.compareQueries(hqlQuery, expected);
-
   }
+
   @Test
   public void testExpressionInSelectToGroupby() throws Exception {
     String hqlQuery =

Reply via email to