You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by am...@apache.org on 2015/04/15 21:49:56 UTC

[22/50] [abbrv] incubator-lens git commit: LENS-473 : Change the queryable field validation logic

LENS-473 : Change the queryable field validation logic


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

Branch: refs/heads/current-release-line
Commit: 019eb9498b54512e28e0e85a33a9afad814b1c84
Parents: 511418a
Author: jdhok <jd...@apache.org>
Authored: Thu Apr 2 16:46:13 2015 +0530
Committer: jdhok <jd...@apache.org>
Committed: Thu Apr 2 16:46:13 2015 +0530

----------------------------------------------------------------------
 .../apache/lens/cube/parse/AliasReplacer.java   |  75 +---------
 .../lens/cube/parse/CubeQueryRewriter.java      |   8 +-
 .../apache/lens/cube/parse/FieldValidator.java  | 150 +++++++++++++++++++
 .../lens/cube/parse/TestBaseCubeQueries.java    |  25 +++-
 .../lens/cube/parse/TestQueryMetrics.java       |  25 ++--
 .../lens/cube/parse/TestQueryRewrite.java       |   1 -
 6 files changed, 198 insertions(+), 86 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/019eb949/lens-cube/src/main/java/org/apache/lens/cube/parse/AliasReplacer.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/AliasReplacer.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/AliasReplacer.java
index d81fab1..961faad 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/AliasReplacer.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/AliasReplacer.java
@@ -30,7 +30,6 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.ql.ErrorMsg;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.parse.ASTNode;
 import org.apache.hadoop.hive.ql.parse.HiveParser;
 import org.apache.hadoop.hive.ql.parse.SemanticException;
