7aee529662f4d7bb8216dd3ea9cf9f5133a47ea4
[hive.git] / ql / src / gen / vectorization / ExpressionTemplates / DateColumnArithmeticTimestampScalar.txt
1 /**
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements.  See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership.  The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License.  You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18
19 package org.apache.hadoop.hive.ql.exec.vector.expressions.gen;
20
21 import java.sql.Timestamp;
22
23 import org.apache.hadoop.hive.common.type.HiveIntervalDayTime;
24 import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression;
25 import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
26 import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
27 import org.apache.hadoop.hive.ql.exec.vector.expressions.NullUtil;
28 import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
29 import org.apache.hadoop.hive.ql.exec.vector.*;
30 import org.apache.hadoop.hive.ql.util.DateTimeMath;
31 import org.apache.hadoop.hive.serde2.io.DateWritable;
32
33 /**
34  * Generated from template DateColumnArithmeticTimestampScalarBase.txt, a base class
35  * which covers binary arithmetic expressions between a date column and a timestamp scalar.
36  */
37 public class <ClassName> extends VectorExpression {
38
39   private static final long serialVersionUID = 1L;
40
41   private int colNum;
42   private <HiveOperandType2> value;
43   private int outputColumn;
44   private Timestamp scratchTimestamp1;
45   private DateTimeMath dtm = new DateTimeMath();
46
47   public <ClassName>(int colNum, <HiveOperandType2> value, int outputColumn) {
48     this.colNum = colNum;
49     this.value = value;
50     this.outputColumn = outputColumn;
51     scratchTimestamp1 = new Timestamp(0);
52   }
53
54   public <ClassName>() {
55   }
56
57   @Override
58   public void evaluate(VectorizedRowBatch batch) {
59
60     if (childExpressions != null) {
61       super.evaluateChildren(batch);
62     }
63
64     // Input #1 is type date (days).  For the math we convert it to a timestamp.
65     LongColumnVector inputColVector1 = (LongColumnVector) batch.cols[colNum];
66
67     // Output is type <ReturnType>.
68     <OutputColumnVectorType> outputColVector = (<OutputColumnVectorType>) batch.cols[outputColumn];
69
70     int[] sel = batch.selected;
71     boolean[] inputIsNull = inputColVector1.isNull;
72     boolean[] outputIsNull = outputColVector.isNull;
73     outputColVector.noNulls = inputColVector1.noNulls;
74     outputColVector.isRepeating = inputColVector1.isRepeating;
75     int n = batch.size;
76     long[] vector1 = inputColVector1.vector;
77
78     // return immediately if batch is empty
79     if (n == 0) {
80       return;
81     }
82
83     if (inputColVector1.isRepeating) {
84       scratchTimestamp1.setTime(DateWritable.daysToMillis((int) vector1[0]));
85       dtm.<OperatorMethod>(
86           scratchTimestamp1, value, outputColVector.getScratch<CamelReturnType>());
87       outputColVector.setFromScratch<CamelReturnType>(0);
88       // Even if there are no nulls, we always copy over entry 0. Simplifies code.
89       outputIsNull[0] = inputIsNull[0];
90     } else if (inputColVector1.noNulls) {
91       if (batch.selectedInUse) {
92         for(int j = 0; j != n; j++) {
93           int i = sel[j];
94           scratchTimestamp1.setTime(DateWritable.daysToMillis((int) vector1[i]));
95           dtm.<OperatorMethod>(
96              scratchTimestamp1, value, outputColVector.getScratch<CamelReturnType>());
97           outputColVector.setFromScratch<CamelReturnType>(i);
98         }
99       } else {
100         for(int i = 0; i != n; i++) {
101           scratchTimestamp1.setTime(DateWritable.daysToMillis((int) vector1[i]));
102           dtm.<OperatorMethod>(
103              scratchTimestamp1, value, outputColVector.getScratch<CamelReturnType>());
104           outputColVector.setFromScratch<CamelReturnType>(i);
105         }
106       }
107     } else /* there are nulls */ {
108       if (batch.selectedInUse) {
109         for(int j = 0; j != n; j++) {
110           int i = sel[j];
111           scratchTimestamp1.setTime(DateWritable.daysToMillis((int) vector1[i]));
112           dtm.<OperatorMethod>(
113              scratchTimestamp1, value, outputColVector.getScratch<CamelReturnType>());
114           outputColVector.setFromScratch<CamelReturnType>(i);
115           outputIsNull[i] = inputIsNull[i];
116         }
117       } else {
118         for(int i = 0; i != n; i++) {
119           scratchTimestamp1.setTime(DateWritable.daysToMillis((int) vector1[i]));
120           dtm.<OperatorMethod>(
121              scratchTimestamp1, value, outputColVector.getScratch<CamelReturnType>());
122           outputColVector.setFromScratch<CamelReturnType>(i);
123         }
124         System.arraycopy(inputIsNull, 0, outputIsNull, 0, n);
125       }
126     }
127
128     NullUtil.setNullOutputEntriesColScalar(outputColVector, batch.selectedInUse, sel, n);
129   }
130
131   @Override
132   public int getOutputColumn() {
133     return outputColumn;
134   }
135
136   @Override
137   public String getOutputType() {
138     return "<ReturnType>";
139   }
140
141   @Override
142   public VectorExpressionDescriptor.Descriptor getDescriptor() {
143     return (new VectorExpressionDescriptor.Builder())
144         .setMode(
145             VectorExpressionDescriptor.Mode.PROJECTION)
146         .setNumArguments(2)
147         .setArgumentTypes(
148             VectorExpressionDescriptor.ArgumentType.getType("date"),
149             VectorExpressionDescriptor.ArgumentType.getType("<OperandType2>"))
150         .setInputExpressionTypes(
151             VectorExpressionDescriptor.InputExpressionType.COLUMN,
152             VectorExpressionDescriptor.InputExpressionType.SCALAR).build();
153   }
154 }