0b7fefc5a6f409f46687f8813843a9597a6bcc0f
[hive.git] / ql / src / gen / vectorization / ExpressionTemplates / DecimalColumnUnaryFunc.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 org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression;
22 import org.apache.hadoop.hive.ql.exec.vector.expressions.MathExpr;
23 import org.apache.hadoop.hive.ql.exec.vector.*;
24 import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
25 import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
26 import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
27 import org.apache.hadoop.hive.ql.exec.vector.DecimalColumnVector;
28 import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
29 import org.apache.hadoop.hive.ql.exec.vector.expressions.DecimalUtil;
30 import java.util.Arrays;
31
32 public class <ClassName> extends VectorExpression {
33   private static final long serialVersionUID = 1L;
34
35   private int colNum;
36   private int outputColumn;
37
38   public <ClassName>(int colNum, int outputColumn) {
39     this();
40     this.colNum = colNum;
41     this.outputColumn = outputColumn;
42   }
43   
44   public <ClassName>() {
45     super();
46   }
47
48   @Override
49   public void evaluate(VectorizedRowBatch batch) {
50
51     if (childExpressions != null) {
52       this.evaluateChildren(batch);
53     }
54
55     DecimalColumnVector inputColVector = (DecimalColumnVector) batch.cols[colNum];
56     <OutputColumnVectorType> outputColVector = (<OutputColumnVectorType>) batch.cols[outputColumn];
57     int[] sel = batch.selected;
58     boolean[] inputIsNull = inputColVector.isNull;
59     boolean[] outputIsNull = outputColVector.isNull;
60     outputColVector.noNulls = inputColVector.noNulls;
61     int n = batch.size;
62     HiveDecimalWritable[] vector = inputColVector.vector;
63
64     // return immediately if batch is empty
65     if (n == 0) {
66       return;
67     }
68
69     if (inputColVector.isRepeating) {
70
71       // All must be selected otherwise size would be zero
72       // Repeating property will not change.
73       outputIsNull[0] = inputIsNull[0];
74       <FuncName>(0, vector[0], outputColVector);
75       outputColVector.isRepeating = true;
76     } else if (inputColVector.noNulls) {
77       if (batch.selectedInUse) {
78         for(int j = 0; j != n; j++) {
79           int i = sel[j];
80
81           // Set isNull because decimal operation can yield a null.
82           outputIsNull[i] = false;
83           <FuncName>(i, vector[i], outputColVector);
84         }
85       } else {
86
87         // Set isNull because decimal operation can yield a null.
88         Arrays.fill(outputIsNull, 0, n, false);
89         for(int i = 0; i != n; i++) {
90           <FuncName>(i, vector[i], outputColVector);
91         }
92       }
93       outputColVector.isRepeating = false;
94     } else /* there are nulls */ {
95       if (batch.selectedInUse) {
96         for(int j = 0; j != n; j++) {
97           int i = sel[j];
98           outputIsNull[i] = inputIsNull[i];
99           <FuncName>(i, vector[i], outputColVector);
100         }
101       } else {
102         System.arraycopy(inputIsNull, 0, outputIsNull, 0, n);
103         for(int i = 0; i != n; i++) {
104           <FuncName>(i, vector[i], outputColVector);
105         }
106       }
107       outputColVector.isRepeating = false;
108     }
109   }
110
111   @Override
112   public int getOutputColumn() {
113     return outputColumn;
114   }
115   
116   @Override
117   public String getOutputType() {
118     return outputType;
119   }
120
121   @Override
122   public String vectorExpressionParameters() {
123     return "col " + colNum;
124   }
125
126   @Override
127   public VectorExpressionDescriptor.Descriptor getDescriptor() {
128     return (new VectorExpressionDescriptor.Builder())
129         .setMode(
130             VectorExpressionDescriptor.Mode.PROJECTION)
131         .setNumArguments(1)
132         .setArgumentTypes(
133             VectorExpressionDescriptor.ArgumentType.DECIMAL)
134         .setInputExpressionTypes(
135             VectorExpressionDescriptor.InputExpressionType.COLUMN).build();
136   }
137 }