@@ -59,7 +58,7 @@ class AliasReplacer implements ContextRewriter {
     colToTableAlias = new HashMap<String, String>();
 
     extractTabAliasForCol(cubeql);
-    doFieldValidation(cubeql);
+    findDimAttributesAndMeasures(cubeql);
 
     // Rewrite the all the columns in the query with table alias prefixed.
     // If col1 of table tab1 is accessed, it would be changed as tab1.col1.
@@ -97,10 +96,12 @@ class AliasReplacer implements ContextRewriter {
 
   }
 
-  // Finds all queried dim-attributes and measures from cube
-  // If all fields in cube are not queryable together, does the validation
-  // wrt to derived cubes.
-  private void doFieldValidation(CubeQueryContext cubeql) throws SemanticException {
+  /**
+   * Figure out queried dim attributes and measures from the cube query context
+   * @param cubeql
+   * @throws SemanticException
+   */
+  private void findDimAttributesAndMeasures(CubeQueryContext cubeql) throws SemanticException {
     CubeInterface cube = cubeql.getCube();
     if (cube != null) {
       Set<String> cubeColsQueried = cubeql.getColumnsQueried(cube.getName());
@@ -117,69 +118,7 @@ class AliasReplacer implements ContextRewriter {
       }
       cubeql.addQueriedDimAttrs(queriedDimAttrs);
       cubeql.addQueriedMsrs(queriedMsrs);
-      if (!cube.allFieldsQueriable()) {
-        // do queried field validation
-        List<DerivedCube> dcubes;
-        try {
-          dcubes = cubeql.getMetastoreClient().getAllDerivedQueryableCubes(cube);
-        } catch (HiveException e) {
-          throw new SemanticException(e);
-        }
-        // remove chained ref columns from field validation
-        Iterator<String> iter = queriedDimAttrs.iterator();
-        Set<String> chainedSrcColumns = new HashSet<String>();
-        while (iter.hasNext()) {
-          String attr = iter.next();
-          if (cube.getDimAttributeByName(attr) instanceof ReferencedDimAtrribute
-            && ((ReferencedDimAtrribute) cube.getDimAttributeByName(attr)).isChainedColumn()) {
-            iter.remove();
-            ReferencedDimAtrribute rdim = (ReferencedDimAtrribute)cube.getDimAttributeByName(attr);
-            chainedSrcColumns.addAll(cube.getChainByName(rdim.getChainName()).getSourceColumns());
-          }
-        }
-        for (JoinChain chainQueried : cubeql.getJoinchains().values()) {
-          chainedSrcColumns.addAll(chainQueried.getSourceColumns());
-        }
-        // do validation
-        // Find atleast one derived cube which contains all the dimensions
-        // queried.
-        boolean derivedCubeFound = false;
-        for (DerivedCube dcube : dcubes) {
-          if (dcube.getDimAttributeNames().containsAll(chainedSrcColumns)
-              && dcube.getDimAttributeNames().containsAll(queriedDimAttrs)) {
-            // remove all the measures that are covered
-            queriedMsrs.removeAll(dcube.getMeasureNames());
-            derivedCubeFound = true;
-          }
-        }
-        Set<String> nonQueryableFields = getNonQueryableAttributes(cubeql);
-        if (!derivedCubeFound && !nonQueryableFields.isEmpty()) {
-          throw new SemanticException(ErrorMsg.FIELDS_NOT_QUERYABLE, nonQueryableFields.toString());
-        }
-        if (!queriedMsrs.isEmpty()) {
-          // Add appropriate message to know which fields are not queryable together
-          if (!nonQueryableFields.isEmpty()) {
-            throw new SemanticException(ErrorMsg.FIELDS_NOT_QUERYABLE, nonQueryableFields.toString() + " and "
-              + queriedMsrs.toString());
-          } else {
-            throw new SemanticException(ErrorMsg.FIELDS_NOT_QUERYABLE, queriedMsrs.toString());
-          }
-        }
-      }
-    }
-  }
-
-  private Set<String> getNonQueryableAttributes(CubeQueryContext cubeql) {
-    Set<String> nonQueryableFields = new LinkedHashSet<String>();
-    nonQueryableFields.addAll(cubeql.getQueriedDimAttrs());
-    for (String joinChainAlias : cubeql.getJoinchains().keySet()) {
-      if (cubeql.getColumnsQueried(joinChainAlias) != null) {
-        for (String chaincol : cubeql.getColumnsQueried(joinChainAlias)) {
-          nonQueryableFields.add(joinChainAlias + "." + chaincol);
-        }
-      }
     }
-    return nonQueryableFields;
   }
 
   private void extractTabAliasForCol(CubeQueryContext cubeql) throws SemanticException {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/019eb949/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryRewriter.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryRewriter.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryRewriter.java
index 1833cde..24c6ab1 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryRewriter.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/CubeQueryRewriter.java
@@ -133,6 +133,10 @@ public class CubeQueryRewriter {
     rewriters.add(denormResolver);
     // Resolve candidate fact tables and dimension tables for columns queried
     rewriters.add(candidateTblResolver);
+    // Resolve aggregations and generate base select tree
+    rewriters.add(new AggregateResolver(conf));
+    rewriters.add(new GroupbyResolver(conf));
+    rewriters.add(new FieldValidator());
     // Resolve joins and generate base join tree
     rewriters.add(new JoinResolver(conf));
     // resolve time ranges and do col life validation
@@ -140,9 +144,7 @@ public class CubeQueryRewriter {
     // Resolve candidate fact tables and dimension tables for columns included
     // in join and denorm resolvers
     rewriters.add(candidateTblResolver);
-    // Resolve aggregations and generate base select tree
-    rewriters.add(new AggregateResolver(conf));
-    rewriters.add(new GroupbyResolver(conf));
+
     // Phase 1: resolve fact tables.
     rewriters.add(storageTableResolver);
     if (lightFactFirst) {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/019eb949/lens-cube/src/main/java/org/apache/lens/cube/parse/FieldValidator.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/FieldValidator.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/FieldValidator.java
new file mode 100644
index 0000000..eafd661
--- /dev/null
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/FieldValidator.java
@@ -0,0 +1,150 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.lens.cube.parse;
+
+import java.util.*;
+
+import org.apache.lens.cube.metadata.CubeInterface;
+import org.apache.lens.cube.metadata.DerivedCube;
+import org.apache.lens.cube.metadata.ReferencedDimAtrribute;
+
+import org.apache.hadoop.hive.ql.ErrorMsg;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.parse.ASTNode;
+import org.apache.hadoop.hive.ql.parse.HiveParser;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+
+/**
+ * Validate fields based on cube queryability
+ */
+public class FieldValidator implements ContextRewriter {
+
+  @Override
+  public void rewriteContext(CubeQueryContext cubeql) throws SemanticException {
+    validateFields(cubeql);
+  }
+
+  public void validateFields(CubeQueryContext cubeql) throws SemanticException {
+    CubeInterface cube = cubeql.getCube();
+    if (cube == null) {
+      return;
+    }
+
+    if (!cube.allFieldsQueriable()) {
+      // do queried field validation
+      List<DerivedCube> dcubes;
+      try {
+        dcubes = cubeql.getMetastoreClient().getAllDerivedQueryableCubes(cube);
+      } catch (HiveException e) {
+        throw new SemanticException(e);
+      }
+
+      // dim attributes and chained source columns should only come from WHERE and GROUP BY ASTs
+      Set<String> queriedDimAttrs = new LinkedHashSet<String>();
+      Set<String> queriedMsrs = new LinkedHashSet<String>(cubeql.getQueriedMsrs());
+      Set<String> chainedSrcColumns = new HashSet<String>();
+      Set<String> nonQueryableFields = new LinkedHashSet<String>();
+
+      findDimAttrsAndChainSourceColumns(cubeql, cubeql.getGroupByAST(), queriedDimAttrs,
+        chainedSrcColumns, nonQueryableFields);
+      findDimAttrsAndChainSourceColumns(cubeql, cubeql.getWhereAST(), queriedDimAttrs,
+        chainedSrcColumns, nonQueryableFields);
+
+      // do validation
+      // Find atleast one derived cube which contains all the dimensions
+      // queried.
+      boolean derivedCubeFound = false;
+      for (DerivedCube dcube : dcubes) {
+        if (dcube.getDimAttributeNames().containsAll(chainedSrcColumns)
+          && dcube.getDimAttributeNames().containsAll(queriedDimAttrs)) {
+          // remove all the measures that are covered
+          queriedMsrs.removeAll(dcube.getMeasureNames());
+          derivedCubeFound = true;
+        }
+      }
+
+      if (!derivedCubeFound && !nonQueryableFields.isEmpty()) {
+        throw new SemanticException(ErrorMsg.FIELDS_NOT_QUERYABLE, nonQueryableFields.toString());
+      }
+
+      if (!queriedMsrs.isEmpty()) {
+        // Add appropriate message to know which fields are not queryable together
+        if (!nonQueryableFields.isEmpty()) {
+          throw new SemanticException(ErrorMsg.FIELDS_NOT_QUERYABLE, nonQueryableFields.toString() + " and "
+            + queriedMsrs.toString());
+        } else {
+          throw new SemanticException(ErrorMsg.FIELDS_NOT_QUERYABLE, queriedMsrs.toString());
+        }
+      }
+    }
+  }
+
+  // Traverse parse tree to figure out dimension attributes of the cubes and join chains
+  // present in the AST.
+  private void findDimAttrsAndChainSourceColumns(final CubeQueryContext cubeql,
+                                                 final ASTNode tree,
+                                                 final Set<String> dimAttributes,
+                                                 final Set<String> chainSourceColumns,
+                                                 final Set<String> nonQueryableColumns) throws SemanticException {
+    if (tree == null || !cubeql.hasCubeInQuery()) {
+      return;
+    }
+
+    final CubeInterface cube = cubeql.getCube();
+
+    HQLParser.bft(tree, new HQLParser.ASTNodeVisitor() {
+      @Override
+      public void visit(HQLParser.TreeNode treeNode) throws SemanticException {
+        ASTNode astNode = treeNode.getNode();
+        if (astNode.getToken().getType() == HiveParser.DOT) {
+          // At this point alias replacer has run, so all columns are of the type table.column name
+          ASTNode aliasNode = HQLParser.findNodeByPath((ASTNode) astNode.getChild(0), HiveParser.Identifier);
+          String tabName = aliasNode.getText().toLowerCase().trim();
+          ASTNode colNode = (ASTNode) astNode.getChild(1);
+          String colName = colNode.getText().toLowerCase().trim();
+
+          // Check if table is a join chain
+          if (cubeql.getJoinchains().containsKey(tabName)) {
+            // this 'tabName' is a join chain, so add all source columns
+            chainSourceColumns.addAll(cubeql.getJoinchains().get(tabName).getSourceColumns());
+            nonQueryableColumns.add(tabName + "." + colName);
+          } else if (tabName.equalsIgnoreCase(cubeql.getAliasForTabName(cube.getName()))
+            && cube.getDimAttributeNames().contains(colName)) {
+            // Alternatively, check if this is a dimension attribute, if yes add it to the dim attribute set
+            // and non queryable fields set
+            nonQueryableColumns.add(colName);
+
+            // If this is a referenced dim attribute leading to a chain, then instead of adding this
+            // column, we add the source columns of the chain.
+            if (cube.getDimAttributeByName(colName) instanceof ReferencedDimAtrribute
+              && ((ReferencedDimAtrribute) cube.getDimAttributeByName(colName)).isChainedColumn()) {
+              ReferencedDimAtrribute rdim = (ReferencedDimAtrribute) cube.getDimAttributeByName(colName);
+              chainSourceColumns.addAll(cube.getChainByName(rdim.getChainName()).getSourceColumns());
+            } else {
+              // This is a dim attribute, needs to be validated
+              dimAttributes.add(colName);
+            }
+          }
+        }
+      }
+    });
+
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/019eb949/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 632829f..69451ad 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
@@ -58,10 +58,29 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
     Assert.assertEquals(e.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.FIELDS_NOT_QUERYABLE.getErrorCode());
     Assert.assertTrue(e.getMessage().contains("dim2") && e.getMessage().contains("msr1"));
 
+    // Query with only measure should pass, since dim is not in where or group by
+    String hql = rewrite("select SUM(msr1), "
+      + "SUM(CASE WHEN cityState.name ='foo' THEN msr2"
+      + " WHEN dim2 = 'bar' THEN msr1 ELSE msr2 END) "
+      + "from basecube where " + TWO_DAYS_RANGE, conf);
+    Assert.assertNotNull(hql);
+
+    // This query should fail because chain ref in where clause
+    e = getSemanticExceptionInRewrite("select SUM(msr1), "
+      + "SUM(case WHEN cityState.capital ='foo' THEN msr2 ELSE msr1 END) "
+      + "from basecube where " + TWO_DAYS_RANGE + " AND cityState.name='foo'", conf);
+    Assert.assertEquals(e.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.FIELDS_NOT_QUERYABLE.getErrorCode());
+    // Error message should contain chain_name.col_name and it should not contain dim attributes in select clause
+    // it should also contain the measure name
+    Assert.assertTrue(e.getMessage().contains("citystate.name")
+      && e.getMessage().contains("msr1")
+      && !e.getMessage().contains("capital"), e.getMessage());
+
+
     e = getSemanticExceptionInRewrite("select cityStateCapital, SUM(msr1) from basecube" + " where " + TWO_DAYS_RANGE,
       conf);
     Assert.assertEquals(e.getCanonicalErrorMsg().getErrorCode(), ErrorMsg.FIELDS_NOT_QUERYABLE.getErrorCode());
-    Assert.assertTrue(e.getMessage().contains("citystatecapital") && e.getMessage().contains("msr1"));
+    Assert.assertTrue(e.getMessage().contains("citystatecapital") && e.getMessage().contains("msr1"), e.getMessage());
 
     e = getSemanticExceptionInRewrite("select cityState.name, SUM(msr1) from basecube" + " where " + TWO_DAYS_RANGE,
       conf);
@@ -87,7 +106,6 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
     e = getSemanticExceptionInRewrite("select msr11 + msr2 from basecube" + " where " + TWO_DAYS_RANGE, conf);
     Assert.assertEquals(e.getCanonicalErrorMsg().getErrorCode(),
       ErrorMsg.EXPRESSION_NOT_IN_ANY_FACT.getErrorCode());
-
     // no fact has the all the dimensions queried
     e = getSemanticExceptionInRewrite("select dim1, stateid, msr3, msr13 from basecube" + " where " + TWO_DAYS_RANGE,
       conf);
@@ -111,6 +129,9 @@ public class TestBaseCubeQueries extends TestQueryRewrite {
         }
       }
     );
+
+
+
   }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/019eb949/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java
index aec0828..5cf76ca 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java
@@ -50,19 +50,20 @@ public class TestQueryMetrics extends TestQueryRewrite {
       "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.AliasReplacer-ITER-2",
       "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.DenormalizationResolver-ITER-3",
       "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.CandidateTableResolver-ITER-4",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.JoinResolver-ITER-5",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.TimerangeResolver-ITER-6",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.CandidateTableResolver-ITER-7",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.AggregateResolver-ITER-8",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.GroupbyResolver-ITER-9",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-10",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.AggregateResolver-ITER-5",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.GroupbyResolver-ITER-6",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.FieldValidator-ITER-7",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.JoinResolver-ITER-8",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.TimerangeResolver-ITER-9",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.CandidateTableResolver-ITER-10",
       "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-11",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestFactResolver-ITER-12",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-13",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.DenormalizationResolver-ITER-14",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LeastPartitionResolver-ITER-15",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestFactResolver-ITER-16",
-      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestDimensionResolver-ITER-17"
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-12",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestFactResolver-ITER-13",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-14",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.DenormalizationResolver-ITER-15",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LeastPartitionResolver-ITER-16",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestFactResolver-ITER-17",
+      "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestDimensionResolver-ITER-18"
     )));
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/019eb949/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryRewrite.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryRewrite.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryRewrite.java
index c4449da..6a37756 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryRewrite.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryRewrite.java
@@ -89,7 +89,6 @@ public abstract class TestQueryRewrite {
       // unreachable
       return null;
     } catch (SemanticException e) {
-      e.printStackTrace();
       return e;
     }
   }