2017-12-04 12:15:21 +00:00
|
|
|
#include <Storages/System/StorageSystemModels.h>
|
|
|
|
#include <DataTypes/DataTypeString.h>
|
|
|
|
#include <DataTypes/DataTypesNumber.h>
|
|
|
|
#include <DataTypes/DataTypeDateTime.h>
|
|
|
|
#include <Columns/ColumnsNumber.h>
|
|
|
|
#include <Columns/ColumnString.h>
|
|
|
|
#include <DataStreams/OneBlockInputStream.h>
|
|
|
|
#include <Interpreters/Context.h>
|
|
|
|
#include <Interpreters/ExternalModels.h>
|
|
|
|
#include <Dictionaries/CatBoostModel.h>
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
StorageSystemModels::StorageSystemModels(const std::string & name)
|
2017-12-16 00:49:03 +00:00
|
|
|
: name{name},
|
|
|
|
columns{
|
|
|
|
{ "name", std::make_shared<DataTypeString>() },
|
|
|
|
{ "origin", std::make_shared<DataTypeString>() },
|
|
|
|
{ "type", std::make_shared<DataTypeString>() },
|
|
|
|
{ "creation_time", std::make_shared<DataTypeDateTime>() },
|
|
|
|
{ "last_exception", std::make_shared<DataTypeString>() }
|
|
|
|
}
|
2017-12-04 12:15:21 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BlockInputStreams StorageSystemModels::read(
|
|
|
|
const Names & column_names,
|
|
|
|
const SelectQueryInfo &,
|
|
|
|
const Context & context,
|
|
|
|
QueryProcessingStage::Enum & processed_stage,
|
|
|
|
const size_t,
|
|
|
|
const unsigned)
|
|
|
|
{
|
|
|
|
check(column_names);
|
|
|
|
processed_stage = QueryProcessingStage::FetchColumns;
|
|
|
|
|
|
|
|
const auto & external_models = context.getExternalModels();
|
|
|
|
auto objects_map = external_models.getObjectsMap();
|
|
|
|
const auto & models = objects_map.get();
|
|
|
|
|
2017-12-16 00:49:03 +00:00
|
|
|
MutableColumns res_columns = getSampleBlock().cloneEmptyColumns();
|
|
|
|
|
2017-12-04 12:15:21 +00:00
|
|
|
for (const auto & model_info : models)
|
|
|
|
{
|
2017-12-16 00:49:03 +00:00
|
|
|
res_columns[0]->insert(model_info.first);
|
|
|
|
res_columns[1]->insert(model_info.second.origin);
|
2017-12-04 12:15:21 +00:00
|
|
|
|
|
|
|
if (model_info.second.loadable)
|
|
|
|
{
|
|
|
|
const auto model_ptr = std::static_pointer_cast<IModel>(model_info.second.loadable);
|
|
|
|
|
2017-12-16 00:49:03 +00:00
|
|
|
res_columns[2]->insert(model_ptr->getTypeName());
|
|
|
|
res_columns[3]->insert(static_cast<UInt64>(std::chrono::system_clock::to_time_t(model_ptr->getCreationTime())));
|
2017-12-04 12:15:21 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-12-16 00:49:03 +00:00
|
|
|
res_columns[2]->insertDefault();
|
|
|
|
res_columns[3]->insertDefault();
|
2017-12-04 12:15:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (model_info.second.exception)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
std::rethrow_exception(model_info.second.exception);
|
|
|
|
}
|
|
|
|
catch (...)
|
|
|
|
{
|
2017-12-16 00:49:03 +00:00
|
|
|
res_columns[4]->insert(getCurrentExceptionMessage(false));
|
2017-12-04 12:15:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2017-12-16 00:49:03 +00:00
|
|
|
res_columns[4]->insertDefault();
|
2017-12-04 12:15:21 +00:00
|
|
|
}
|
|
|
|
|
2017-12-16 00:49:03 +00:00
|
|
|
return BlockInputStreams(1, std::make_shared<OneBlockInputStream>(getSampleBlock().cloneWithColumns(std::move(res_columns))));
|
2017-12-04 12:15:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|