e25b9c29ad7e94b4ec1e6ec02bf4496efc5eed9d
[hive.git] / ql / src / gen / vectorization / ExpressionTemplates / FilterColumnCompareColumn.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     <InputColumnVectorType1> inputColVector1 = (<InputColumnVectorType1>) 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     <OperandType1>[] vector1 = inputColVector1.vector;
61     <OperandType2>[] vector2 = inputColVector2.vector;
62     
63     // return immediately if batch is empty
64     if (n == 0) {
65       return;
66     }
67     
68     // filter rows with NULL on left input
69     int newSize;
70     newSize = NullUtil.filterNulls(batch.cols[colNum1], batch.selectedInUse, sel, n);
71     if (newSize < n) {
72       n = batch.size = newSize;
73       batch.selectedInUse = true;
74     }
75     
76     // filter rows with NULL on right input
77     newSize = NullUtil.filterNulls(batch.cols[colNum2], batch.selectedInUse, sel, n);
78     if (newSize < n) {
79       n = batch.size = newSize;
80       batch.selectedInUse = true;
81     }
82     
83     // All rows with nulls have been filtered out, so just do normal filter for non-null case
84     if (n != 0 && inputColVector1.isRepeating && inputColVector2.isRepeating) {
85       
86       // All must be selected otherwise size would be zero
87       // Repeating property will not change.
88       if (!(vector1[0] <OperatorSymbol> vector2[0])) {
89         batch.size = 0;
90       }
91     } else if (inputColVector1.isRepeating) {
92       if (batch.selectedInUse) {
93         newSize = 0;
94         for(int j = 0; j != n; j++) {
95           int i = sel[j];
96           if (vector1[0] <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 (vector1[0] <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       if (batch.selectedInUse) {
115         newSize = 0;
116         for(int j = 0; j != n; j++) {
117           int i = sel[j];
118           if (vector1[i] <OperatorSymbol> vector2[0]) {
119             sel[newSize++] = i;
120           }
121         }
122         batch.size = newSize;
123       } else {
124         newSize = 0;
125         for(int i = 0; i != n; i++) {
126           if (vector1[i] <OperatorSymbol> vector2[0]) {
127             sel[newSize++] = i;
128           }
129         }
130         if (newSize < batch.size) {
131           batch.size = newSize;
132           batch.selectedInUse = true;
133         }
134       }
135     } else if (batch.selectedInUse) {
136       newSize = 0;
137       for(int j = 0; j != n; j++) {
138         int i = sel[j];
139         if (vector1[i] <OperatorSymbol> vector2[i]) {
140           sel[newSize++] = i;
141         }
142       }
143       batch.size = newSize;
144     } else {
145       newSize = 0;
146       for(int i = 0; i != n; i++) {
147         if (vector1[i] <OperatorSymbol>  vector2[i]) {
148           sel[newSize++] = i;
149         }
150       }
151       if (newSize < batch.size) {
152         batch.size = newSize;
153         batch.selectedInUse = true;
154       }
155     }
156   }
157
158   @Override
159   public String getOutputType() {
160     return "boolean";
161   }
162
163   @Override
164   public int getOutputColumn() {
165     return -1;
166   }
167   
168   public int getColNum1() {
169     return colNum1;
170   }
171
172   public void setColNum1(int colNum1) {
173     this.colNum1 = colNum1;
174   }
175
176   public int getColNum2() {
177     return colNum2;
178   }
179
180   public void setColNum2(int colNum2) {
181     this.colNum2 = colNum2;
182   }
183
184   @Override
185   public VectorExpressionDescriptor.Descriptor getDescriptor() {
186     return (new VectorExpressionDescriptor.Builder())
187         .setMode(
188             VectorExpressionDescriptor.Mode.FILTER)
189         .setNumArguments(2)
190         .setArgumentTypes(
191             VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType1>"),
192             VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType2>"))
193         .setInputExpressionTypes(
194             VectorExpressionDescriptor.InputExpressionType.COLUMN,
195             VectorExpressionDescriptor.InputExpressionType.COLUMN).build();
196   }
197 }