blob: fe570132102a30c78e943d4f8024fda0f716eb9f [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.reader.sortindex;
import java.io.IOException;
import java.util.List;
import org.apache.carbondata.common.logging.LogServiceFactory;
import org.apache.carbondata.core.cache.dictionary.DictionaryColumnUniqueIdentifier;
import org.apache.carbondata.core.datastore.impl.FileFactory;
import org.apache.carbondata.core.reader.CarbonDictionaryColumnMetaChunk;
import org.apache.carbondata.core.reader.CarbonDictionaryMetadataReader;
import org.apache.carbondata.core.reader.CarbonDictionaryMetadataReaderImpl;
import org.apache.carbondata.core.reader.ThriftReader;
import org.apache.carbondata.format.ColumnSortInfo;
import org.apache.log4j.Logger;
import org.apache.thrift.TBase;
/**
* Implementation for reading the dictionary sort index and inverted sort index .
*/
public class CarbonDictionarySortIndexReaderImpl implements CarbonDictionarySortIndexReader {
/**
* column name
*/
protected DictionaryColumnUniqueIdentifier dictionaryColumnUniqueIdentifier;
/**
* the path of the dictionary Sort Index file
*/
protected String sortIndexFilePath;
/**
* Column sort info thrift instance.
*/
ColumnSortInfo columnSortInfo = null;
/**
* Comment for <code>LOGGER</code>
*/
private static final Logger LOGGER =
LogServiceFactory.getLogService(CarbonDictionarySortIndexReaderImpl.class.getName());
/**
* dictionary sortIndex file Reader
*/
private ThriftReader dictionarySortIndexThriftReader;
/**
* @param dictionaryColumnUniqueIdentifier column name
*/
public CarbonDictionarySortIndexReaderImpl(
final DictionaryColumnUniqueIdentifier dictionaryColumnUniqueIdentifier) {
this.dictionaryColumnUniqueIdentifier = dictionaryColumnUniqueIdentifier;
}
/**
* method for reading the carbon dictionary sort index data
* from columns sortIndex file.
*
* @return The method return's the list of dictionary sort Index and sort Index reverse
* In case of no member for column empty list will be return
* @throws IOException In case any I/O error occurs
*/
@Override
public List<Integer> readSortIndex() throws IOException {
if (null == columnSortInfo) {
readColumnSortInfo();
}
return columnSortInfo.getSort_index();
}
/**
* method for reading the carbon dictionary sort index data
* from columns sortIndex file.
* In case of no member empty list will be return
*
* @throws IOException In case any I/O error occurs
*/
private void readColumnSortInfo() throws IOException {
init();
try {
columnSortInfo = (ColumnSortInfo) dictionarySortIndexThriftReader.read();
} catch (IOException ie) {
LOGGER.error("problem while reading the column sort info.", ie);
throw new IOException("problem while reading the column sort info.", ie);
} finally {
if (null != dictionarySortIndexThriftReader) {
dictionarySortIndexThriftReader.close();
}
}
}
/**
* method for reading the carbon dictionary inverted sort index data
* from columns sortIndex file.
*
* @return The method return's the list of dictionary inverted sort Index
* @throws IOException In case any I/O error occurs
*/
@Override
public List<Integer> readInvertedSortIndex() throws IOException {
if (null == columnSortInfo) {
readColumnSortInfo();
}
return columnSortInfo.getSort_index_inverted();
}
/**
* The method initializes the dictionary Sort Index file path
* and initialize and opens the thrift reader for dictionary sortIndex file.
*
* @throws IOException if any I/O errors occurs
*/
private void init() throws IOException {
initPath();
openThriftReader();
}
protected void initPath() {
try {
CarbonDictionaryColumnMetaChunk chunkMetaObjectForLastSegmentEntry =
getChunkMetaObjectForLastSegmentEntry();
long dictOffset = chunkMetaObjectForLastSegmentEntry.getEnd_offset();
this.sortIndexFilePath = dictionaryColumnUniqueIdentifier.getSortIndexFilePath(dictOffset);
if (!FileFactory.isFileExist(this.sortIndexFilePath)) {
this.sortIndexFilePath = dictionaryColumnUniqueIdentifier.getSortIndexFilePath();
}
} catch (IOException e) {
this.sortIndexFilePath = dictionaryColumnUniqueIdentifier.getSortIndexFilePath();
}
}
/**
* This method will read the dictionary chunk metadata thrift object for last entry
*
* @return last entry of dictionary meta chunk
* @throws IOException if an I/O error occurs
*/
private CarbonDictionaryColumnMetaChunk getChunkMetaObjectForLastSegmentEntry()
throws IOException {
CarbonDictionaryMetadataReader columnMetadataReaderImpl = getDictionaryMetadataReader();
try {
// read the last segment entry for dictionary metadata
return columnMetadataReaderImpl.readLastEntryOfDictionaryMetaChunk();
} finally {
// Close metadata reader
columnMetadataReaderImpl.close();
}
}
/**
* @return
*/
protected CarbonDictionaryMetadataReader getDictionaryMetadataReader() {
return new CarbonDictionaryMetadataReaderImpl(dictionaryColumnUniqueIdentifier);
}
/**
* This method will open the dictionary sort index file stream for reading
*
* @throws IOException in case any I/O errors occurs
*/
private void openThriftReader() throws IOException {
this.dictionarySortIndexThriftReader =
new ThriftReader(this.sortIndexFilePath, new ThriftReader.TBaseCreator() {
@Override
public TBase create() {
return new ColumnSortInfo();
}
});
dictionarySortIndexThriftReader.open();
}
/**
* Closes this stream and releases any system resources associated
* with it. If the stream is already closed then invoking this
* method has no effect.
*
* @throws IOException if an I/O error occurs
*/
@Override
public void close() throws IOException {
if (null != dictionarySortIndexThriftReader) {
dictionarySortIndexThriftReader.close();
}
}
}