623bcfb17cbcc0d908be3d8a80348937449b8bab
[hive.git] / ql / src / gen / vectorization / ExpressionTemplates / ColumnDivideColumnDecimal.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.DecimalColumnVector;
23 import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
24 import org.apache.hadoop.hive.ql.exec.vector.expressions.NullUtil;
25 import org.apache.hadoop.hive.ql.exec.vector.expressions.DecimalUtil;
26 import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
27 import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
28
29 /**
30  * Generated from template ColumnArithmeticColumnDecimal.txt, which covers binary arithmetic
31  * expressions between a column and a scalar.
32  */
33 public class <ClassName> extends VectorExpression {
34
35   private static final long serialVersionUID = 1L;
36
37   private int colNum1;
38   private int colNum2;
39   private int outputColumn;
40
41   public <ClassName>(int colNum1, int colNum2, int outputColumn) {
42     this.colNum1 = colNum1;
43     this.colNum2 = colNum2;
44     this.outputColumn = outputColumn;
45     this.outputType = "decimal";
46   }
47
48   public <ClassName>() {
49     this.outputType = "decimal";
50   }
51
52   @Override
53   public void evaluate(VectorizedRowBatch batch) {
54
55     if (childExpressions != null) {
56       super.evaluateChildren(batch);
57     }
58
59     DecimalColumnVector inputColVector1 = (DecimalColumnVector) batch.cols[colNum1];
60     DecimalColumnVector inputColVector2 = (DecimalColumnVector) batch.cols[colNum2];
61     DecimalColumnVector outputColVector = (DecimalColumnVector) batch.cols[outputColumn];
62     int[] sel = batch.selected;
63     int n = batch.size;
64     HiveDecimalWritable[] vector1 = inputColVector1.vector;
65     HiveDecimalWritable[] vector2 = inputColVector2.vector;
66
67     // return immediately if batch is empty
68     if (n == 0) {
69       return;
70     }
71
72     outputColVector.isRepeating =
73          inputColVector1.isRepeating && inputColVector2.isRepeating
74       || inputColVector1.isRepeating && !inputColVector1.noNulls && inputColVector1.isNull[0]
75       || inputColVector2.isRepeating && !inputColVector2.noNulls && inputColVector2.isNull[0];
76
77     if (inputColVector1.noNulls && inputColVector2.noNulls) {
78
79      /* Initialize output vector NULL values to false. This is necessary
80       * since the decimal operation may produce a NULL result even for
81       * a non-null input vector value, and convert the output vector
82       * to have noNulls = false;
83       */
84       NullUtil.initOutputNullsToFalse(outputColVector,
85           inputColVector1.isRepeating && inputColVector2.isRepeating,
86           batch.selectedInUse, sel, n);
87     }
88
89     // Handle nulls first
90     NullUtil.propagateNullsColCol(
91       inputColVector1, inputColVector2, outputColVector, sel, n, batch.selectedInUse);
92
93     /* Disregard nulls for processing. In other words,
94      * the arithmetic operation is performed even if one or
95      * more inputs are null. This is to improve speed by avoiding
96      * conditional checks in the inner loop.
97      */
98     if (inputColVector1.isRepeating && inputColVector2.isRepeating) {
99       DecimalUtil.<Operator>Checked(0, vector1[0], vector2[0], outputColVector);
100     } else if (inputColVector1.isRepeating) {
101       if (batch.selectedInUse) {
102         for(int j = 0; j != n; j++) {
103           int i = sel[j];
104           DecimalUtil.<Operator>Checked(i, vector1[0], vector2[i], outputColVector);
105         }
106       } else {
107         for(int i = 0; i != n; i++) {
108           DecimalUtil.<Operator>Checked(i, vector1[0], vector2[i], outputColVector);
109         }
110       }
111     } else if (inputColVector2.isRepeating) {
112       if (batch.selectedInUse) {
113         for(int j = 0; j != n; j++) {
114           int i = sel[j];
115           DecimalUtil.<Operator>Checked(i, vector1[i], vector2[0], outputColVector);
116         }
117       } else {
118         for(int i = 0; i != n; i++) {
119           DecimalUtil.<Operator>Checked(i, vector1[i], vector2[0], outputColVector);
120         }
121       }
122     } else {
123       if (batch.selectedInUse) {
124         for(int j = 0; j != n; j++) {
125           int i = sel[j];
126           DecimalUtil.<Operator>Checked(i, vector1[i], vector2[i], outputColVector);
127         }
128       } else {
129         for(int i = 0; i != n; i++) {
130           DecimalUtil.<Operator>Checked(i, vector1[i], vector2[i], outputColVector);
131         }
132       }
133     }
134   }
135
136   @Override
137   public int getOutputColumn() {
138     return outputColumn;
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("decimal"),
149             VectorExpressionDescriptor.ArgumentType.getType("decimal"))
150         .setInputExpressionTypes(
151             VectorExpressionDescriptor.InputExpressionType.COLUMN,
152             VectorExpressionDescriptor.InputExpressionType.COLUMN).build();
153   }
154 }