ClickHouse/src/Storages/StorageSnapshot.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

90 lines
3.1 KiB
C++
Raw Normal View History

#pragma once
#include <Storages/StorageInMemoryMetadata.h>
2024-02-21 00:57:35 +00:00
#include <Storages/VirtualColumnsDescription.h>
namespace DB
{
class IStorage;
2024-02-21 00:57:35 +00:00
class ICompressionCodec;
using CompressionCodecPtr = std::shared_ptr<ICompressionCodec>;
2022-03-01 16:32:55 +00:00
/// Snapshot of storage that fixes set columns that can be read in query.
/// There are 3 sources of columns: regular columns from metadata,
/// dynamic columns from object Types, virtual columns.
struct StorageSnapshot
{
const IStorage & storage;
const StorageMetadataPtr metadata;
const VirtualsDescriptionPtr virtual_columns;
const ColumnsDescription object_columns;
2022-03-01 16:32:55 +00:00
/// Additional data, on which set of columns may depend.
/// E.g. data parts in MergeTree, list of blocks in Memory, etc.
2021-08-02 19:49:52 +00:00
struct Data
{
virtual ~Data() = default;
};
using DataPtr = std::unique_ptr<Data>;
DataPtr data;
2022-03-01 16:32:55 +00:00
/// Projection that is used in query.
2021-07-12 13:45:35 +00:00
mutable const ProjectionDescription * projection = nullptr;
StorageSnapshot(
const IStorage & storage_,
2024-02-21 00:57:35 +00:00
StorageMetadataPtr metadata_);
StorageSnapshot(
const IStorage & storage_,
2023-05-25 22:54:54 +00:00
StorageMetadataPtr metadata_,
2024-02-21 00:57:35 +00:00
ColumnsDescription object_columns_);
StorageSnapshot(
const IStorage & storage_,
2023-05-25 22:54:54 +00:00
StorageMetadataPtr metadata_,
ColumnsDescription object_columns_,
2024-02-21 00:57:35 +00:00
DataPtr data_);
std::shared_ptr<StorageSnapshot> clone(DataPtr data_) const;
2022-03-01 16:32:55 +00:00
/// Get all available columns with types according to options.
NamesAndTypesList getColumns(const GetColumnsOptions & options) const;
2022-03-01 16:32:55 +00:00
/// Get columns with types according to options only for requested names.
NamesAndTypesList getColumnsByNames(const GetColumnsOptions & options, const Names & names) const;
2022-03-28 17:21:47 +00:00
/// Get column with type according to options for requested name.
std::optional<NameAndTypePair> tryGetColumn(const GetColumnsOptions & options, const String & column_name) const;
NameAndTypePair getColumn(const GetColumnsOptions & options, const String & column_name) const;
2024-02-21 00:57:35 +00:00
CompressionCodecPtr getCodecOrDefault(const String & column_name, CompressionCodecPtr default_codec) const;
CompressionCodecPtr getCodecOrDefault(const String & column_name) const;
ASTPtr getCodecDescOrDefault(const String & column_name, CompressionCodecPtr default_codec) const;
/// Block with ordinary + materialized + aliases + virtuals + subcolumns.
Block getSampleBlockForColumns(const Names & column_names) const;
ColumnsDescription getDescriptionForColumns(const Names & column_names) const;
/// Verify that all the requested names are in the table and are set correctly:
/// list of names is not empty and the names do not repeat.
void check(const Names & column_names) const;
DataTypePtr getConcreteType(const String & column_name) const;
2021-07-12 13:45:35 +00:00
void addProjection(const ProjectionDescription * projection_) const { projection = projection_; }
2022-03-01 16:32:55 +00:00
/// If we have a projection then we should use its metadata.
StorageMetadataPtr getMetadataForQuery() const { return projection ? projection->metadata : metadata; }
private:
2021-07-21 14:45:19 +00:00
void init();
};
using StorageSnapshotPtr = std::shared_ptr<StorageSnapshot>;
}