You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by br...@apache.org on 2013/07/31 20:41:10 UTC

svn commit: r1508984 - in /hive/trunk/ql/src: java/org/apache/hadoop/hive/ql/exec/ java/org/apache/hadoop/hive/ql/parse/ java/org/apache/hadoop/hive/ql/udf/generic/ test/org/apache/hadoop/hive/ql/exec/

Author: brock
Date: Wed Jul 31 18:41:09 2013
New Revision: 1508984

URL: http://svn.apache.org/r1508984
Log:
HIVE-4954: PTFTranslator hardcodes ranking functions (Edward Capriolo via Brock Noland)

Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/WindowFunctionDescription.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/PTFTranslator.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFCumeDist.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFDenseRank.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFPercentRank.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFRank.java
    hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java?rev=1508984&r1=1508983&r2=1508984&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java Wed Jul 31 18:41:09 2013
@@ -1480,4 +1480,23 @@ public final class FunctionRegistry {
     mFunctions.put(name.toLowerCase(), tInfo);
   }
 
+  /**
+   * Use this to check if function is ranking function
+   *
+   * @param name
+   *          name of a function
+   * @return true if function is a UDAF, has WindowFunctionDescription annotation and the annotations
+   *         confirms a ranking function, false otherwise
+   */
+  public static boolean isRankingFunction(String name){
+    FunctionInfo info = mFunctions.get(name.toLowerCase());
+    GenericUDAFResolver res = info.getGenericUDAFResolver();
+    if (res != null){
+      WindowFunctionDescription desc = res.getClass().getAnnotation(WindowFunctionDescription.class);
+      if (desc != null){
+        return desc.rankingFunction();
+      }
+    }
+    return false;
+  }
 }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/WindowFunctionDescription.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/WindowFunctionDescription.java?rev=1508984&r1=1508983&r2=1508984&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/WindowFunctionDescription.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/WindowFunctionDescription.java Wed Jul 31 18:41:09 2013
@@ -50,5 +50,11 @@ public @interface WindowFunctionDescript
 	 * for all the rows.
 	 */
 	boolean pivotResult() default false;
+
+	/**
+	 * Used in translations process to validate arguments
+	 * @return true if ranking function
+	 */
+	boolean rankingFunction() default false;
 }
 

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/PTFTranslator.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/PTFTranslator.java?rev=1508984&r1=1508983&r2=1508984&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/PTFTranslator.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/PTFTranslator.java Wed Jul 31 18:41:09 2013
@@ -425,8 +425,7 @@ public class PTFTranslator {
       }
     }
 
-    if (RANKING_FUNCS.contains(spec.getName()))
-    {
+    if (FunctionRegistry.isRankingFunction(spec.getName())){
       setupRankingArgs(wdwTFnDef, def, spec);
     }
 
@@ -785,19 +784,6 @@ public class PTFTranslator {
     return combinedOrdExprs;
   }
 
-
-  /*
-   * Ranking Functions helpers
-   */
-
-  protected static final ArrayList<String> RANKING_FUNCS = new ArrayList<String>();
-  static {
-    RANKING_FUNCS.add("rank");
-    RANKING_FUNCS.add("dense_rank");
-    RANKING_FUNCS.add("percent_rank");
-    RANKING_FUNCS.add("cume_dist");
-  };
-
   private void setupRankingArgs(WindowTableFunctionDef wdwTFnDef,
       WindowFunctionDef wFnDef,
       WindowFunctionSpec wSpec)

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFCumeDist.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFCumeDist.java?rev=1508984&r1=1508983&r2=1508984&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFCumeDist.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFCumeDist.java Wed Jul 31 18:41:09 2013
@@ -43,7 +43,8 @@ import org.apache.hadoop.io.IntWritable;
 									"   and including x in the specified order/ N"
 								),
 		supportsWindow = false,
-		pivotResult = true
+		pivotResult = true,
+		rankingFunction = true
 )
 public class GenericUDAFCumeDist extends GenericUDAFRank
 {

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFDenseRank.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFDenseRank.java?rev=1508984&r1=1508983&r2=1508984&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFDenseRank.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFDenseRank.java Wed Jul 31 18:41:09 2013
@@ -34,7 +34,8 @@ import org.apache.hadoop.hive.ql.exec.Wi
 										"that the next person came in third."
 								),
 		supportsWindow = false,
-		pivotResult = true
+		pivotResult = true,
+		rankingFunction = true
 )
 public class GenericUDAFDenseRank extends GenericUDAFRank
 {

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFPercentRank.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFPercentRank.java?rev=1508984&r1=1508983&r2=1508984&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFPercentRank.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFPercentRank.java Wed Jul 31 18:41:09 2013
@@ -40,7 +40,8 @@ import org.apache.hadoop.io.IntWritable;
 									"(rank of row in its partition - 1) / (number of rows in the partition - 1)"
 								),
 		supportsWindow = false,
-		pivotResult = true
+		pivotResult = true,
+		rankingFunction = true
 )
 public class GenericUDAFPercentRank extends GenericUDAFRank
 {

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFRank.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFRank.java?rev=1508984&r1=1508983&r2=1508984&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFRank.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFRank.java Wed Jul 31 18:41:09 2013
@@ -44,7 +44,8 @@ import org.apache.hadoop.io.IntWritable;
 								value = "_FUNC_(x)"
 								),
 		supportsWindow = false,
-		pivotResult = true
+		pivotResult = true,
+		rankingFunction = true
 )
 public class GenericUDAFRank extends AbstractGenericUDAFResolver
 {

Modified: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java?rev=1508984&r1=1508983&r2=1508984&view=diff
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java (original)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java Wed Jul 31 18:41:09 2013
@@ -22,6 +22,7 @@ import java.lang.reflect.Method;
 import java.util.LinkedList;
 import java.util.List;
 
+import junit.framework.Assert;
 import junit.framework.TestCase;
 
 import org.apache.hadoop.hive.serde2.io.DateWritable;
@@ -146,4 +147,12 @@ public class TestFunctionRegistry extend
   @Override
   protected void tearDown() {
   }
+
+  public void testIsRankingFunction() {
+    Assert.assertTrue(FunctionRegistry.isRankingFunction("rank"));
+    Assert.assertTrue(FunctionRegistry.isRankingFunction("dense_rank"));
+    Assert.assertTrue(FunctionRegistry.isRankingFunction("percent_rank"));
+    Assert.assertTrue(FunctionRegistry.isRankingFunction("cume_dist"));
+    Assert.assertFalse(FunctionRegistry.isRankingFunction("min"));
+  }
 }