b52b7c7995f4cd0a4cf64d432eb12dc85438ee6b
[hive.git] / ql / src / gen / vectorization / ExpressionTemplates / ColumnUnaryMinus.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.*;
23 import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
24 import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
25
26 /**
27  * Generated from template ColumnUnaryMinus.txt, which covers unary negation operator. 
28  */
29 public class <ClassName> extends VectorExpression {
30
31   private static final long serialVersionUID = 1L;
32
33   private int colNum;
34   private int outputColumn;
35
36   public <ClassName>(int colNum, int outputColumn) {
37     this();
38     this.colNum = colNum;
39     this.outputColumn = outputColumn;
40   }
41
42   public <ClassName>() {
43     super();
44   }
45
46   @Override
47   public void evaluate(VectorizedRowBatch batch) {
48
49     if (childExpressions != null) {
50       this.evaluateChildren(batch);
51     }
52
53     <InputColumnVectorType> inputColVector = (<InputColumnVectorType>) batch.cols[colNum];
54     <OutputColumnVectorType> outputColVector = (<OutputColumnVectorType>) batch.cols[outputColumn];
55     int[] sel = batch.selected;
56     boolean[] inputIsNull = inputColVector.isNull;
57     boolean[] outputIsNull = outputColVector.isNull;
58     outputColVector.noNulls = inputColVector.noNulls;
59     int n = batch.size;
60     <OperandType>[] vector = inputColVector.vector;
61     <ReturnType>[] outputVector = outputColVector.vector;
62     
63     // return immediately if batch is empty
64     if (n == 0) {
65       return;
66     }
67
68     if (inputColVector.isRepeating) {
69       //All must be selected otherwise size would be zero
70       //Repeating property will not change.
71       outputVector[0] = - vector[0];
72       // Even if there are no nulls, we always copy over entry 0. Simplifies code.
73       outputIsNull[0] = inputIsNull[0]; 
74       outputColVector.isRepeating = true;
75     } else if (inputColVector.noNulls) {
76       if (batch.selectedInUse) {
77         for(int j=0; j != n; j++) {
78           int i = sel[j];
79           outputVector[i] = -vector[i];
80         }
81       } else {
82         for(int i = 0; i != n; i++) {
83           outputVector[i] = -vector[i];
84         }
85       }
86       outputColVector.isRepeating = false;
87     } else /* there are nulls */ {
88       if (batch.selectedInUse) {
89         for(int j=0; j != n; j++) {
90           int i = sel[j];
91           outputVector[i] = -vector[i];
92           outputIsNull[i] = inputIsNull[i];
93         }
94       } else {
95         for(int i = 0; i != n; i++) {
96           outputVector[i] = -vector[i];
97         }
98         System.arraycopy(inputIsNull, 0, outputIsNull, 0, n);
99       }
100       outputColVector.isRepeating = false;
101     }
102   }
103
104   @Override
105   public int getOutputColumn() {
106     return outputColumn;
107   }
108   
109   @Override
110   public String getOutputType() {
111     return "<ReturnType>";
112   }
113   
114   public int getColNum() {
115     return colNum;
116   }
117
118   public void setColNum(int colNum) {
119     this.colNum = colNum;
120   }
121
122   public void setOutputColumn(int outputColumn) {
123     this.outputColumn = outputColumn;
124   }
125
126   @Override
127   public VectorExpressionDescriptor.Descriptor getDescriptor() {
128     return (new VectorExpressionDescriptor.Builder())
129         .setMode(
130             VectorExpressionDescriptor.Mode.PROJECTION)
131         .setNumArguments(1)
132         .setArgumentTypes(
133             VectorExpressionDescriptor.ArgumentType.getType("<VectorExprArgType>"))
134         .setInputExpressionTypes(
135             VectorExpressionDescriptor.InputExpressionType.COLUMN).build();
136   }
137 }