#pragma once
#include <cstddef>
#include "column.h"
#include "column_chunk_data.h"
#include "common/types/types.h"
namespace lbug {
namespace storage {
struct ListOffsetSizeInfo {
common::offset_t numTotal;
std::unique_ptr<ColumnChunkData> offsetColumnChunk;
std::unique_ptr<ColumnChunkData> sizeColumnChunk;
ListOffsetSizeInfo(common::offset_t numTotal,
std::unique_ptr<ColumnChunkData> offsetColumnChunk,
std::unique_ptr<ColumnChunkData> sizeColumnChunk)
: numTotal{numTotal}, offsetColumnChunk{std::move(offsetColumnChunk)},
sizeColumnChunk{std::move(sizeColumnChunk)} {}
common::list_size_t getListSize(uint64_t pos) const;
common::offset_t getListEndOffset(uint64_t pos) const;
common::offset_t getListStartOffset(uint64_t pos) const;
bool isOffsetSortedAscending(uint64_t startPos, uint64_t endPos) const;
};
class ListColumn final : public Column {
static constexpr common::idx_t SIZE_COLUMN_CHILD_READ_STATE_IDX = 0;
static constexpr common::idx_t DATA_COLUMN_CHILD_READ_STATE_IDX = 1;
static constexpr common::idx_t OFFSET_COLUMN_CHILD_READ_STATE_IDX = 2;
static constexpr size_t CHILD_COLUMN_COUNT = 3;
public:
ListColumn(std::string name, common::LogicalType dataType, FileHandle* dataFH,
MemoryManager* mm, ShadowFile* shadowFile, bool enableCompression);
static bool disableCompressionOnData(const common::LogicalType& dataType);
static std::unique_ptr<ColumnChunkData> flushChunkData(const ColumnChunkData& chunk,
PageAllocator& pageAllocator);
Column* getOffsetColumn() const { return offsetColumn.get(); }
Column* getSizeColumn() const { return sizeColumn.get(); }
Column* getDataColumn() const { return dataColumn.get(); }
std::vector<std::unique_ptr<ColumnChunkData>> checkpointSegment(
ColumnCheckpointState&& checkpointState, PageAllocator& pageAllocator,
bool canSplitSegment = true) const override;
protected:
void scanSegment(const SegmentState& state, common::offset_t startOffsetInChunk,
common::row_idx_t numValuesToScan, common::ValueVector* resultVector,
common::offset_t offsetInResult) const override;
void scanSegment(const SegmentState& state, ColumnChunkData* resultChunk,
common::offset_t startOffsetInSegment, common::row_idx_t numValuesToScan) const override;
void lookupInternal(const SegmentState& state, common::offset_t nodeOffset,
common::ValueVector* resultVector, uint32_t posInVector) const override;
private:
void scanUnfiltered(const SegmentState& state, common::ValueVector* resultVector,
uint64_t numValuesToScan, const ListOffsetSizeInfo& listOffsetInfoInStorage,
common::offset_t offsetInResult) const;
void scanFiltered(const SegmentState& state, common::offset_t startOffsetInChunk,
common::ValueVector* offsetVector, const ListOffsetSizeInfo& listOffsetInfoInStorage,
common::offset_t offsetInResult) const;
common::offset_t readOffset(const SegmentState& state,
common::offset_t offsetInNodeGroup) const;
common::list_size_t readSize(const SegmentState& state,
common::offset_t offsetInNodeGroup) const;
ListOffsetSizeInfo getListOffsetSizeInfo(const SegmentState& state,
common::offset_t startOffsetInSegment, common::offset_t numOffsetsToRead) const;
private:
std::unique_ptr<Column> offsetColumn;
std::unique_ptr<Column> sizeColumn;
std::unique_ptr<Column> dataColumn;
};
} }