2015-04-11 03:10:23 +00:00
|
|
|
#pragma once
|
|
|
|
|
2017-04-01 09:19:00 +00:00
|
|
|
#include <Core/NamesAndTypes.h>
|
2018-03-06 20:18:34 +00:00
|
|
|
#include <Core/Names.h>
|
|
|
|
#include <Storages/ColumnDefault.h>
|
|
|
|
#include <Core/Block.h>
|
2018-10-11 02:57:48 +00:00
|
|
|
#include <Storages/ColumnCodec.h>
|
2019-03-14 15:20:51 +00:00
|
|
|
#include <optional>
|
2015-04-11 03:10:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
2019-03-14 15:20:51 +00:00
|
|
|
struct ColumnDescription
|
|
|
|
{
|
|
|
|
String name;
|
|
|
|
DataTypePtr type;
|
|
|
|
ColumnDefault default_desc;
|
|
|
|
String comment;
|
|
|
|
CompressionCodecPtr codec;
|
2019-04-15 09:30:45 +00:00
|
|
|
ASTPtr ttl;
|
2019-03-14 15:20:51 +00:00
|
|
|
|
|
|
|
ColumnDescription() = default;
|
|
|
|
ColumnDescription(String name_, DataTypePtr type_) : name(std::move(name_)), type(std::move(type_)) {}
|
|
|
|
|
|
|
|
bool operator==(const ColumnDescription & other) const;
|
|
|
|
bool operator!=(const ColumnDescription & other) const { return !(*this == other); }
|
|
|
|
|
|
|
|
void writeText(WriteBuffer & buf) const;
|
|
|
|
void readText(ReadBuffer & buf);
|
|
|
|
};
|
2018-11-12 15:45:35 +00:00
|
|
|
|
2019-03-15 18:52:45 +00:00
|
|
|
class ColumnsDescription
|
2015-04-11 03:10:23 +00:00
|
|
|
{
|
2019-03-14 15:20:51 +00:00
|
|
|
public:
|
2018-03-10 17:03:57 +00:00
|
|
|
ColumnsDescription() = default;
|
2019-03-14 15:20:51 +00:00
|
|
|
explicit ColumnsDescription(NamesAndTypesList ordinary_);
|
2019-03-15 18:52:45 +00:00
|
|
|
ColumnsDescription(const ColumnsDescription & other);
|
|
|
|
ColumnsDescription & operator=(const ColumnsDescription & other);
|
|
|
|
ColumnsDescription(ColumnsDescription &&) noexcept = default;
|
|
|
|
ColumnsDescription & operator=(ColumnsDescription &&) noexcept = default;
|
2018-03-10 17:03:57 +00:00
|
|
|
|
2019-03-14 15:20:51 +00:00
|
|
|
/// `after_column` can be a Nested column name;
|
|
|
|
void add(ColumnDescription column, const String & after_column = String());
|
|
|
|
/// `column_name` can be a Nested column name;
|
|
|
|
void remove(const String & column_name);
|
2018-03-06 20:18:34 +00:00
|
|
|
|
2019-03-14 15:20:51 +00:00
|
|
|
void flattenNested(); /// TODO: remove, insert already flattened Nested columns.
|
|
|
|
|
|
|
|
bool operator==(const ColumnsDescription & other) const { return columns == other.columns; }
|
2018-03-06 20:18:34 +00:00
|
|
|
bool operator!=(const ColumnsDescription & other) const { return !(*this == other); }
|
|
|
|
|
2019-03-14 15:20:51 +00:00
|
|
|
std::list<ColumnDescription>::const_iterator begin() const { return columns.begin(); }
|
|
|
|
std::list<ColumnDescription>::const_iterator end() const { return columns.end(); }
|
2018-03-10 17:03:57 +00:00
|
|
|
|
2019-03-14 15:20:51 +00:00
|
|
|
NamesAndTypesList getOrdinary() const;
|
|
|
|
NamesAndTypesList getMaterialized() const;
|
|
|
|
NamesAndTypesList getAliases() const;
|
2018-03-10 17:03:57 +00:00
|
|
|
/// ordinary + materialized + aliases.
|
|
|
|
NamesAndTypesList getAll() const;
|
2018-03-06 20:18:34 +00:00
|
|
|
|
2019-04-15 09:30:45 +00:00
|
|
|
using ColumnTTLs = std::unordered_map<String, ASTPtr>;
|
|
|
|
ColumnTTLs getColumnTTLs() const;
|
|
|
|
|
2019-03-14 15:20:51 +00:00
|
|
|
bool has(const String & column_name) const;
|
|
|
|
bool hasNested(const String & column_name) const;
|
|
|
|
ColumnDescription & get(const String & column_name);
|
|
|
|
const ColumnDescription & get(const String & column_name) const;
|
2018-03-06 20:18:34 +00:00
|
|
|
|
2019-03-14 15:20:51 +00:00
|
|
|
/// ordinary + materialized.
|
|
|
|
NamesAndTypesList getAllPhysical() const;
|
|
|
|
Names getNamesOfPhysical() const;
|
2018-03-13 15:00:28 +00:00
|
|
|
bool hasPhysical(const String & column_name) const;
|
2019-03-14 15:20:51 +00:00
|
|
|
NameAndTypePair getPhysical(const String & column_name) const;
|
2015-04-11 03:10:23 +00:00
|
|
|
|
2019-03-14 15:20:51 +00:00
|
|
|
ColumnDefaults getDefaults() const; /// TODO: remove
|
|
|
|
bool hasDefault(const String & column_name) const;
|
|
|
|
std::optional<ColumnDefault> getDefault(const String & column_name) const;
|
2015-04-11 03:10:23 +00:00
|
|
|
|
2018-12-21 12:17:30 +00:00
|
|
|
CompressionCodecPtr getCodecOrDefault(const String & column_name, CompressionCodecPtr default_codec) const;
|
2019-01-21 14:00:06 +00:00
|
|
|
CompressionCodecPtr getCodecOrDefault(const String & column_name) const;
|
|
|
|
|
2019-03-14 15:20:51 +00:00
|
|
|
String toString() const;
|
2017-04-01 07:20:54 +00:00
|
|
|
static ColumnsDescription parse(const String & str);
|
2018-10-11 02:57:48 +00:00
|
|
|
|
2018-12-04 20:03:04 +00:00
|
|
|
static const ColumnsDescription * loadFromContext(const Context & context, const String & db, const String & table);
|
2019-03-15 18:52:45 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
std::list<ColumnDescription> columns;
|
|
|
|
std::unordered_map<String, std::list<ColumnDescription>::iterator> name_to_column;
|
2015-04-11 03:10:23 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|