7863b16f2a0310587b89f5a53d0c6a59695539c5
[hive.git] / ql / src / gen / vectorization / ExpressionTemplates / FilterTimestampColumnBetween.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 java.sql.Timestamp;
22
23 import org.apache.hadoop.hive.ql.exec.vector.TimestampColumnVector;
24 import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression;
25 import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
26 import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
27
28 /**
29  * Generated from template FilterTimestampColumnBetween.txt, which covers [NOT] BETWEEN filter
30  * expressions where a column is [NOT] between one scalar and another.
31  * Output is not produced in a separate column.  The selected vector of the input
32  * {@link VectorizedRowBatch} is updated for in-place filtering.
33  */
34 public class <ClassName> extends VectorExpression {
35
36   private static final long serialVersionUID = 1L;
37
38   private int colNum;
39
40   // The comparison is of the form "column BETWEEN leftValue AND rightValue"
41   private Timestamp leftValue;
42   private Timestamp rightValue;
43   private Timestamp scratchValue;
44
45   public <ClassName>(int colNum, Timestamp leftValue, Timestamp rightValue) {
46     this.colNum = colNum;
47     this.leftValue = leftValue;
48     this.rightValue = rightValue;
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     TimestampColumnVector inputColVector = (TimestampColumnVector) batch.cols[colNum];
62     int[] sel = batch.selected;
63     boolean[] nullPos = inputColVector.isNull;
64     int n = batch.size;
65
66     // return immediately if batch is empty
67     if (n == 0) {
68       return;
69     }
70
71     if (inputColVector.noNulls) {
72       if (inputColVector.isRepeating) {
73
74         // All must be selected otherwise size would be zero.
75         // Repeating property will not change.
76         if (<OptionalNot>(inputColVector.compareTo(0, leftValue) < 0 || inputColVector.compareTo(0, rightValue) > 0)) {
77
78           // Entire batch is filtered out.
79           batch.size = 0;
80         }
81       } else if (batch.selectedInUse) {
82         int newSize = 0;
83         for(int j = 0; j != n; j++) {
84           int i = sel[j];
85           if (<OptionalNot>(inputColVector.compareTo(leftValue, i) <= 0 && inputColVector.compareTo(i, rightValue) <= 0)) {
86             sel[newSize++] = i;
87           }
88         }
89         batch.size = newSize;
90       } else {
91         int newSize = 0;
92         for(int i = 0; i != n; i++) {
93           if (<OptionalNot>(inputColVector.compareTo(leftValue, i) <= 0 && inputColVector.compareTo(i, rightValue) <= 0)) {
94             sel[newSize++] = i;
95           }
96         }
97         if (newSize < n) {
98           batch.size = newSize;
99           batch.selectedInUse = true;
100         }
101       }
102     } else {
103       if (inputColVector.isRepeating) {
104
105         // All must be selected otherwise size would be zero.
106         // Repeating property will not change.
107         if (!nullPos[0]) {
108           if (<OptionalNot>(inputColVector.compareTo(0, leftValue) < 0 || inputColVector.compareTo(0, rightValue) > 0)) {
109
110             // Entire batch is filtered out.
111             batch.size = 0;
112           }
113         } else {
114           batch.size = 0;
115         }
116       } else if (batch.selectedInUse) {
117         int newSize = 0;
118         for(int j = 0; j != n; j++) {
119           int i = sel[j];
120           if (!nullPos[i]) {
121             if (<OptionalNot>(inputColVector.compareTo(leftValue, i) <= 0 && inputColVector.compareTo(i, rightValue) <= 0)) {
122              sel[newSize++] = i;
123             }
124           }
125         }
126
127         // Change the selected vector
128         batch.size = newSize;
129       } else {
130         int newSize = 0;
131         for(int i = 0; i != n; i++) {
132           if (!nullPos[i]) {
133             if (<OptionalNot>(inputColVector.compareTo(leftValue, i) <= 0 && inputColVector.compareTo(i, rightValue) <= 0)) {
134               sel[newSize++] = i;
135             }
136           }
137         }
138         if (newSize < n) {
139           batch.size = newSize;
140           batch.selectedInUse = true;
141         }
142       }
143     }
144   }
145
146   @Override
147   public int getOutputColumn() {
148     return -1;
149   }
150
151   @Override
152   public String getOutputType() {
153     return "boolean";
154   }
155
156   @Override
157   public String vectorExpressionParameters() {
158     return "col " + colNum + ", left " + leftValue.toString() + ", right " + rightValue.toString();
159   }
160
161   @Override
162   public VectorExpressionDescriptor.Descriptor getDescriptor() {
163     return (new VectorExpressionDescriptor.Builder())
164         .setMode(
165             VectorExpressionDescriptor.Mode.FILTER)
166         .setNumArguments(3)
167         .setArgumentTypes(
168             VectorExpressionDescriptor.ArgumentType.getType("timestamp"),
169             VectorExpressionDescriptor.ArgumentType.getType("timestamp"),
170             VectorExpressionDescriptor.ArgumentType.getType("timestamp"))
171         .setInputExpressionTypes(
172             VectorExpressionDescriptor.InputExpressionType.COLUMN,
173             VectorExpressionDescriptor.InputExpressionType.SCALAR,
174             VectorExpressionDescriptor.InputExpressionType.SCALAR).build();
175   }
176 }