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