ClickHouse/dbms/src/Storages/StorageDictionary.cpp

96 lines
3.4 KiB
C++
Raw Normal View History

2017-04-25 09:10:27 +00:00
#include <sstream>
#include <Parsers/ASTCreateQuery.h>
#include <Dictionaries/IDictionarySource.h>
#include <Dictionaries/DictionaryStructure.h>
2017-04-27 17:16:24 +00:00
#include <Dictionaries/CacheDictionary.h>
2017-04-25 09:10:27 +00:00
#include <Storages/StorageDictionary.h>
#include <Interpreters/Context.h>
2017-04-27 17:16:24 +00:00
#include <common/logger_useful.h>
2017-04-25 09:10:27 +00:00
namespace DB {
StoragePtr StorageDictionary::create(
const String & table_name_,
const String & database_name_,
Context & context_,
ASTPtr & query_,
NamesAndTypesListPtr columns_,
const NamesAndTypesList & materialized_columns_,
const NamesAndTypesList & alias_columns_,
const ColumnDefaults & column_defaults_)
{
return make_shared(
table_name_, database_name_, context_, query_,
columns_, materialized_columns_, alias_columns_, column_defaults_,
context_.getExternalDictionaries()
);
}
StorageDictionary::StorageDictionary(
const String & table_name_,
const String & database_name_,
Context & context_,
ASTPtr & query_,
NamesAndTypesListPtr columns_,
const NamesAndTypesList & materialized_columns_,
const NamesAndTypesList & alias_columns_,
const ColumnDefaults & column_defaults_,
const ExternalDictionaries & external_dictionaries_)
: IStorage{materialized_columns_, alias_columns_, column_defaults_}, table_name(table_name_),
database_name(database_name_), context(context_), columns(columns_),
external_dictionaries(external_dictionaries_)
{
logger = &Poco::Logger::get("StorageDictionary");
ASTCreateQuery & create = typeid_cast<ASTCreateQuery &>(*query_);
const ASTFunction & function = typeid_cast<const ASTFunction &> (*create.storage);
if (function.arguments) {
std::stringstream iss;
function.arguments->format(IAST::FormatSettings(iss, false, false));
dictionary_name = iss.str();
}
dictionary = external_dictionaries.getDictionary(dictionary_name);
checkNamesAndTypesCompatibleWithDictionary();
}
BlockInputStreams StorageDictionary::read(
const Names & column_names,
ASTPtr query,
const Context & context,
const Settings & settings,
QueryProcessingStage::Enum & processed_stage,
const size_t max_block_size,
const unsigned threads)
{
processed_stage = QueryProcessingStage::FetchColumns;
2017-04-27 17:16:24 +00:00
return BlockInputStreams{dictionary->getBlockInputStream()};
2017-04-25 09:10:27 +00:00
}
void StorageDictionary::checkNamesAndTypesCompatibleWithDictionary()
{
const DictionaryStructure & dictionaryStructure = dictionary->getStructure();
2017-04-27 17:16:24 +00:00
2017-04-25 09:10:27 +00:00
std::set<NameAndTypePair> dictionaryNamesAndTypes;
for (const auto & attribute : dictionaryStructure.attributes) {
dictionaryNamesAndTypes.insert(NameAndTypePair(attribute.name, attribute.type));
}
if (dictionaryStructure.key) {
for (const auto & attribute : *dictionaryStructure.key) {
dictionaryNamesAndTypes.insert(NameAndTypePair(attribute.name, attribute.type));
}
}
for (auto & column : *columns) {
if (dictionaryNamesAndTypes.find(column) == dictionaryNamesAndTypes.end()) {
std::string message = "Not found column ";
message += column.name + " " + column.type->getName();
message += " in dictionary " + dictionary_name + ". ";
message += "There are only columns ";
message += generateNamesAndTypesDescription(
dictionaryNamesAndTypes.begin(), dictionaryNamesAndTypes.end());
throw Exception(message);
}
}
}
}