mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-30 05:30:51 +00:00
Better code
This commit is contained in:
parent
01db4877f6
commit
4badd0fd28
@ -60,6 +60,8 @@ Block IStorage::getSampleBlockWithVirtuals() const
|
||||
{
|
||||
auto res = getSampleBlock();
|
||||
|
||||
/// Virtual columns must be appended after ordinary, because user can
|
||||
/// override them.
|
||||
for (const auto & column : getVirtuals())
|
||||
res.insert({column.type->createColumn(), column.type, column.name});
|
||||
|
||||
@ -81,13 +83,16 @@ Block IStorage::getSampleBlockForColumns(const Names & column_names) const
|
||||
Block res;
|
||||
|
||||
std::unordered_map<String, DataTypePtr> columns_map;
|
||||
for (const auto & column : getVirtuals())
|
||||
columns_map.emplace(column.name, column.type);
|
||||
|
||||
NamesAndTypesList all_columns = getColumns().getAll();
|
||||
for (const auto & elem : all_columns)
|
||||
columns_map.emplace(elem.name, elem.type);
|
||||
|
||||
/// Virtual columns must be appended after ordinary, because user can
|
||||
/// override them.
|
||||
for (const auto & column : getVirtuals())
|
||||
columns_map.emplace(column.name, column.type);
|
||||
|
||||
for (const auto & name : column_names)
|
||||
{
|
||||
auto it = columns_map.find(name);
|
||||
@ -422,8 +427,8 @@ void IStorage::renameInMemory(const StorageID & new_table_id)
|
||||
|
||||
const NamesAndTypesList & IStorage::getVirtuals() const
|
||||
{
|
||||
static const NamesAndTypesList VIRTUALS;
|
||||
return VIRTUALS;
|
||||
static const NamesAndTypesList virtuals;
|
||||
return virtuals;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -172,6 +172,16 @@ public: /// thread-unsafe part. lockStructure must be acquired
|
||||
/// If |need_all| is set, then checks that all the columns of the table are in the block.
|
||||
void check(const Block & block, bool need_all = false) const;
|
||||
|
||||
/// Return list of virtual columns (like _part, _table, etc). In the vast
|
||||
/// majority of cases virtual columns are static constant part of Storage
|
||||
/// class and don't depend on Storage object. But sometimes we have fake
|
||||
/// storages, like Merge, which works as proxy for other storages and it's
|
||||
/// virtual columns must contain virtual columns from underlying table.
|
||||
///
|
||||
/// User can create columns with the same name as virtual column. After that
|
||||
/// virtual column will be overriden and inaccessible.
|
||||
///
|
||||
/// By default return empty list of columns.
|
||||
virtual const NamesAndTypesList & getVirtuals() const;
|
||||
|
||||
protected: /// still thread-unsafe part.
|
||||
|
@ -630,14 +630,14 @@ void registerStorageKafka(StorageFactory & factory)
|
||||
|
||||
const NamesAndTypesList & StorageKafka::getVirtuals() const
|
||||
{
|
||||
static const NamesAndTypesList VIRTUALS = {
|
||||
static const NamesAndTypesList virtuals = {
|
||||
{"_topic", std::make_shared<DataTypeString>()},
|
||||
{"_key", std::make_shared<DataTypeString>()},
|
||||
{"_offset", std::make_shared<DataTypeUInt64>()},
|
||||
{"_partition", std::make_shared<DataTypeUInt64>()},
|
||||
{"_timestamp", std::make_shared<DataTypeNullable>(std::make_shared<DataTypeDateTime>())}
|
||||
};
|
||||
return VIRTUALS;
|
||||
return virtuals;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -618,10 +618,10 @@ BlockInputStreams StorageLiveView::watch(
|
||||
|
||||
const NamesAndTypesList & StorageLiveView::getVirtuals() const
|
||||
{
|
||||
static NamesAndTypesList VIRTUALS = {
|
||||
static NamesAndTypesList virtuals = {
|
||||
NameAndTypePair("_version", std::make_shared<DataTypeUInt64>())
|
||||
};
|
||||
return VIRTUALS;
|
||||
return virtuals;
|
||||
}
|
||||
|
||||
void registerStorageLiveView(StorageFactory & factory)
|
||||
|
@ -3610,12 +3610,12 @@ MergeTreeData::AlterConversions MergeTreeData::getAlterConversionsForPart(const
|
||||
|
||||
const NamesAndTypesList & MergeTreeData::getVirtuals() const
|
||||
{
|
||||
static const NamesAndTypesList VIRTUALS = {
|
||||
static const NamesAndTypesList virtuals = {
|
||||
NameAndTypePair("_part", std::make_shared<DataTypeString>()),
|
||||
NameAndTypePair("_part_index", std::make_shared<DataTypeUInt64>()),
|
||||
NameAndTypePair("_partition_id", std::make_shared<DataTypeString>()),
|
||||
NameAndTypePair("_sample_factor", std::make_shared<DataTypeFloat64>()),
|
||||
};
|
||||
return VIRTUALS;
|
||||
return virtuals;
|
||||
}
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ const NamesAndTypesList & StorageDistributed::getVirtuals() const
|
||||
{
|
||||
/// NOTE This is weird. Most of these virtual columns are part of MergeTree
|
||||
/// tables info. But Distributed is general-purpose engine.
|
||||
static const NamesAndTypesList VIRTUALS =
|
||||
static const NamesAndTypesList virtuals =
|
||||
{
|
||||
NameAndTypePair("_table", std::make_shared<DataTypeString>()),
|
||||
NameAndTypePair("_part", std::make_shared<DataTypeString>()),
|
||||
@ -283,7 +283,7 @@ const NamesAndTypesList & StorageDistributed::getVirtuals() const
|
||||
NameAndTypePair("_sample_factor", std::make_shared<DataTypeFloat64>()),
|
||||
NameAndTypePair("_shard_num", std::make_shared<DataTypeUInt32>()),
|
||||
};
|
||||
return VIRTUALS;
|
||||
return virtuals;
|
||||
}
|
||||
|
||||
StorageDistributed::StorageDistributed(
|
||||
|
@ -602,11 +602,11 @@ void registerStorageFile(StorageFactory & factory)
|
||||
}
|
||||
const NamesAndTypesList & StorageFile::getVirtuals() const
|
||||
{
|
||||
static const NamesAndTypesList VIRTUALS = {
|
||||
static const NamesAndTypesList virtuals = {
|
||||
{"_path", std::make_shared<DataTypeString>()},
|
||||
{"_file", std::make_shared<DataTypeString>()}
|
||||
};
|
||||
|
||||
return VIRTUALS;
|
||||
return virtuals;
|
||||
}
|
||||
}
|
||||
|
@ -340,12 +340,12 @@ void registerStorageHDFS(StorageFactory & factory)
|
||||
|
||||
const NamesAndTypesList & StorageHDFS::getVirtuals() const
|
||||
{
|
||||
static const NamesAndTypesList & VIRTUALS = {
|
||||
static const NamesAndTypesList virtuals = {
|
||||
{"_path", std::make_shared<DataTypeString>()},
|
||||
{"_file", std::make_shared<DataTypeString>()}
|
||||
};
|
||||
|
||||
return VIRTUALS;
|
||||
return virtuals;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -55,8 +55,12 @@ StorageMerge::StorageMerge(
|
||||
, source_database(source_database_)
|
||||
, table_name_regexp(table_name_regexp_)
|
||||
, global_context(context_)
|
||||
, virtuals({{"_table", std::make_shared<DataTypeString>()}})
|
||||
{
|
||||
setColumns(columns_);
|
||||
auto first_table = getFirstTable([](auto &&) { return true; });
|
||||
if (first_table)
|
||||
virtuals.insert(virtuals.end(), first_table->getVirtuals().begin(), first_table->getVirtuals().end());
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
@ -510,10 +514,6 @@ void registerStorageMerge(StorageFactory & factory)
|
||||
}
|
||||
const NamesAndTypesList & StorageMerge::getVirtuals() const
|
||||
{
|
||||
static const NamesAndTypesList & VIRTUALS =
|
||||
{
|
||||
{"_table", std::make_shared<DataTypeString>()}
|
||||
};
|
||||
return VIRTUALS;
|
||||
return virtuals;
|
||||
}
|
||||
}
|
||||
|
@ -49,6 +49,7 @@ private:
|
||||
String source_database;
|
||||
OptimizedRegularExpression table_name_regexp;
|
||||
Context global_context;
|
||||
NamesAndTypesList virtuals;
|
||||
|
||||
using StorageWithLockAndName = std::tuple<StoragePtr, TableStructureReadLockHolder, String>;
|
||||
using StorageListWithLocks = std::list<StorageWithLockAndName>;
|
||||
|
@ -353,11 +353,11 @@ void registerStorageS3(StorageFactory & factory)
|
||||
|
||||
const NamesAndTypesList & StorageS3::getVirtuals() const
|
||||
{
|
||||
static const NamesAndTypesList & VIRTUALS = {
|
||||
static const NamesAndTypesList virtuals = {
|
||||
{"_path", std::make_shared<DataTypeString>()},
|
||||
{"_file", std::make_shared<DataTypeString>()}
|
||||
};
|
||||
return VIRTUALS;
|
||||
return virtuals;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -278,9 +278,9 @@ StorageSystemPartsBase::StorageSystemPartsBase(std::string name_, NamesAndTypesL
|
||||
|
||||
const NamesAndTypesList & StorageSystemPartsBase::getVirtuals() const
|
||||
{
|
||||
static NamesAndTypesList VIRTUALS = {
|
||||
static const NamesAndTypesList virtuals = {
|
||||
NameAndTypePair("_state", std::make_shared<DataTypeString>())
|
||||
};
|
||||
return VIRTUALS;
|
||||
return virtuals;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user