You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by sp...@apache.org on 2015/05/20 18:01:50 UTC

[31/50] [abbrv] hive git commit: HIVE-10190: CBO: AST mode checks for TABLESAMPLE with AST.toString().contains("TOK_TABLESPLITSAMPLE")

HIVE-10190: CBO: AST mode checks for TABLESAMPLE with AST.toString().contains("TOK_TABLESPLITSAMPLE")


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/037559fd
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/037559fd
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/037559fd

Branch: refs/heads/parquet
Commit: 037559fd74c1a2d3ab6eee094ebce7934f3b9f39
Parents: b28d394
Author: Sergio Pena <se...@cloudera.com>
Authored: Mon May 18 10:06:38 2015 -0500
Committer: Sergio Pena <se...@cloudera.com>
Committed: Mon May 18 10:06:38 2015 -0500

----------------------------------------------------------------------
 .../ql/optimizer/calcite/HiveCalciteUtil.java   | 14 +++----
 .../apache/hadoop/hive/ql/parse/ParseUtils.java | 42 ++++++++++++++++++--
 2 files changed, 45 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/037559fd/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
index 372c93d..f4e7c45 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
@@ -58,6 +58,8 @@ import org.apache.hadoop.hive.ql.metadata.VirtualColumn;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveProject;
 import org.apache.hadoop.hive.ql.optimizer.calcite.translator.ExprNodeConverter;
 import org.apache.hadoop.hive.ql.parse.ASTNode;
+import org.apache.hadoop.hive.ql.parse.HiveParser;
+import org.apache.hadoop.hive.ql.parse.ParseUtils;
 import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
 
 import com.google.common.base.Function;
@@ -95,15 +97,11 @@ public class HiveCalciteUtil {
   }
 
   public static boolean validateASTForUnsupportedTokens(ASTNode ast) {
-    String astTree = ast.toStringTree();
-    // if any of following tokens are present in AST, bail out
-    String[] tokens = { "TOK_CHARSETLITERAL", "TOK_TABLESPLITSAMPLE" };
-    for (String token : tokens) {
-      if (astTree.contains(token)) {
-        return false;
-      }
+    if (ParseUtils.containsTokenOfType(ast, HiveParser.TOK_CHARSETLITERAL, HiveParser.TOK_TABLESPLITSAMPLE)) {
+      return false;
+    } else {
+      return true;
     }
-    return true;
   }
 
   public static List<RexNode> getProjsFromBelowAsInputRef(final RelNode rel) {

http://git-wip-us.apache.org/repos/asf/hive/blob/037559fd/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseUtils.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseUtils.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseUtils.java
index 373429c..18f0180 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseUtils.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseUtils.java
@@ -18,15 +18,15 @@
 
 package org.apache.hadoop.hive.ql.parse;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
 import org.apache.hadoop.hive.common.JavaUtils;
 import org.apache.hadoop.hive.common.type.HiveDecimal;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.ql.ErrorMsg;
+import org.apache.hadoop.hive.ql.exec.PTFUtils;
 import org.apache.hadoop.hive.ql.exec.Utilities;
+import org.apache.hadoop.hive.ql.lib.Node;
 import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
 import org.apache.hadoop.hive.serde2.typeinfo.CharTypeInfo;
 import org.apache.hadoop.hive.serde2.typeinfo.DecimalTypeInfo;
@@ -229,5 +229,41 @@ public final class ParseUtils {
     return className;
   }
 
+  public static boolean containsTokenOfType(ASTNode root, Integer ... tokens) {
+      final Set<Integer> tokensToMatch = new HashSet<Integer>();
+      for (Integer tokenTypeToMatch : tokens) {
+          tokensToMatch.add(tokenTypeToMatch);
+        }
+
+        return ParseUtils.containsTokenOfType(root, new PTFUtils.Predicate<ASTNode>() {
+          @Override
+          public boolean apply(ASTNode node) {
+              return tokensToMatch.contains(node.getType());
+            }
+        });
+    }
+
+    public static boolean containsTokenOfType(ASTNode root, PTFUtils.Predicate<ASTNode> predicate) {
+      Queue<ASTNode> queue = new ArrayDeque<ASTNode>();
+
+      // BFS
+      queue.add(root);
+      while (!queue.isEmpty())  {
+        ASTNode current = queue.remove();
+        // If the predicate matches, then return true.
+        // Otherwise visit the next set of nodes that haven't been seen.
+        if (predicate.apply(current)) {
+          return true;
+        } else {
+          // Guard because ASTNode.getChildren.iterator returns null if no children available (bug).
+          if (current.getChildCount() > 0) {
+            for (Node child : current.getChildren()) {
+              queue.add((ASTNode) child);
+            }
+          }
+        }
+      }
 
+      return false;
+    }
 }