diff options
author | vitalyisaev <[email protected]> | 2023-11-14 09:58:56 +0300 |
---|---|---|
committer | vitalyisaev <[email protected]> | 2023-11-14 10:20:20 +0300 |
commit | c2b2dfd9827a400a8495e172a56343462e3ceb82 (patch) | |
tree | cd4e4f597d01bede4c82dffeb2d780d0a9046bd0 /contrib/clickhouse/src/TableFunctions/TableFunctionRedis.cpp | |
parent | d4ae8f119e67808cb0cf776ba6e0cf95296f2df7 (diff) |
YQ Connector: move tests from yql to ydb (OSS)
Перенос папки с тестами на Коннектор из папки yql в папку ydb (синхронизируется с github).
Diffstat (limited to 'contrib/clickhouse/src/TableFunctions/TableFunctionRedis.cpp')
-rw-r--r-- | contrib/clickhouse/src/TableFunctions/TableFunctionRedis.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/contrib/clickhouse/src/TableFunctions/TableFunctionRedis.cpp b/contrib/clickhouse/src/TableFunctions/TableFunctionRedis.cpp new file mode 100644 index 00000000000..0b7433845b4 --- /dev/null +++ b/contrib/clickhouse/src/TableFunctions/TableFunctionRedis.cpp @@ -0,0 +1,94 @@ +#include <TableFunctions/TableFunctionRedis.h> + +#include <Common/Exception.h> +#include <Common/parseAddress.h> + +#include <Interpreters/Context.h> + +#include <Parsers/ASTFunction.h> +#include <Parsers/ASTIdentifier.h> + +#include <Interpreters/parseColumnsListForTableFunction.h> +#include <Storages/ColumnsDescription.h> +#include <TableFunctions/TableFunctionFactory.h> +#include <TableFunctions/registerTableFunctions.h> +#include <Storages/checkAndGetLiteralArgument.h> +#include <Interpreters/evaluateConstantExpression.h> + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} + +StoragePtr TableFunctionRedis::executeImpl( + const ASTPtr & /*ast_function*/, ContextPtr context, const String & table_name, ColumnsDescription /*cached_columns*/, bool is_insert_query) const +{ + auto columns = getActualTableStructure(context, is_insert_query); + + StorageInMemoryMetadata metadata; + metadata.setColumns(columns); + + String db_name = "redis" + getDatabaseName() + "_db_" + toString(configuration.db_index); + auto storage = std::make_shared<StorageRedis>( + StorageID(db_name, table_name), configuration, context, metadata, primary_key); + storage->startup(); + return storage; +} + +ColumnsDescription TableFunctionRedis::getActualTableStructure(ContextPtr context, bool /*is_insert_query*/) const +{ + return parseColumnsListFromString(structure, context); +} + +void TableFunctionRedis::parseArguments(const ASTPtr & ast_function, ContextPtr context) +{ + const auto & func_args = ast_function->as<ASTFunction &>(); + if (!func_args.arguments) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Table function 'redis' must have arguments."); + + ASTs & args = func_args.arguments->children; + + if (args.size() < 3) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Bad arguments count when creating Redis table function"); + + for (auto & arg : args) + arg = evaluateConstantExpressionOrIdentifierAsLiteral(arg, context); + + auto parsed_host_port = parseAddress(checkAndGetLiteralArgument<String>(args[0], "host:port"), 6379); + configuration.host = parsed_host_port.first; + configuration.port = parsed_host_port.second; + + primary_key = checkAndGetLiteralArgument<String>(args[1], "key"); + structure = checkAndGetLiteralArgument<String>(args[2], "structure"); + + if (args.size() > 3) + configuration.db_index = static_cast<uint32_t>(checkAndGetLiteralArgument<UInt64>(args[3], "db_index")); + else + configuration.db_index = DEFAULT_REDIS_DB_INDEX; + if (args.size() > 4) + configuration.password = checkAndGetLiteralArgument<String>(args[4], "password"); + else + configuration.password = DEFAULT_REDIS_PASSWORD; + if (args.size() > 5) + configuration.pool_size = static_cast<uint32_t>(checkAndGetLiteralArgument<UInt64>(args[5], "pool_size")); + else + configuration.pool_size = DEFAULT_REDIS_POOL_SIZE; + + context->getRemoteHostFilter().checkHostAndPort(configuration.host, toString(configuration.port)); + + auto columns = parseColumnsListFromString(structure, context); + if (!columns.has(primary_key)) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Bad arguments redis table function structure should contains key."); +} + + +void registerTableFunctionRedis(TableFunctionFactory & factory) +{ + factory.registerFunction<TableFunctionRedis>(); +} + +} |