5651d1584b7dc154522ebdd0938c4f1779bfec29
[hive.git] / ql / src / gen / vectorization / ExpressionTemplates / IfExprScalarScalar.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.VectorExpressionDescriptor;
26 import java.util.Arrays;
27
28 /**
29  * Compute IF(expr1, expr2, expr3) for 3 input  expressions.
30  * The first is always a boolean (LongColumnVector).
31  * The second is a constant value.
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;
39   private <OperandType2> arg2Scalar;
40   private <OperandType3> arg3Scalar;
41   private int outputColumn;
42
43   public <ClassName>(int arg1Column, <OperandType2> arg2Scalar, <OperandType3> arg3Scalar,
44       int outputColumn) {
45     this.arg1Column = arg1Column;
46     this.arg2Scalar = arg2Scalar;
47     this.arg3Scalar = arg3Scalar;
48     this.outputColumn = outputColumn;
49   }
50
51   public <ClassName>() {
52   }
53
54   @Override
55   public void evaluate(VectorizedRowBatch batch) {
56
57     if (childExpressions != null) {
58       super.evaluateChildren(batch);
59     }
60
61     LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column];
62     <OutputColumnVectorType> outputColVector = (<OutputColumnVectorType>) batch.cols[outputColumn];
63     int[] sel = batch.selected;
64     boolean[] outputIsNull = outputColVector.isNull;
65     outputColVector.noNulls = false; // output is a scalar which we know is non null
66     outputColVector.isRepeating = false; // may override later
67     int n = batch.size;
68     long[] vector1 = arg1ColVector.vector;
69     <ReturnType>[] outputVector = outputColVector.vector;
70
71     // return immediately if batch is empty
72     if (n == 0) {
73       return;
74     }
75
76     if (arg1ColVector.isRepeating) {
77       if (vector1[0] == 1) {
78         outputColVector.fill(arg2Scalar);
79       } else {
80         outputColVector.fill(arg3Scalar);
81       }
82     } else if (arg1ColVector.noNulls) {
83       if (batch.selectedInUse) {
84         for(int j = 0; j != n; j++) {
85           int i = sel[j];
86           outputVector[i] = (vector1[i] == 1 ? arg2Scalar : arg3Scalar);
87         }
88       } else {
89         for(int i = 0; i != n; i++) {
90           outputVector[i] = (vector1[i] == 1 ? arg2Scalar : arg3Scalar);
91         }
92       }
93     } else /* there are nulls */ {
94       if (batch.selectedInUse) {
95         for(int j = 0; j != n; j++) {
96           int i = sel[j];
97           outputVector[i] = (!arg1ColVector.isNull[i] && vector1[i] == 1 ?
98               arg2Scalar : arg3Scalar);
99           outputIsNull[i] = false;
100         }
101       } else {
102         for(int i = 0; i != n; i++) {
103           outputVector[i] = (!arg1ColVector.isNull[i] && vector1[i] == 1 ?
104               arg2Scalar : arg3Scalar);
105         }
106         Arrays.fill(outputIsNull, 0, n, false);
107       }
108     }
109   }
110
111   @Override
112   public int getOutputColumn() {
113     return outputColumn;
114   }
115
116   @Override
117   public String getOutputType() {
118     return "<ReturnType>";
119   }
120
121   public int getArg1Column() {
122     return arg1Column;
123   }
124
125   public void setArg1Column(int colNum) {
126     this.arg1Column = colNum;
127   }
128
129   public <OperandType2> getArg2Scalar() {
130     return arg2Scalar;
131   }
132
133   public void setArg2Scalar(<OperandType2> value) {
134     this.arg2Scalar = value;
135   }
136
137   public <OperandType3> getArg3Scalar() {
138     return arg3Scalar;
139   }
140
141   public void setArg3Scalar(<OperandType3> value) {
142     this.arg3Scalar = value;
143   }
144
145   public void setOutputColumn(int outputColumn) {
146     this.outputColumn = outputColumn;
147   }
148
149   @Override
150   public String vectorExpressionParameters() {
151     return "col " + arg1Column + ", val "+ arg2Scalar + ", val "+ arg3Scalar;
152   }
153
154   @Override
155   public VectorExpressionDescriptor.Descriptor getDescriptor() {
156     return (new VectorExpressionDescriptor.Builder())
157         .setMode(
158             VectorExpressionDescriptor.Mode.PROJECTION)
159         .setNumArguments(3)
160         .setArgumentTypes(
161             VectorExpressionDescriptor.ArgumentType.getType("long"),
162             VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType2>"),
163             VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType3>"))
164         .setInputExpressionTypes(
165             VectorExpressionDescriptor.InputExpressionType.COLUMN,
166             VectorExpressionDescriptor.InputExpressionType.SCALAR,
167             VectorExpressionDescriptor.InputExpressionType.SCALAR).build();
168   }
169 }