You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by ra...@apache.org on 2015/08/20 08:07:46 UTC
incubator-lens git commit: LENS-716 : Support for '!=,
in and not in' predicates in elastic search driver
Repository: incubator-lens
Updated Branches:
refs/heads/master 9c77dce0b -> 4afce1fd1
LENS-716 : Support for '!=, in and not in' predicates in elastic search driver
Project: http://git-wip-us.apache.org/repos/asf/incubator-lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-lens/commit/4afce1fd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-lens/tree/4afce1fd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-lens/diff/4afce1fd
Branch: refs/heads/master
Commit: 4afce1fd102efd11072159e7acb6e89414940c4e
Parents: 9c77dce
Author: Amruth S <am...@gmail.com>
Authored: Thu Aug 20 11:35:39 2015 +0530
Committer: Raju Bairishetti <ra...@apache.org>
Committed: Thu Aug 20 11:35:39 2015 +0530
----------------------------------------------------------------------
.../lens/driver/es/ASTTraverserForES.java | 26 ++--
.../apache/lens/driver/es/ESDriverConfig.java | 36 +----
.../lens/driver/es/grammar/Aggregations.java | 64 ++++++++
.../driver/es/grammar/LogicalOperators.java | 82 ++++++++++
.../lens/driver/es/grammar/Predicates.java | 150 +++++++++++++++++++
.../es/translator/ASTCriteriaVisitor.java | 7 -
.../lens/driver/es/translator/ASTVisitor.java | 4 +-
.../es/translator/impl/ESAggregateVisitor.java | 11 +-
.../es/translator/impl/ESCriteriaVisitor.java | 63 +++-----
.../src/test/resources/valid-queries.data | 17 ++-
10 files changed, 354 insertions(+), 106 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4afce1fd/lens-driver-es/src/main/java/org/apache/lens/driver/es/ASTTraverserForES.java
----------------------------------------------------------------------
diff --git a/lens-driver-es/src/main/java/org/apache/lens/driver/es/ASTTraverserForES.java b/lens-driver-es/src/main/java/org/apache/lens/driver/es/ASTTraverserForES.java
index 5e082e5..07b157e 100644
--- a/lens-driver-es/src/main/java/org/apache/lens/driver/es/ASTTraverserForES.java
+++ b/lens-driver-es/src/main/java/org/apache/lens/driver/es/ASTTraverserForES.java
@@ -165,6 +165,14 @@ public final class ASTTraverserForES {
rightExpressions.add(whereClause.getChildren().get(4).toString());
leftCol = whereClause.getChildren().get(2).getChildren().get(1).toString();
break;
+ case IN:
+ case NOT_IN:
+ Validate.isTrue(rightExpList.size()>2, "Atleast one right expression needed");
+ for (Node node : whereClause.getChildren().subList(2, whereClause.getChildren().size())) {
+ rightExpressions.add(node.toString());
+ }
+ leftCol = whereClause.getChildren().get(1).getChildren().get(0).toString();
+ break;
case SIMPLE:
Validate.isTrue(rightExpList.size()>1, "Atleast one right expression needed");
for(Node rightExp : rightExpList.subList(1, rightExpList.size())) {
@@ -188,14 +196,7 @@ public final class ASTTraverserForES {
for (Node node : whereClause.getChildren()) {
childVisitors.add(traverseCriteriaRecursively(node));
}
- switch (logicalOpInfo.logicalOpType) {
- case UNARY:
- childVisitor.visitUnaryLogicalOp(logicalOpInfo.logicalOperator, childVisitors.get(0));
- break;
- case BINARY:
- childVisitor.visitLogicalOp(logicalOpInfo.logicalOperator, childVisitors);
- break;
- }
+ childVisitor.visitLogicalOp(logicalOpInfo.logicalOperator, childVisitors);
return childVisitor;
}
@@ -268,7 +269,7 @@ public final class ASTTraverserForES {
}
}
- private enum PredicateType {SIMPLE, BETWEEN};
+ private enum PredicateType {SIMPLE, IN, NOT_IN, BETWEEN};
private enum CriteriaType {PREDICATE, LOGICAL}
private enum LogicalOpType {UNARY, BINARY}
private static class CriteriaInfo {
@@ -302,7 +303,8 @@ public final class ASTTraverserForES {
private static class Helper {
- private static List<String> predicates = Lists.newArrayList("=", ">", "<", "<=", ">=", "between");
+ private static List<String> predicates
+ = Lists.newArrayList("!=", "=", ">", "<", "<=", ">=", "between", "in", "not in");
private static List<String> unaryLogicalOps = Lists.newArrayList("not", "!");
private static List<String> binaryLogicalOps = Lists.newArrayList("and", "or", "&", "|", "&&", "||");
private static List<String> logicalOps = Lists.newArrayList();
@@ -329,6 +331,10 @@ public final class ASTTraverserForES {
return new PredicateInfo(whereRoot, PredicateType.SIMPLE);
} else if (whereRoot.equals("TOK_FUNCTION") && whereClause.getChildren().get(0).toString().equals("between")) {
return new PredicateInfo("between", PredicateType.BETWEEN);
+ } else if (whereRoot.equals("TOK_FUNCTION") && whereClause.getChildren().get(0).toString().equals("in")) {
+ return new PredicateInfo("in", PredicateType.IN);
+ } else if (whereRoot.equals("TOK_FUNCTION") && whereClause.getChildren().get(0).toString().equals("not in")) {
+ return new PredicateInfo("not in", PredicateType.NOT_IN);
} else {
throw new InvalidQueryException("Could not get criteria info for where clause " + whereRoot);
}
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4afce1fd/lens-driver-es/src/main/java/org/apache/lens/driver/es/ESDriverConfig.java
----------------------------------------------------------------------
diff --git a/lens-driver-es/src/main/java/org/apache/lens/driver/es/ESDriverConfig.java b/lens-driver-es/src/main/java/org/apache/lens/driver/es/ESDriverConfig.java
index df01fe6..8f293f5 100644
--- a/lens-driver-es/src/main/java/org/apache/lens/driver/es/ESDriverConfig.java
+++ b/lens-driver-es/src/main/java/org/apache/lens/driver/es/ESDriverConfig.java
@@ -49,10 +49,6 @@ public final class ESDriverConfig {
public static final String SIZE = "size";
public static final String QUERY_TIME_OUT_STRING = "timeout";
- public static final ImmutableMap<String, String> LOGICAL_OPS;
- public static final ImmutableMap<String, String> RANGE_PREDICATES;
- public static final ImmutableMap<String, String> PREDICATES;
- public static final ImmutableMap<String, String> AGGREGATIONS;
public static final ImmutableMap<ASTVisitor.OrderBy, String> ORDER_BYS;
public static final int AGGR_TERM_FETCH_SIZE = 0;
public static final int DEFAULT_TERM_QUERY_OFFSET = 0;
@@ -63,37 +59,6 @@ public final class ESDriverConfig {
private static final int TERM_FETCH_SIZE_DEFAULT = 5000;
static {
- final ImmutableMap.Builder<String, String> logicalOpsBuilder = ImmutableMap.builder();
- logicalOpsBuilder.put("and", "and");
- logicalOpsBuilder.put("&&", "and");
- logicalOpsBuilder.put("&", "and");
- logicalOpsBuilder.put("or", "or");
- logicalOpsBuilder.put("||", "or");
- logicalOpsBuilder.put("|", "or");
- logicalOpsBuilder.put("!", "not");
- LOGICAL_OPS = logicalOpsBuilder.build();
-
- final ImmutableMap.Builder<String, String> predicatesBuilder = ImmutableMap.builder();
- predicatesBuilder.put(">", "gt");
- predicatesBuilder.put(">=", "gte");
- predicatesBuilder.put("<", "lt");
- predicatesBuilder.put("<=", "lte");
- predicatesBuilder.put("between", "range");
- RANGE_PREDICATES = predicatesBuilder.build();
- predicatesBuilder.put("=", "term");
- predicatesBuilder.put("in", "terms");
- PREDICATES = predicatesBuilder.build();
-
- final ImmutableMap.Builder<String, String> aggregationsBuilder = ImmutableMap.builder();
- aggregationsBuilder.put("count", "value_count");
- aggregationsBuilder.put("count_distinct", "cardinality");
- aggregationsBuilder.put("max", "max");
- aggregationsBuilder.put("sum", "sum");
- aggregationsBuilder.put("min", "min");
- aggregationsBuilder.put("avg", "avg");
- aggregationsBuilder.put("percentile", "percentiles");
- AGGREGATIONS = aggregationsBuilder.build();
-
final ImmutableMap.Builder<ASTVisitor.OrderBy, String> orderByBuilder = ImmutableMap.builder();
orderByBuilder.put(ASTVisitor.OrderBy.ASC, "asc");
orderByBuilder.put(ASTVisitor.OrderBy.DESC, "desc");
@@ -119,4 +84,5 @@ public final class ESDriverConfig {
termFetchSize = conf.getInt(TERM_FETCH_SIZE_KEY, TERM_FETCH_SIZE_DEFAULT);
}
+
}
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4afce1fd/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/Aggregations.java
----------------------------------------------------------------------
diff --git a/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/Aggregations.java b/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/Aggregations.java
new file mode 100644
index 0000000..f726fa5
--- /dev/null
+++ b/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/Aggregations.java
@@ -0,0 +1,64 @@
+/**
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.driver.es.grammar;
+
+import org.apache.lens.driver.es.ESDriverConfig;
+import org.apache.lens.driver.es.exceptions.InvalidQueryException;
+
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableMap;
+
+public enum Aggregations {
+ value_count,
+ cardinality,
+ max,
+ sum,
+ min,
+ avg;
+
+ protected static final JsonNodeFactory JSON_NODE_FACTORY = JsonNodeFactory.instance;
+
+ public void build(ObjectNode targetAggNode, String columnName, String alias) {
+ final ObjectNode aggMeasures = JSON_NODE_FACTORY.objectNode();
+ final ObjectNode fieldNode = JSON_NODE_FACTORY.objectNode();
+ fieldNode.put(ESDriverConfig.FIELD, columnName);
+ targetAggNode.put(alias, aggMeasures);
+ aggMeasures.put(String.valueOf(this), fieldNode);
+ }
+
+ public static Aggregations getFor(String hqlAggregationName) throws InvalidQueryException {
+ if (HQL_AF_MAP.containsKey(hqlAggregationName)) {
+ return HQL_AF_MAP.get(hqlAggregationName);
+ }
+ throw new InvalidQueryException("No handlers registered for aggregation " + hqlAggregationName);
+ }
+
+ private static final ImmutableMap<String, Aggregations> HQL_AF_MAP;
+ static {
+ final ImmutableMap.Builder<String, Aggregations> hqlAFMapBuilder = ImmutableMap.builder();
+ hqlAFMapBuilder.put("count", value_count);
+ hqlAFMapBuilder.put("count_distinct", cardinality);
+ hqlAFMapBuilder.put("max", max);
+ hqlAFMapBuilder.put("sum", sum);
+ hqlAFMapBuilder.put("min", min);
+ hqlAFMapBuilder.put("avg", avg);
+ HQL_AF_MAP = hqlAFMapBuilder.build();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4afce1fd/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/LogicalOperators.java
----------------------------------------------------------------------
diff --git a/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/LogicalOperators.java b/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/LogicalOperators.java
new file mode 100644
index 0000000..b9cf000
--- /dev/null
+++ b/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/LogicalOperators.java
@@ -0,0 +1,82 @@
+/**
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.driver.es.grammar;
+
+import java.util.List;
+
+import org.apache.lens.driver.es.exceptions.InvalidQueryException;
+
+import org.apache.commons.lang3.Validate;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableMap;
+
+public enum LogicalOperators {
+ and {
+ @Override
+ public void build(ObjectNode targetNode, List<JsonNode> innerNodes) {
+ final ArrayNode subTrees = JSON_NODE_FACTORY.arrayNode();
+ subTrees.addAll(innerNodes);
+ targetNode.put("and", subTrees);
+ }
+ },
+ or {
+ @Override
+ public void build(ObjectNode targetNode, List<JsonNode> innerNodes) {
+ final ArrayNode subTrees = JSON_NODE_FACTORY.arrayNode();
+ subTrees.addAll(innerNodes);
+ targetNode.put("or", subTrees);
+ }
+ },
+ not {
+ @Override
+ public void build(ObjectNode targetNode, List<JsonNode> innerNodes) {
+ Validate.isTrue(innerNodes.size() == 1, "Not can have exactly only one child");
+ targetNode.put("not", innerNodes.get(0));
+ }
+ };
+
+ protected static final JsonNodeFactory JSON_NODE_FACTORY = JsonNodeFactory.instance;
+
+ public abstract void build(ObjectNode targetNode, List<JsonNode> innerNodes);
+
+ private static final ImmutableMap<String, LogicalOperators> HQL_LOG_OP_MAP;
+ static {
+ final ImmutableMap.Builder<String, LogicalOperators> logicalOpsBuilder = ImmutableMap.builder();
+ logicalOpsBuilder.put("and", and);
+ logicalOpsBuilder.put("&&", and);
+ logicalOpsBuilder.put("&", and);
+ logicalOpsBuilder.put("or", or);
+ logicalOpsBuilder.put("||", or);
+ logicalOpsBuilder.put("|", or);
+ logicalOpsBuilder.put("!", not);
+ logicalOpsBuilder.put("not", not);
+ HQL_LOG_OP_MAP = logicalOpsBuilder.build();
+ }
+
+ public static LogicalOperators getFor(String hqlLop) throws InvalidQueryException {
+ if (HQL_LOG_OP_MAP.containsKey(hqlLop)) {
+ return HQL_LOG_OP_MAP.get(hqlLop);
+ }
+ throw new InvalidQueryException("Handler not available for logical operator " + hqlLop);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4afce1fd/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/Predicates.java
----------------------------------------------------------------------
diff --git a/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/Predicates.java b/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/Predicates.java
new file mode 100644
index 0000000..ec2af0f
--- /dev/null
+++ b/lens-driver-es/src/main/java/org/apache/lens/driver/es/grammar/Predicates.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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.driver.es.grammar;
+
+import java.util.List;
+
+import org.apache.lens.driver.es.ESDriverConfig;
+import org.apache.lens.driver.es.exceptions.InvalidQueryException;
+
+import org.apache.commons.lang.Validate;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableMap;
+
+public enum Predicates {
+ term {
+ @Override
+ public void build(ObjectNode targetNode, String leftCol, List<String> rightExps) {
+ final ObjectNode termNode = JSON_NODE_FACTORY.objectNode();
+ termNode.put(leftCol, removeSingleQuotesFromLiteral(rightExps.get(0)));
+ targetNode.put(ESDriverConfig.TERM, termNode);
+ }
+ },
+ not_term {
+ @Override
+ public void build(ObjectNode targetNode, String leftCol, List<String> rightExps) {
+ final ObjectNode innerNode = addNotNode(targetNode);
+ term.build(innerNode, leftCol, rightExps);
+ }
+ },
+ terms {
+ @Override
+ public void build(ObjectNode targetNode, String leftCol, List<String> rightExps) {
+ final ObjectNode termsNode = JSON_NODE_FACTORY.objectNode();
+ final ArrayNode arrayNode = JSON_NODE_FACTORY.arrayNode();
+ for (String right : rightExps) {
+ arrayNode.add(removeSingleQuotesFromLiteral(right));
+ }
+ termsNode.put(leftCol, arrayNode);
+ targetNode.put(ESDriverConfig.TERMS, termsNode);
+ }
+ },
+ not_terms {
+ @Override
+ public void build(ObjectNode targetNode, String leftCol, List<String> rightExps) {
+ final ObjectNode innerNode = addNotNode(targetNode);
+ terms.build(innerNode, leftCol, rightExps);
+ }
+ },
+ gt {
+ @Override
+ public void build(ObjectNode targetNode, String leftCol, List<String> rightExps) {
+ final ObjectNode rangeInnerNode = getRangeNode(targetNode, leftCol, rightExps);
+ rangeInnerNode.put("gt", removeSingleQuotesFromLiteral(rightExps.get(0)));
+ }
+ },
+ gte {
+ @Override
+ public void build(ObjectNode targetNode, String leftCol, List<String> rightExps) {
+ final ObjectNode rangeInnerNode = getRangeNode(targetNode, leftCol, rightExps);
+ rangeInnerNode.put("gte", removeSingleQuotesFromLiteral(rightExps.get(0)));
+ }
+ },
+ lt {
+ @Override
+ public void build(ObjectNode targetNode, String leftCol, List<String> rightExps) {
+ final ObjectNode rangeInnerNode = getRangeNode(targetNode, leftCol, rightExps);
+ rangeInnerNode.put("lt", removeSingleQuotesFromLiteral(rightExps.get(0)));
+ }
+ },
+ lte {
+ @Override
+ public void build(ObjectNode targetNode, String leftCol, List<String> rightExps) {
+ final ObjectNode rangeInnerNode = getRangeNode(targetNode, leftCol, rightExps);
+ rangeInnerNode.put("lte", removeSingleQuotesFromLiteral(rightExps.get(0)));
+ }
+ },
+ range {
+ @Override
+ public void build(ObjectNode targetNode, String leftCol, List<String> rightExps) {
+ Validate.isTrue(rightExps.size() == 2);
+ final ObjectNode rangeInnerNode = getRangeNode(targetNode, leftCol, rightExps);
+ rangeInnerNode.put("gt", removeSingleQuotesFromLiteral(rightExps.get(0)));
+ rangeInnerNode.put("lt", removeSingleQuotesFromLiteral(rightExps.get(1)));
+ }
+ };
+
+ private static ObjectNode getRangeNode(ObjectNode targetNode, String leftCol, List<String> rightExps) {
+ final ObjectNode rangeNode = JSON_NODE_FACTORY.objectNode();
+ final ObjectNode rangeInnerNode = JSON_NODE_FACTORY.objectNode();
+ rangeNode.put(leftCol, rangeInnerNode);
+ targetNode.put(ESDriverConfig.RANGE, rangeNode);
+ return rangeInnerNode;
+ }
+
+ protected static final JsonNodeFactory JSON_NODE_FACTORY = JsonNodeFactory.instance;
+
+ private static String removeSingleQuotesFromLiteral(String rightExp) {
+ return rightExp.replaceAll("^\'|\'$", "");
+ }
+
+ protected final ObjectNode addNotNode(ObjectNode targetNode) {
+ final ObjectNode innerPredicateNode = JSON_NODE_FACTORY.objectNode();
+ targetNode.put("not", innerPredicateNode);
+ return innerPredicateNode;
+ }
+
+ public abstract void build(ObjectNode targetNode, String leftCol, List<String> rightExps);
+
+ public static Predicates getFor(String hqlPredicate) throws InvalidQueryException {
+ if (HQL_PREDICATE_MAP.containsKey(hqlPredicate)) {
+ return HQL_PREDICATE_MAP.get(hqlPredicate);
+ }
+ throw new InvalidQueryException("Cannot find a handler for the hql predicate " + hqlPredicate);
+ }
+
+ private static final ImmutableMap<String, Predicates> HQL_PREDICATE_MAP;
+ static {
+ final ImmutableMap.Builder<String, Predicates> predicatesBuilder = ImmutableMap.builder();
+ predicatesBuilder.put(">", gt);
+ predicatesBuilder.put(">=", gte);
+ predicatesBuilder.put("<", lt);
+ predicatesBuilder.put("<=", lte);
+ predicatesBuilder.put("between", range);
+ predicatesBuilder.put("=", term);
+ predicatesBuilder.put("!=", not_term);
+ predicatesBuilder.put("in", terms);
+ predicatesBuilder.put("not in", not_terms);
+ HQL_PREDICATE_MAP = predicatesBuilder.build();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4afce1fd/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/ASTCriteriaVisitor.java
----------------------------------------------------------------------
diff --git a/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/ASTCriteriaVisitor.java b/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/ASTCriteriaVisitor.java
index a0bd7c8..b429424 100644
--- a/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/ASTCriteriaVisitor.java
+++ b/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/ASTCriteriaVisitor.java
@@ -25,13 +25,6 @@ import org.apache.lens.driver.es.exceptions.InvalidQueryException;
public interface ASTCriteriaVisitor {
/**
*
- * @param logicalOp The unary operator
- * @param visitedSubTree The visited subtree of unary operator
- */
- void visitUnaryLogicalOp(String logicalOp, ASTCriteriaVisitor visitedSubTree) throws InvalidQueryException;
-
- /**
- *
* @param logicalOp The logical operator
* @param visitedSubTrees The visited subtree of logical operator
*/
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4afce1fd/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/ASTVisitor.java
----------------------------------------------------------------------
diff --git a/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/ASTVisitor.java b/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/ASTVisitor.java
index f654a60..77e774f 100644
--- a/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/ASTVisitor.java
+++ b/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/ASTVisitor.java
@@ -18,6 +18,8 @@
*/
package org.apache.lens.driver.es.translator;
+import org.apache.lens.driver.es.exceptions.InvalidQueryException;
+
/**
* The visitor interface for ASTInorderTraversal
* It covers only simple queries (no joins or sub queries)
@@ -29,7 +31,7 @@ public interface ASTVisitor {
void visitSimpleSelect(String columnName, String alias);
- void visitAggregation(String aggregationType, String columnName, String alias);
+ void visitAggregation(String aggregationType, String columnName, String alias) throws InvalidQueryException;
void visitFrom(String database, String table);
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4afce1fd/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/impl/ESAggregateVisitor.java
----------------------------------------------------------------------
diff --git a/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/impl/ESAggregateVisitor.java b/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/impl/ESAggregateVisitor.java
index 69f20d3..e8f2cea 100644
--- a/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/impl/ESAggregateVisitor.java
+++ b/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/impl/ESAggregateVisitor.java
@@ -22,6 +22,8 @@ import java.util.Map;
import org.apache.lens.driver.es.ESDriverConfig;
import org.apache.lens.driver.es.ESQuery;
+import org.apache.lens.driver.es.exceptions.InvalidQueryException;
+import org.apache.lens.driver.es.grammar.Aggregations;
import org.apache.lens.driver.es.translator.ESVisitor;
import org.apache.commons.lang3.Validate;
@@ -56,16 +58,13 @@ public class ESAggregateVisitor extends ESVisitor {
}
@Override
- public void visitAggregation(String aggregationType, String columnName, String alias) {
+ public void visitAggregation(String aggregationType, String columnName, String alias) throws InvalidQueryException {
columnName = visitColumn(columnName);
final String aliasName = alias == null ? columnName : alias;
querySchema.add(aliasName);
selectedColumnNames.add(columnName);
- final ObjectNode aggMeasures = JSON_NODE_FACTORY.objectNode();
- final ObjectNode fieldNode = JSON_NODE_FACTORY.objectNode();
- fieldNode.put(ESDriverConfig.FIELD, columnName);
- aggMeasures.put(ESDriverConfig.AGGREGATIONS.get(aggregationType), fieldNode);
- aggNode.put(aliasName, aggMeasures);
+ Aggregations.getFor(aggregationType)
+ .build(aggNode, columnName, aliasName);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4afce1fd/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/impl/ESCriteriaVisitor.java
----------------------------------------------------------------------
diff --git a/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/impl/ESCriteriaVisitor.java b/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/impl/ESCriteriaVisitor.java
index fbc606b..d1bf2a4 100644
--- a/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/impl/ESCriteriaVisitor.java
+++ b/lens-driver-es/src/main/java/org/apache/lens/driver/es/translator/impl/ESCriteriaVisitor.java
@@ -20,15 +20,15 @@ package org.apache.lens.driver.es.translator.impl;
import java.util.List;
-import org.apache.lens.driver.es.ESDriverConfig;
import org.apache.lens.driver.es.exceptions.InvalidQueryException;
+import org.apache.lens.driver.es.grammar.LogicalOperators;
+import org.apache.lens.driver.es.grammar.Predicates;
import org.apache.lens.driver.es.translator.ASTCriteriaVisitor;
-import org.apache.commons.lang.Validate;
-
-import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Lists;
public final class ESCriteriaVisitor implements ASTCriteriaVisitor {
@@ -38,63 +38,34 @@ public final class ESCriteriaVisitor implements ASTCriteriaVisitor {
private ObjectNode node = jsonNodeFactory.objectNode();
@Override
- public void visitLogicalOp(String logicalOp, List<ASTCriteriaVisitor> visitedSubTrees) {
- final ArrayNode subTrees = jsonNodeFactory.arrayNode();
- for (ASTCriteriaVisitor criteriaVisitor : visitedSubTrees) {
- subTrees.add(((ESCriteriaVisitor) criteriaVisitor).node);
- }
- node.put(ESDriverConfig.LOGICAL_OPS.get(logicalOp), subTrees);
- }
-
- @Override
- public void visitUnaryLogicalOp(String logicalOp, ASTCriteriaVisitor visitedSubTree) {
- node.put(ESDriverConfig.LOGICAL_OPS.get(logicalOp), ((ESCriteriaVisitor) visitedSubTree).node);
+ public void visitLogicalOp(String logicalOp, List<ASTCriteriaVisitor> visitedSubTrees) throws InvalidQueryException {
+ LogicalOperators.getFor(logicalOp)
+ .build(node, collectNodesFromVisitors(visitedSubTrees));
}
@Override
public void visitPredicate(String predicateOp, String leftColCanonical, List<String> rightExps)
throws InvalidQueryException {
final String leftCol = visitColumn(leftColCanonical);
- String elasticPredicateOp = ESDriverConfig.PREDICATES.get(predicateOp);
- if (elasticPredicateOp.equals(ESDriverConfig.TERM)) {
- final ObjectNode termNode = jsonNodeFactory.objectNode();
- termNode.put(leftCol, removeSingleQuotesFromLiteral(rightExps.get(0)));
- node.put(ESDriverConfig.TERM, termNode);
- } else if (elasticPredicateOp.equals(ESDriverConfig.TERMS)) {
- final ObjectNode termsNode = jsonNodeFactory.objectNode();
- final ArrayNode arrayNode = jsonNodeFactory.arrayNode();
- for (String right : rightExps) {
- arrayNode.add(removeSingleQuotesFromLiteral(right));
- }
- termsNode.put(leftCol, arrayNode);
- node.put(ESDriverConfig.TERMS, termsNode);
- } else if (ESDriverConfig.RANGE_PREDICATES.containsValue(elasticPredicateOp)) {
- final ObjectNode rangeNode = jsonNodeFactory.objectNode();
- final ObjectNode rangeInnerNode = jsonNodeFactory.objectNode();
- if (predicateOp.equals("between")) {
- Validate.isTrue(rightExps.size() == 2);
- rangeInnerNode.put("gt", removeSingleQuotesFromLiteral(rightExps.get(0)));
- rangeInnerNode.put("lt", removeSingleQuotesFromLiteral(rightExps.get(1)));
- } else {
- rangeInnerNode.put(elasticPredicateOp, removeSingleQuotesFromLiteral(rightExps.get(0)));
- }
- rangeNode.put(leftCol, rangeInnerNode);
- node.put(ESDriverConfig.RANGE, rangeNode);
- } else {
- throw new InvalidQueryException("No handlers for the registered predicate" + predicateOp);
- }
+ Predicates.getFor(predicateOp)
+ .build(node, leftCol, rightExps);
}
public ObjectNode getNode() {
return node;
}
+ private static List<JsonNode> collectNodesFromVisitors(List<ASTCriteriaVisitor> visitedSubTrees) {
+ final List<JsonNode> subTrees = Lists.newArrayList();
+ for(ASTCriteriaVisitor visitor: visitedSubTrees) {
+ subTrees.add(((ESCriteriaVisitor)visitor).node);
+ }
+ return subTrees;
+ }
+
private static String visitColumn(String cannonicalColName) {
final String[] colParts = cannonicalColName.split("\\.");
return colParts[colParts.length - 1];
}
- private static String removeSingleQuotesFromLiteral(String rightExp) {
- return rightExp.replaceAll("^\'|\'$", "");
- }
}
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4afce1fd/lens-driver-es/src/test/resources/valid-queries.data
----------------------------------------------------------------------
diff --git a/lens-driver-es/src/test/resources/valid-queries.data b/lens-driver-es/src/test/resources/valid-queries.data
index 46de030..f4ad15b 100644
--- a/lens-driver-es/src/test/resources/valid-queries.data
+++ b/lens-driver-es/src/test/resources/valid-queries.data
@@ -82,5 +82,20 @@
"name" : "Group by with multiple aggregation and complex criteria, select order jumbled",
"hql" : "select count(col1), col2, max(col3) from index.type where !(col1=5 and col2='p' and col3='wer' or (col4='9')) group by col2",
"expectedJson" : {"size":0,"timeout":10000,"aggs":{"filter_wrapper":{"aggs":{"col2":{"terms":{"field":"col2","size":100},"aggs":{"col1":{"value_count":{"field":"col1"}},"col3":{"max":{"field":"col3"}}}}},"filter":{"not":{"or":[{"and":[{"and":[{"term":{"col1":"5"}},{"term":{"col2":"p"}}]},{"term":{"col3":"wer"}}]},{"term":{"col4":"9"}}]}}}}}
+ },
+ {
+ "name" : "Check in predicate",
+ "hql" : "select col1 from index.type where col2 in ('val1', 'val2')",
+ "expectedJson" : {"from":0,"size":10000,"fields":["col1"],"sort":[],"timeout":10000,"filter":{"terms":{"col2":["val1","val2"]}}}
+ },
+ {
+ "name" : "Check not in predicate",
+ "hql" : "select col1 from index.type where col2 not in ('val1', 'val2')",
+ "expectedJson" : {"from":0,"size":10000,"fields":["col1"],"sort":[],"timeout":10000,"filter":{"not":{"terms":{"col2":["val1","val2"]}}}}
+ },
+ {
+ "name" : "Check not equals predicate",
+ "hql" : "select col1 from index.type where col2 != 'val1'",
+ "expectedJson" : {"from":0,"size":10000,"fields":["col1"],"sort":[],"timeout":10000,"filter":{"not":{"term":{"col2":"val1"}}}}
}
-]
+]
\ No newline at end of file