ClickHouse/dbms/src/Storages/System/StorageSystemGraphite.cpp

145 lines
5.2 KiB
C++
Raw Normal View History

#include <Storages/System/StorageSystemGraphite.h>
#include <Storages/StorageMergeTree.h>
#include <Storages/StorageReplicatedMergeTree.h>
#include <Interpreters/Context.h>
2017-02-14 14:24:30 +00:00
2018-06-05 19:46:49 +00:00
2017-02-14 14:24:30 +00:00
namespace DB
{
NamesAndTypesList StorageSystemGraphite::getNamesAndTypes()
{
return {
{"config_name", std::make_shared<DataTypeString>()},
{"regexp", std::make_shared<DataTypeString>()},
{"function", std::make_shared<DataTypeString>()},
{"age", std::make_shared<DataTypeUInt64>()},
{"precision", std::make_shared<DataTypeUInt64>()},
{"priority", std::make_shared<DataTypeUInt16>()},
{"is_default", std::make_shared<DataTypeUInt8>()},
{"Tables.database", std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>())},
{"Tables.table", std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>())},
};
}
/*
* Looking for (Replicated)*GraphiteMergeTree and get all configuration parameters for them
*/
StorageSystemGraphite::Configs StorageSystemGraphite::getConfigs(const Context & context) const
{
const Databases databases = context.getDatabases();
Configs graphite_configs;
for (const auto & db : databases)
{
for (auto iterator = db.second->getIterator(context); iterator->isValid(); iterator->next())
{
auto & table = iterator->table();
const MergeTreeData * table_data = nullptr;
if (const StorageMergeTree * merge_tree = dynamic_cast<StorageMergeTree *>(table.get()))
{
2019-03-07 16:55:53 +00:00
table_data = &merge_tree->getData();
}
else if (const StorageReplicatedMergeTree * replicated_merge_tree = dynamic_cast<StorageReplicatedMergeTree *>(table.get()))
{
2019-03-07 16:55:53 +00:00
table_data = &replicated_merge_tree->getData();
}
else
{
continue;
}
if (table_data->merging_params.mode == MergeTreeData::MergingParams::Graphite)
{
2019-03-07 16:55:53 +00:00
const String & config_name = table_data->merging_params.graphite_params.config_name;
2019-03-07 16:55:53 +00:00
if (!graphite_configs.count(config_name))
{
2019-03-07 16:55:53 +00:00
Config new_config =
{
/// FIXME Do we own a table? (possible dangling reference)
&table_data->merging_params.graphite_params,
{ table_data->getDatabaseName() },
{ table_data->getTableName() },
};
graphite_configs.emplace(config_name, new_config);
}
else
{
graphite_configs[config_name].databases.emplace_back(table_data->getDatabaseName());
graphite_configs[config_name].tables.emplace_back(table_data->getTableName());
}
}
}
}
return graphite_configs;
}
void StorageSystemGraphite::fillData(MutableColumns & res_columns, const Context & context, const SelectQueryInfo &) const
{
Configs graphite_configs = StorageSystemGraphite::getConfigs(context);
for (const auto & config : graphite_configs)
{
UInt16 priority = 0;
for (const auto & pattern : config.second.graphite_params->patterns)
{
bool is_default = pattern.regexp == nullptr;
2019-03-07 16:55:53 +00:00
String regexp;
String function;
2017-02-14 14:24:30 +00:00
if (is_default)
{
priority = std::numeric_limits<UInt16>::max();
}
else
{
priority++;
2019-03-07 16:55:53 +00:00
/// FIXME Null pointer dereference for trivial patterns.
regexp = pattern.regexp->getRE2()->pattern();
}
2017-02-14 14:24:30 +00:00
if (pattern.function)
{
function = pattern.function->getName();
}
if (!pattern.retentions.empty())
{
for (const auto & retention : pattern.retentions)
{
size_t i = 0;
res_columns[i++]->insert(config.first);
res_columns[i++]->insert(regexp);
res_columns[i++]->insert(function);
res_columns[i++]->insert(retention.age);
res_columns[i++]->insert(retention.precision);
res_columns[i++]->insert(priority);
res_columns[i++]->insert(is_default);
res_columns[i++]->insert(config.second.databases);
res_columns[i++]->insert(config.second.tables);
}
}
else
{
size_t i = 0;
res_columns[i++]->insert(config.first);
res_columns[i++]->insert(regexp);
res_columns[i++]->insert(function);
res_columns[i++]->insert(NULL);
res_columns[i++]->insert(NULL);
res_columns[i++]->insert(priority);
res_columns[i++]->insert(is_default);
res_columns[i++]->insert(config.second.databases);
res_columns[i++]->insert(config.second.tables);
}
}
}
2017-02-14 14:24:30 +00:00
}
}