Better code

This commit is contained in:
alesapin 2020-04-27 20:46:51 +03:00
parent 01db4877f6
commit 4badd0fd28
12 changed files with 41 additions and 25 deletions

View File

@ -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;
}
}

View File

@ -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.

View File

@ -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;
}
}

View File

@ -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)

View File

@ -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;
}
}

View File

@ -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(

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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>;

View File

@ -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;
}
}

View File

@ -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;
}
}