/**
* 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.query.selection;
import com.linkedin.pinot.common.data.FieldSpec;
import com.linkedin.pinot.common.utils.DataSchema;
import com.linkedin.pinot.core.common.Block;
import com.linkedin.pinot.core.query.selection.iterator.DoubleArraySelectionColumnIterator;
import com.linkedin.pinot.core.query.selection.iterator.DoubleSelectionColumnIterator;
import com.linkedin.pinot.core.query.selection.iterator.FloatArraySelectionColumnIterator;
import com.linkedin.pinot.core.query.selection.iterator.FloatSelectionColumnIterator;
import com.linkedin.pinot.core.query.selection.iterator.IntArraySelectionColumnIterator;
import com.linkedin.pinot.core.query.selection.iterator.IntSelectionColumnIterator;
import com.linkedin.pinot.core.query.selection.iterator.LongArraySelectionColumnIterator;
import com.linkedin.pinot.core.query.selection.iterator.LongSelectionColumnIterator;
import com.linkedin.pinot.core.query.selection.iterator.SelectionColumnIterator;
import com.linkedin.pinot.core.query.selection.iterator.SelectionSingleValueColumnWithDictIterator;
import com.linkedin.pinot.core.query.selection.iterator.StringArraySelectionColumnIterator;
import com.linkedin.pinot.core.query.selection.iterator.StringSelectionColumnIterator;
import java.io.Serializable;
/**
* Selection fetcher is used for querying rows from given blocks and schema.
* SelectionFetcher will initialize iterators on each data column and provide
* the ability to return a Serializable array as a row for a given docId.
*
*/
public class SelectionFetcher {
private final int _numColumns;
private final SelectionColumnIterator[] _selectionColumnIterators;
public SelectionFetcher(Block[] blocks, DataSchema dataSchema) {
_numColumns = blocks.length;
_selectionColumnIterators = new SelectionColumnIterator[_numColumns];
for (int i = 0; i < _numColumns; i++) {
Block block = blocks[i];
FieldSpec.DataType columnType = dataSchema.getColumnType(i);
if (block.getMetadata().hasDictionary()) {
// With dictionary
switch (columnType) {
// Single value
case INT:
case LONG:
case FLOAT:
case DOUBLE:
case STRING:
_selectionColumnIterators[i] = new SelectionSingleValueColumnWithDictIterator(block);
break;
// Multi value
case INT_ARRAY:
_selectionColumnIterators[i] = new IntArraySelectionColumnIterator(block);
break;
case FLOAT_ARRAY:
_selectionColumnIterators[i] = new FloatArraySelectionColumnIterator(block);
break;
case LONG_ARRAY:
_selectionColumnIterators[i] = new LongArraySelectionColumnIterator(block);
break;
case DOUBLE_ARRAY:
_selectionColumnIterators[i] = new DoubleArraySelectionColumnIterator(block);
break;
case STRING_ARRAY:
_selectionColumnIterators[i] = new StringArraySelectionColumnIterator(block);
break;
default:
throw new UnsupportedOperationException();
}
} else {
// No dictionary
switch (columnType) {
case INT:
_selectionColumnIterators[i] = new IntSelectionColumnIterator(block);
break;
case LONG:
_selectionColumnIterators[i] = new LongSelectionColumnIterator(block);
break;
case FLOAT:
_selectionColumnIterators[i] = new FloatSelectionColumnIterator(block);
break;
case DOUBLE:
_selectionColumnIterators[i] = new DoubleSelectionColumnIterator(block);
break;
case STRING:
_selectionColumnIterators[i] = new StringSelectionColumnIterator(block);
break;
// TODO: add multi value support
default:
throw new UnsupportedOperationException();
}
}
}
}
public Serializable[] getRow(int docId) {
final Serializable[] row = new Serializable[_numColumns];
for (int i = 0; i < _numColumns; i++) {
row[i] = _selectionColumnIterators[i].getValue(docId);
}
return row;
}
}