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;
}
}