/** * Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com) * * Licensed 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 com.linkedin.pinot.core.operator.docvalsets; import com.linkedin.pinot.common.data.FieldSpec; import com.linkedin.pinot.core.common.BaseBlockValSet; import com.linkedin.pinot.core.common.BlockMultiValIterator; import com.linkedin.pinot.core.common.BlockValIterator; import com.linkedin.pinot.core.common.DataBlockCache; import com.linkedin.pinot.core.operator.MProjectionOperator; /** * This class represents the BlockValSet for a projection block. * It provides api's to access data for a specified projection column. * It uses {@link DataBlockCache} to cache the projection data. */ public class ProjectionBlockValSet extends BaseBlockValSet { private DataBlockCache _dataBlockCache; private final BlockValIterator _blockValIterator; private final FieldSpec.DataType _columnDataType; private String _column; /** * Constructor for the class. * The dataBlockCache argument is initialized in {@link com.linkedin.pinot.core.operator.MProjectionOperator}, * so that it can be reused across multiple calls to {@link MProjectionOperator#getNextBlock()}. * * @param dataBlockCache data block cache * @param column Projection column. */ public ProjectionBlockValSet(DataBlockCache dataBlockCache, String column) { _dataBlockCache = dataBlockCache; _column = column; _columnDataType = _dataBlockCache.getDataType(column); _blockValIterator = _dataBlockCache.getDataFetcher().getBlockValIteratorForColumn(column); } @Override public int[] getIntValuesSV() { return _dataBlockCache.getIntValueArrayForColumn(_column); } @Override public int[][] getIntValuesMV() { return _dataBlockCache.getIntValuesArrayForColumn(_column); } @Override public long[] getLongValuesSV() { return _dataBlockCache.getLongValueArrayForColumn(_column); } @Override public long[][] getLongValuesMV() { return _dataBlockCache.getLongValuesArrayForColumn(_column); } @Override public float[] getFloatValuesSV() { return _dataBlockCache.getFloatValueArrayForColumn(_column); } @Override public float[][] getFloatValuesMV() { return _dataBlockCache.getFloatValuesArrayForColumn(_column); } /** * Returns an array of single values for the given doc Ids. * Caller chooses T based on data type. * * @return Array of single-values from dataBlockCache. */ @Override public double[] getDoubleValuesSV() { return _dataBlockCache.getDoubleValueArrayForColumn(_column); } /** * Returns an array of multi-values for the given doc Ids. * Caller chooses T based on data type. * * @return Array of multi-values from dataBlockCache. */ @Override public double[][] getDoubleValuesMV() { return _dataBlockCache.getDoubleValuesArrayForColumn(_column); } @Override public String[] getStringValuesSV() { return _dataBlockCache.getStringValueArrayForColumn(_column); } @Override public String[][] getStringValuesMV() { return _dataBlockCache.getStringValuesArrayForColumn(_column); } @Override public FieldSpec.DataType getValueType() { return _columnDataType; } // TODO: Remove arguments from interface, as projection block will have the information. @Override public void getDictionaryIds(int[] inDocIds, int inStartPos, int inDocIdsSize, int[] outDictionaryIds, int outStartPos) { getDictionaryIds(); } @Override public int[] getDictionaryIds() { return _dataBlockCache.getDictIdArrayForColumn(_column); } @Override public int getDictionaryIdsForDocId(int docId, int[] outputDictIds) { BlockMultiValIterator blockValIterator = (BlockMultiValIterator) _blockValIterator; blockValIterator.skipTo(docId); return blockValIterator.nextIntVal(outputDictIds); } @Override public int[] getNumberOfMVEntriesArray() { return _dataBlockCache.getNumberOfEntriesArrayForColumn(_column); } }