3a75a26c33823a6eb6e5c994a256ab0f28aa7896
[hive.git] / ql / src / gen / vectorization / ExpressionTemplates / IfExprColumnScalar.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.LongColumnVector;
23 import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector;
24 import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
25 import org.apache.hadoop.hive.ql.exec.vector.expressions.NullUtil;
26 import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
27
28 /**
29  * Compute IF(expr1, expr2, expr3) for 3 input column expressions.
30  * The first is always a boolean (LongColumnVector).
31  * The second is a column or non-constant expression result.
32  * The third is a constant value.
33  */
34 public class <ClassName> extends VectorExpression {
35
36   private static final long serialVersionUID = 1L;
37
38   private int arg1Column, arg2Column;
39   private <OperandType3> arg3Scalar;
40   private int outputColumn;
41
42   public <ClassName>(int arg1Column, int arg2Column, <OperandType3> arg3Scalar,
43       int outputColumn) {
44     this.arg1Column = arg1Column;
45     this.arg2Column = arg2Column;
46     this.arg3Scalar = arg3Scalar;
47     this.outputColumn = outputColumn;
48   }
49
50   public <ClassName>() {
51   }
52
53   @Override
54   public void evaluate(VectorizedRowBatch batch) {
55
56     if (childExpressions != null) {
57       super.evaluateChildren(batch);
58     }
59
60     LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column];
61     <Arg2ColumnVectorType> arg2ColVector = (<Arg2ColumnVectorType>) batch.cols[arg2Column];
62     <OutputColumnVectorType> outputColVector = (<OutputColumnVectorType>) batch.cols[outputColumn];
63     int[] sel = batch.selected;
64     boolean[] outputIsNull = outputColVector.isNull;
65     outputColVector.noNulls = arg2ColVector.noNulls; // nulls can only come from arg2
66     outputColVector.isRepeating = false; // may override later
67     int n = batch.size;
68     long[] vector1 = arg1ColVector.vector;
69     <OperandType2>[] vector2 = arg2ColVector.vector;
70     <ReturnType>[] outputVector = outputColVector.vector;
71
72     // return immediately if batch is empty
73     if (n == 0) {
74       return;
75     }
76
77     if (arg1ColVector.isRepeating) {
78       if (vector1[0] == 1) {
79         arg2ColVector.copySelected(batch.selectedInUse, sel, n, outputColVector);
80       } else {
81         outputColVector.fill(arg3Scalar);
82       }
83       return;
84     }
85
86     // Extend any repeating values and noNulls indicator in the inputs to
87     // reduce the number of code paths needed below.
88     arg2ColVector.flatten(batch.selectedInUse, sel, n);
89
90     if (arg1ColVector.noNulls) {
91       if (batch.selectedInUse) {
92         for(int j = 0; j != n; j++) {
93           int i = sel[j];
94           outputVector[i] = (vector1[i] == 1 ? vector2[i] : arg3Scalar);
95         }
96       } else {
97         for(int i = 0; i != n; i++) {
98           outputVector[i] = (vector1[i] == 1 ? vector2[i] : arg3Scalar);
99         }
100       }
101     } else /* there are nulls */ {
102       if (batch.selectedInUse) {
103         for(int j = 0; j != n; j++) {
104           int i = sel[j];
105           outputVector[i] = (!arg1ColVector.isNull[i] && vector1[i] == 1 ?
106               vector2[i] : arg3Scalar);
107           outputIsNull[i] = (!arg1ColVector.isNull[i] && vector1[i] == 1 ?
108               arg2ColVector.isNull[i] : false);
109         }
110       } else {
111         for(int i = 0; i != n; i++) {
112           outputVector[i] = (!arg1ColVector.isNull[i] && vector1[i] == 1 ?
113               vector2[i] : arg3Scalar);
114           outputIsNull[i] = (!arg1ColVector.isNull[i] && vector1[i] == 1 ?
115               arg2ColVector.isNull[i] : false);
116         }
117       }
118     }
119
120     // restore repeating and no nulls indicators
121     arg2ColVector.unFlatten();
122   }
123
124   @Override
125   public int getOutputColumn() {
126     return outputColumn;
127   }
128
129   @Override
130   public String getOutputType() {
131     return "<ReturnType>";
132   }
133
134   public int getArg1Column() {
135     return arg1Column;
136   }
137
138   public void setArg1Column(int colNum) {
139     this.arg1Column = colNum;
140   }
141
142   public int getArg2Column() {
143     return arg2Column;
144   }
145
146   public void setArg2Column(int colNum) {
147     this.arg2Column = colNum;
148   }
149
150   public <OperandType3> getArg3Scalar() {
151     return arg3Scalar;
152   }
153
154   public void setArg3Scalar(<OperandType3> value) {
155     this.arg3Scalar = value;
156   }
157
158   public void setOutputColumn(int outputColumn) {
159     this.outputColumn = outputColumn;
160   }
161
162   @Override
163   public VectorExpressionDescriptor.Descriptor getDescriptor() {
164     return (new VectorExpressionDescriptor.Builder())
165         .setMode(
166             VectorExpressionDescriptor.Mode.PROJECTION)
167         .setNumArguments(3)
168         .setArgumentTypes(
169             VectorExpressionDescriptor.ArgumentType.getType("long"),
170             VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType2>"),
171             VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType3>"))
172         .setInputExpressionTypes(
173             VectorExpressionDescriptor.InputExpressionType.COLUMN,
174             VectorExpressionDescriptor.InputExpressionType.COLUMN,
175             VectorExpressionDescriptor.InputExpressionType.SCALAR).build();
176   }
177 }