/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.hive.ql.exec.vector; import java.util.Arrays; import org.apache.hadoop.hive.ql.exec.vector.ColumnVector; import org.apache.hadoop.hive.ql.metadata.HiveException; /** * Class to keep information on a set of typed vector columns. Used by * other classes to efficiently access the set of columns. */ public class VectorColumnSetInfo { // For simpler access, we make these members protected instead of // providing get methods. /** * indices of LONG primitive keys. */ protected int[] longIndices; /** * indices of DOUBLE primitive keys. */ protected int[] doubleIndices; /** * indices of string (byte[]) primitive keys. */ protected int[] stringIndices; /** * indices of decimal primitive keys. */ protected int[] decimalIndices; /** * indices of TIMESTAMP primitive keys. */ protected int[] timestampIndices; /** * indices of INTERVAL_DAY_TIME primitive keys. */ protected int[] intervalDayTimeIndices; final protected int keyCount; private int addKeyIndex; private int addLongIndex; private int addDoubleIndex; private int addStringIndex; private int addDecimalIndex; private int addTimestampIndex; private int addIntervalDayTimeIndex; // Given the keyIndex these arrays return: // The ColumnVector.Type, // The type specific index into longIndices, doubleIndices, etc... protected ColumnVector.Type[] columnVectorTypes; protected int[] columnTypeSpecificIndices; protected VectorColumnSetInfo(int keyCount) { this.keyCount = keyCount; this.addKeyIndex = 0; // We'll over allocate and then shrink the array for each type longIndices = new int[this.keyCount]; addLongIndex = 0; doubleIndices = new int[this.keyCount]; addDoubleIndex = 0; stringIndices = new int[this.keyCount]; addStringIndex = 0; decimalIndices = new int[this.keyCount]; addDecimalIndex = 0; timestampIndices = new int[this.keyCount]; addTimestampIndex = 0; intervalDayTimeIndices = new int[this.keyCount]; addIntervalDayTimeIndex = 0; columnVectorTypes = new ColumnVector.Type[this.keyCount]; columnTypeSpecificIndices = new int[this.keyCount]; } protected void addKey(ColumnVector.Type columnVectorType) throws HiveException { switch (columnVectorType) { case LONG: longIndices[addLongIndex] = addKeyIndex; columnTypeSpecificIndices[addKeyIndex] = addLongIndex++; break; case DOUBLE: doubleIndices[addDoubleIndex] = addKeyIndex; columnTypeSpecificIndices[addKeyIndex] = addDoubleIndex++; break; case BYTES: stringIndices[addStringIndex]= addKeyIndex; columnTypeSpecificIndices[addKeyIndex] = addStringIndex++; break; case DECIMAL: decimalIndices[addDecimalIndex]= addKeyIndex; columnTypeSpecificIndices[addKeyIndex] = addDecimalIndex++; break; case TIMESTAMP: timestampIndices[addTimestampIndex] = addKeyIndex; columnTypeSpecificIndices[addKeyIndex] = addTimestampIndex++; break; case INTERVAL_DAY_TIME: intervalDayTimeIndices[addIntervalDayTimeIndex] = addKeyIndex; columnTypeSpecificIndices[addKeyIndex] = addIntervalDayTimeIndex++; break; default: throw new HiveException("Unexpected column vector type " + columnVectorType); } columnVectorTypes[addKeyIndex] = columnVectorType; addKeyIndex++; } protected void finishAdding() throws HiveException { longIndices = Arrays.copyOf(longIndices, addLongIndex); doubleIndices = Arrays.copyOf(doubleIndices, addDoubleIndex); stringIndices = Arrays.copyOf(stringIndices, addStringIndex); decimalIndices = Arrays.copyOf(decimalIndices, addDecimalIndex); timestampIndices = Arrays.copyOf(timestampIndices, addTimestampIndex); intervalDayTimeIndices = Arrays.copyOf(intervalDayTimeIndices, addIntervalDayTimeIndex); } }