blob: 2d26f8575ef3de1ae66f87c91c2550044724aa77 [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.
*/
#ifndef ORC_STRIPE_STREAM_HH
#define ORC_STRIPE_STREAM_HH
#include "orc/Int128.hh"
#include "orc/OrcFile.hh"
#include "orc/Reader.hh"
#include "ColumnReader.hh"
#include "Timezone.hh"
#include "TypeImpl.hh"
namespace orc {
class RowReaderImpl;
class ReadRangeCache;
/**
* StripeStream Implementation
*/
class StripeStreamsImpl : public StripeStreams {
private:
const RowReaderImpl& reader_;
const proto::StripeInformation& stripeInfo_;
const proto::StripeFooter& footer_;
const uint64_t stripeIndex_;
const uint64_t stripeStart_;
InputStream& input_;
const Timezone& writerTimezone_;
const Timezone& readerTimezone_;
std::shared_ptr<ReadRangeCache> readCache_;
public:
StripeStreamsImpl(const RowReaderImpl& reader, uint64_t index,
const proto::StripeInformation& stripeInfo, const proto::StripeFooter& footer,
uint64_t stripeStart, InputStream& input, const Timezone& writerTimezone,
const Timezone& readerTimezone);
virtual ~StripeStreamsImpl() override;
virtual const std::vector<bool> getSelectedColumns() const override;
virtual proto::ColumnEncoding getEncoding(uint64_t columnId) const override;
virtual std::unique_ptr<SeekableInputStream> getStream(uint64_t columnId,
proto::Stream_Kind kind,
bool shouldStream) const override;
MemoryPool& getMemoryPool() const override;
ReaderMetrics* getReaderMetrics() const override;
const Timezone& getWriterTimezone() const override;
const Timezone& getReaderTimezone() const override;
std::ostream* getErrorStream() const override;
bool getThrowOnHive11DecimalOverflow() const override;
bool isDecimalAsLong() const override;
int32_t getForcedScaleOnHive11Decimal() const override;
const SchemaEvolution* getSchemaEvolution() const override;
};
/**
* StreamInformation Implementation
*/
class StreamInformationImpl : public StreamInformation {
private:
StreamKind kind_;
uint64_t column_;
uint64_t offset_;
uint64_t length_;
public:
StreamInformationImpl(uint64_t offset, const proto::Stream& stream)
: kind_(static_cast<StreamKind>(stream.kind())),
column_(stream.column()),
offset_(offset),
length_(stream.length()) {
// PASS
}
~StreamInformationImpl() override;
StreamKind getKind() const override {
return kind_;
}
uint64_t getColumnId() const override {
return column_;
}
uint64_t getOffset() const override {
return offset_;
}
uint64_t getLength() const override {
return length_;
}
};
/**
* StripeInformation Implementation
*/
class StripeInformationImpl : public StripeInformation {
uint64_t offset_;
uint64_t indexLength_;
uint64_t dataLength_;
uint64_t footerLength_;
uint64_t numRows_;
InputStream* stream_;
MemoryPool& memory_;
CompressionKind compression_;
uint64_t blockSize_;
mutable std::unique_ptr<proto::StripeFooter> stripeFooter_;
ReaderMetrics* metrics_;
void ensureStripeFooterLoaded() const;
public:
StripeInformationImpl(uint64_t offset, uint64_t indexLength, uint64_t dataLength,
uint64_t footerLength, uint64_t numRows, InputStream* stream,
MemoryPool& memory, CompressionKind compression, uint64_t blockSize,
ReaderMetrics* metrics)
: offset_(offset),
indexLength_(indexLength),
dataLength_(dataLength),
footerLength_(footerLength),
numRows_(numRows),
stream_(stream),
memory_(memory),
compression_(compression),
blockSize_(blockSize),
metrics_(metrics) {
// PASS
}
virtual ~StripeInformationImpl() override {
// PASS
}
uint64_t getOffset() const override {
return offset_;
}
uint64_t getLength() const override {
return indexLength_ + dataLength_ + footerLength_;
}
uint64_t getIndexLength() const override {
return indexLength_;
}
uint64_t getDataLength() const override {
return dataLength_;
}
uint64_t getFooterLength() const override {
return footerLength_;
}
uint64_t getNumberOfRows() const override {
return numRows_;
}
uint64_t getNumberOfStreams() const override {
ensureStripeFooterLoaded();
return static_cast<uint64_t>(stripeFooter_->streams_size());
}
std::unique_ptr<StreamInformation> getStreamInformation(uint64_t streamId) const override;
ColumnEncodingKind getColumnEncoding(uint64_t colId) const override {
ensureStripeFooterLoaded();
return static_cast<ColumnEncodingKind>(
stripeFooter_->columns(static_cast<int>(colId)).kind());
}
uint64_t getDictionarySize(uint64_t colId) const override {
ensureStripeFooterLoaded();
return static_cast<ColumnEncodingKind>(
stripeFooter_->columns(static_cast<int>(colId)).dictionary_size());
}
const std::string& getWriterTimezone() const override {
ensureStripeFooterLoaded();
return stripeFooter_->writer_timezone();
}
};
} // namespace orc
#endif