d10be96489aac905352b509b417b2814a7e91439
[hive.git] / ql / src / gen / vectorization / ExpressionTemplates / FilterTimestampColumnCompareLongDoubleColumn.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.NullUtil;
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
27 /**
28  * Generated from template FilterColumnCompareColumn.txt, which covers binary comparison
29  * expressions between two columns, however output is not produced in a separate column.
30  * The selected vector of the input {@link VectorizedRowBatch} is updated for in-place filtering.
31  */
32 public class <ClassName> extends VectorExpression {
33
34   private static final long serialVersionUID = 1L;
35
36   private int colNum1;
37   private int colNum2;
38
39   public <ClassName>(int colNum1, int colNum2) {
40     this.colNum1 = colNum1;
41     this.colNum2 = colNum2;
42   }
43
44   public <ClassName>() {
45   }
46
47   @Override
48   public void evaluate(VectorizedRowBatch batch) {
49
50     if (childExpressions != null) {
51       super.evaluateChildren(batch);
52     }
53
54     TimestampColumnVector inputColVector1 = (TimestampColumnVector) batch.cols[colNum1];
55     <InputColumnVectorType2> inputColVector2 = (<InputColumnVectorType2>) batch.cols[colNum2];
56     int[] sel = batch.selected;
57     boolean[] nullPos1 = inputColVector1.isNull;
58     boolean[] nullPos2 = inputColVector2.isNull;
59     int n = batch.size;
60     <OperandType>[] vector2 = inputColVector2.vector;
61
62     // return immediately if batch is empty
63     if (n == 0) {
64       return;
65     }
66
67     // filter rows with NULL on left input
68     int newSize;
69     newSize = NullUtil.filterNulls(batch.cols[colNum1], batch.selectedInUse, sel, n);
70     if (newSize < n) {
71       n = batch.size = newSize;
72       batch.selectedInUse = true;
73     }
74
75     // filter rows with NULL on right input
76     newSize = NullUtil.filterNulls(batch.cols[colNum2], batch.selectedInUse, sel, n);
77     if (newSize < n) {
78       n = batch.size = newSize;
79       batch.selectedInUse = true;
80     }
81
82     // All rows with nulls have been filtered out, so just do normal filter for non-null case
83     if (n != 0 && inputColVector1.isRepeating && inputColVector2.isRepeating) {
84
85       // All must be selected otherwise size would be zero
86       // Repeating property will not change.
87       if (!(inputColVector1.<GetTimestampLongDoubleMethod>(0) <OperatorSymbol> vector2[0])) {
88         batch.size = 0;
89       }
90     } else if (inputColVector1.isRepeating) {
91       <OperandType> value1 = inputColVector1.<GetTimestampLongDoubleMethod>(0);
92       if (batch.selectedInUse) {
93         newSize = 0;
94         for(int j = 0; j != n; j++) {
95           int i = sel[j];
96           if (value1 <OperatorSymbol> vector2[i]) {
97             sel[newSize++] = i;
98           }
99         }
100         batch.size = newSize;
101       } else {
102         newSize = 0;
103         for(int i = 0; i != n; i++) {
104           if (value1 <OperatorSymbol> vector2[i]) {
105             sel[newSize++] = i;
106           }
107         }
108         if (newSize < batch.size) {
109           batch.size = newSize;
110           batch.selectedInUse = true;
111         }
112       }
113     } else if (inputColVector2.isRepeating) {
114       <OperandType> value2 = vector2[0];
115       if (batch.selectedInUse) {
116         newSize = 0;
117         for(int j = 0; j != n; j++) {
118           int i = sel[j];
119           if (inputColVector1.<GetTimestampLongDoubleMethod>(i) <OperatorSymbol> value2) {
120             sel[newSize++] = i;
121           }
122         }
123         batch.size = newSize;
124       } else {
125         newSize = 0;
126         for(int i = 0; i != n; i++) {
127           if (inputColVector1.<GetTimestampLongDoubleMethod>(i) <OperatorSymbol> value2) {
128             sel[newSize++] = i;
129           }
130         }
131         if (newSize < batch.size) {
132           batch.size = newSize;
133           batch.selectedInUse = true;
134         }
135       }
136     } else if (batch.selectedInUse) {
137       newSize = 0;
138       for(int j = 0; j != n; j++) {
139         int i = sel[j];
140         if (inputColVector1.<GetTimestampLongDoubleMethod>(i) <OperatorSymbol> vector2[i]) {
141           sel[newSize++] = i;
142         }
143       }
144       batch.size = newSize;
145     } else {
146       newSize = 0;
147       for(int i = 0; i != n; i++) {
148         if (inputColVector1.<GetTimestampLongDoubleMethod>(i) <OperatorSymbol>  vector2[i]) {
149           sel[newSize++] = i;
150         }
151       }
152       if (newSize < batch.size) {
153         batch.size = newSize;
154         batch.selectedInUse = true;
155       }
156     }
157   }
158
159   @Override
160   public String getOutputType() {
161     return "boolean";
162   }
163
164   @Override
165   public int getOutputColumn() {
166     return -1;
167   }
168
169   @Override
170   public VectorExpressionDescriptor.Descriptor getDescriptor() {
171     return (new VectorExpressionDescriptor.Builder())
172         .setMode(
173             VectorExpressionDescriptor.Mode.FILTER)
174         .setNumArguments(2)
175         .setArgumentTypes(
176             VectorExpressionDescriptor.ArgumentType.getType("timestamp"),
177             VectorExpressionDescriptor.ArgumentType.getType("<OperandType>"))
178         .setInputExpressionTypes(
179             VectorExpressionDescriptor.InputExpressionType.COLUMN,
180             VectorExpressionDescriptor.InputExpressionType.COLUMN).build();
181   }
182 }