blob: e6812c5a47da0f10aa05b49183216759c3b04fa6 [file] [log] [blame]
/*
* 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.carbondata.core.datastore.chunk.reader.dimension;
import java.io.IOException;
import java.util.List;
import org.apache.carbondata.core.datastore.FileReader;
import org.apache.carbondata.core.datastore.ReusableDataBuffer;
import org.apache.carbondata.core.datastore.chunk.impl.DimensionRawColumnChunk;
import org.apache.carbondata.core.datastore.chunk.reader.DimensionColumnChunkReader;
import org.apache.carbondata.core.datastore.compression.Compressor;
import org.apache.carbondata.core.metadata.blocklet.BlockletInfo;
import org.apache.carbondata.core.scan.result.vector.ColumnVectorInfo;
/**
* Class which will have all the common properties and behavior among all type
* of reader
*/
public abstract class AbstractDimensionChunkReader implements DimensionColumnChunkReader {
/**
* compressor will be used to uncompress the data
*/
protected Compressor compressor;
/**
* full qualified path of the data file from
* which data will be read
*/
protected String filePath;
/**
* dimension chunks offset
*/
protected List<Long> dimensionChunksOffset;
/**
* dimension chunks length
*/
protected List<Integer> dimensionChunksLength;
/**
* Constructor to get minimum parameter to create
* instance of this class
* @param filePath file from which data will be read
*/
public AbstractDimensionChunkReader(final BlockletInfo blockletInfo, final String filePath) {
this.filePath = filePath;
dimensionChunksOffset = blockletInfo.getDimensionChunkOffsets();
dimensionChunksLength = blockletInfo.getDimensionChunksLength();
}
@Override
public void decodeColumnPageAndFillVector(DimensionRawColumnChunk dimensionRawColumnChunk,
int pageNumber, ColumnVectorInfo vectorInfo, ReusableDataBuffer reusableDataBuffer)
throws IOException {
throw new UnsupportedOperationException(
"This operation is not supported in this reader " + this.getClass().getName());
}
/**
* Below method will be used to read the chunk based on block indexes
* Reading logic of below method is:
* Except last column all the column chunk can be read in group
* if not last column then read data of all the column present in block index
* together then process it.
* For last column read is separately and process
*
* @param fileReader file reader to read the blocks from file
* @param columnIndexRange column index range to be read
* @return dimension column chunks
*/
@Override
public DimensionRawColumnChunk[] readRawDimensionChunks(final FileReader fileReader,
final int[][] columnIndexRange) throws IOException {
// read the column chunk based on block index and add
DimensionRawColumnChunk[] dataChunks =
new DimensionRawColumnChunk[dimensionChunksOffset.size()];
// if blocklet index is empty then return empty data chunk
if (columnIndexRange.length == 0) {
return dataChunks;
}
DimensionRawColumnChunk[] groupChunk = null;
int index = 0;
// iterate till block indexes -1 as block index will be in sorted order, so to avoid
// the last column reading in group
for (int i = 0; i < columnIndexRange.length - 1; i++) {
index = 0;
groupChunk =
readRawDimensionChunksInGroup(fileReader, columnIndexRange[i][0], columnIndexRange[i][1]);
for (int j = columnIndexRange[i][0]; j <= columnIndexRange[i][1]; j++) {
dataChunks[j] = groupChunk[index++];
}
}
// check last index is present in block index, if it is present then read separately
if (columnIndexRange[columnIndexRange.length - 1][0] == dimensionChunksOffset.size() - 1) {
dataChunks[columnIndexRange[columnIndexRange.length - 1][0]] =
readRawDimensionChunk(fileReader, columnIndexRange[columnIndexRange.length - 1][0]);
}
// otherwise read the data in group
else {
groupChunk = readRawDimensionChunksInGroup(
fileReader, columnIndexRange[columnIndexRange.length - 1][0],
columnIndexRange[columnIndexRange.length - 1][1]);
index = 0;
for (int j = columnIndexRange[columnIndexRange.length - 1][0];
j <= columnIndexRange[columnIndexRange.length - 1][1]; j++) {
dataChunks[j] = groupChunk[index++];
}
}
return dataChunks;
}
/**
* Below method will be used to read measure chunk data in group.
* This method will be useful to avoid multiple IO while reading the
* data from
*
* @param fileReader file reader to read the data
* @param startColumnBlockletIndex first column blocklet index to be read
* @param endColumnBlockletIndex end column blocklet index to be read
* @return measure raw chunkArray
* @throws IOException
*/
protected abstract DimensionRawColumnChunk[] readRawDimensionChunksInGroup(FileReader fileReader,
int startColumnBlockletIndex, int endColumnBlockletIndex) throws IOException;
}