ClickHouse/src/Storages/StorageSnapshot.h

84 lines
2.4 KiB
C++
Raw Normal View History

#pragma once
#include <Storages/StorageInMemoryMetadata.h>
2021-07-21 14:45:19 +00:00
// #include <sparsehash/dense_hash_map>
namespace DB
{
class IStorage;
2021-07-21 14:45:19 +00:00
// #if !defined(ARCADIA_BUILD)
// using NamesAndTypesMap = google::dense_hash_map<StringRef, DataTypePtr, StringRefHash>;
// #else
// using NamesAndTypesMap = google::sparsehash::dense_hash_map<StringRef, DataTypePtr, StringRefHash>;
// #endif
struct StorageSnapshot
{
const IStorage & storage;
const StorageMetadataPtr metadata;
const ColumnsDescription object_columns;
struct Data{};
using DataPtr = std::unique_ptr<const Data>;
const DataPtr data;
2021-07-12 13:45:35 +00:00
/// TODO: fix
mutable const ProjectionDescription * projection = nullptr;
StorageSnapshot(
const IStorage & storage_,
const StorageMetadataPtr & metadata_)
: storage(storage_), metadata(metadata_)
{
2021-07-21 14:45:19 +00:00
init();
}
StorageSnapshot(
const IStorage & storage_,
const StorageMetadataPtr & metadata_,
const ColumnsDescription & object_columns_)
: storage(storage_), metadata(metadata_), object_columns(object_columns_)
{
2021-07-21 14:45:19 +00:00
init();
}
StorageSnapshot(
const IStorage & storage_,
const StorageMetadataPtr & metadata_,
const ColumnsDescription & object_columns_,
DataPtr data_)
: storage(storage_), metadata(metadata_), object_columns(object_columns_), data(std::move(data_))
{
2021-07-21 14:45:19 +00:00
init();
}
NamesAndTypesList getColumns(const GetColumnsOptions & options) const;
NamesAndTypesList getColumnsByNames(const GetColumnsOptions & options, const Names & names) const;
/// Block with ordinary + materialized + aliases + virtuals + subcolumns.
Block getSampleBlockForColumns(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_; }
StorageMetadataPtr getMetadataForQuery() const { return (projection ? projection->metadata : metadata); }
bool isSubcolumnOfObject(const String & name) const;
private:
2021-07-21 14:45:19 +00:00
void init();
std::unordered_map<String, DataTypePtr> virtual_columns;
};
using StorageSnapshotPtr = std::shared_ptr<const StorageSnapshot>;
}