Author: hashutosh
Date: Sat Nov  9 16:30:44 2013
New Revision: 1540340

URL: http://svn.apache.org/r1540340
Log:
HIVE-5699 : Add unit test for vectorized BETWEEN for timestamp inputs (Eric 
Hanson via Ashutosh Chauhan)

Modified:
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
    
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/TestVectorizationContext.java
    
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorFilterExpressions.java

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java?rev=1540340&r1=1540339&r2=1540340&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
 Sat Nov  9 16:30:44 2013
@@ -35,6 +35,7 @@ import org.apache.hadoop.hive.ql.exec.Ex
 import org.apache.hadoop.hive.ql.exec.FunctionInfo;
 import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
 import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.exec.vector.TimestampUtils;
 import 
org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor.InputExpressionType;
 import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor.Mode;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.*;
@@ -557,7 +558,7 @@ public class VectorizationContext {
       List<ExprNodeDesc> childExpr, Mode mode) throws HiveException {
     //First handle special cases
     if (udf instanceof GenericUDFBetween) {
-      return getBetweenFilterExpression(childExpr);
+      return getBetweenFilterExpression(childExpr, mode);
     } else if (udf instanceof GenericUDFIn) {
       return getInFilterExpression(childExpr);
     } else if (udf instanceof GenericUDFBridge) {
@@ -757,9 +758,16 @@ public class VectorizationContext {
    * needs to be done differently than the standard way where all arguments are
    * passed to the VectorExpression constructor.
    */
-  private VectorExpression getBetweenFilterExpression(List<ExprNodeDesc> 
childExpr)
+  private VectorExpression getBetweenFilterExpression(List<ExprNodeDesc> 
childExpr, Mode mode)
       throws HiveException {
 
+    if (mode == Mode.PROJECTION) {
+
+      // Projection mode is not yet supported for [NOT] BETWEEN. Return null 
so Vectorizer
+      // knows to revert to row-at-a-time execution.
+      return null;
+    }
+
     boolean notKeywordPresent = (Boolean) ((ExprNodeConstantDesc) 
childExpr.get(0)).getValue();
     ExprNodeDesc colExpr = childExpr.get(1);
 
@@ -1000,10 +1008,7 @@ public class VectorizationContext {
       throw new HiveException("Udf: failed to convert to timestamp");
     }
     Timestamp ts = (Timestamp) java;
-    long result = ts.getTime();
-    result *= 1000000;    // shift left 6 digits to make room for nanos below 
ms precision
-    result += ts.getNanos() % 1000000;     // add in nanos, after removing the 
ms portion
-    return result;
+    return TimestampUtils.getTimeNanoSec(ts);
   }
 
   private Constructor<?> getConstructor(Class<?> cl) throws HiveException {

Modified: 
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/TestVectorizationContext.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/TestVectorizationContext.java?rev=1540340&r1=1540339&r2=1540340&view=diff
==============================================================================
--- 
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/TestVectorizationContext.java
 (original)
+++ 
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/TestVectorizationContext.java
 Sat Nov  9 16:30:44 2013
@@ -21,6 +21,7 @@ package org.apache.hadoop.hive.ql.exec.v
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -942,6 +943,19 @@ public class TestVectorizationContext {
     children1.set(0, new ExprNodeConstantDesc(new Boolean(true)));
     ve = vc.getVectorExpression(exprDesc, 
VectorExpressionDescriptor.Mode.FILTER);
     assertTrue(ve instanceof FilterDoubleColumnNotBetween);
+
+    // timestamp BETWEEN
+    children1.set(0, new ExprNodeConstantDesc(new Boolean(false)));
+    children1.set(1, new ExprNodeColumnDesc(Timestamp.class, "col1", "table", 
false));
+    children1.set(2, new ExprNodeConstantDesc("2013-11-05 00:00:00.000"));
+    children1.set(3, new ExprNodeConstantDesc("2013-11-06 00:00:00.000"));
+    ve = vc.getVectorExpression(exprDesc, 
VectorExpressionDescriptor.Mode.FILTER);
+    assertTrue(ve instanceof FilterLongColumnBetween);
+
+    // timestamp NOT BETWEEN
+    children1.set(0, new ExprNodeConstantDesc(new Boolean(true)));
+    ve = vc.getVectorExpression(exprDesc, 
VectorExpressionDescriptor.Mode.FILTER);
+    assertTrue(ve instanceof FilterLongColumnNotBetween);
   }
 
   @Test

Modified: 
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorFilterExpressions.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorFilterExpressions.java?rev=1540340&r1=1540339&r2=1540340&view=diff
==============================================================================
--- 
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorFilterExpressions.java
 (original)
+++ 
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorFilterExpressions.java
 Sat Nov  9 16:30:44 2013
@@ -22,9 +22,12 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import java.sql.Timestamp;
+
 import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
 import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector;
 import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.TimestampUtils;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
 import 
org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FilterDoubleColumnBetween;
 import 
org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FilterDoubleColumnNotBetween;
@@ -544,6 +547,59 @@ public class TestVectorFilterExpressions
     assertEquals(0, vrb.selected[0]);
   }
 
+  @Test
+  public void testFilterTimestampBetween() {
+    int seed = 17;
+    VectorizedRowBatch vrb = VectorizedRowGroupGenUtil.getVectorizedRowBatch(
+        5, 2, seed);
+    LongColumnVector lcv0 = (LongColumnVector) vrb.cols[0];
+    long startTS = 0; // the epoch
+    long endTS = TimestampUtils.getTimeNanoSec(
+        Timestamp.valueOf("2013-11-05 00:00:00.000000000"));
+
+    Timestamp ts0 = Timestamp.valueOf("1963-11-06 00:00:00.000");
+    lcv0.vector[0] = TimestampUtils.getTimeNanoSec(ts0);
+    Timestamp ts1 = Timestamp.valueOf("1983-11-06 00:00:00.000");
+    lcv0.vector[1] = TimestampUtils.getTimeNanoSec(ts1);
+    Timestamp ts2 = Timestamp.valueOf("2099-11-06 00:00:00.000");
+    lcv0.vector[2] = TimestampUtils.getTimeNanoSec(ts2);
+    vrb.size = 3;
+
+    VectorExpression expr1 = new FilterLongColumnBetween(0, startTS, endTS);
+    expr1.evaluate(vrb);
+    assertEquals(1, vrb.size);
+    assertEquals(true, vrb.selectedInUse);
+    assertEquals(1, vrb.selected[0]);
+  }
+
+  @Test
+  public void testFilterTimestampNotBetween() {
+    int seed = 17;
+    VectorizedRowBatch vrb = VectorizedRowGroupGenUtil.getVectorizedRowBatch(
+        5, 2, seed);
+    LongColumnVector lcv0 = (LongColumnVector) vrb.cols[0];
+    long startTS = TimestampUtils.getTimeNanoSec(
+        Timestamp.valueOf("2013-11-05 00:00:00.000000000"));
+    long endTS = TimestampUtils.getTimeNanoSec(
+        Timestamp.valueOf("2013-11-05 00:00:00.000000010"));
+
+    Timestamp ts0 = Timestamp.valueOf("2013-11-04 00:00:00.000000000");
+    lcv0.vector[0] = TimestampUtils.getTimeNanoSec(ts0);
+    Timestamp ts1 = Timestamp.valueOf("2013-11-05 00:00:00.000000002");
+    lcv0.vector[1] = TimestampUtils.getTimeNanoSec(ts1);
+    Timestamp ts2 = Timestamp.valueOf("2099-11-06 00:00:00.000");
+    lcv0.vector[2] = TimestampUtils.getTimeNanoSec(ts2);
+    vrb.size = 3;
+
+    VectorExpression expr1 = new FilterLongColumnNotBetween(0, startTS, endTS);
+    expr1.evaluate(vrb);
+    assertEquals(2, vrb.size);
+    assertEquals(true, vrb.selectedInUse);
+    assertEquals(0, vrb.selected[0]);
+    assertEquals(2, vrb.selected[1]);
+
+  }
+
   /**
    * Test the IN filter VectorExpression classes.
    */


Reply via email to