2019-03-14 02:55:04 +00:00
|
|
|
#include <Functions/FunctionsJSON.h>
|
2019-05-16 19:39:42 +00:00
|
|
|
#include <Functions/FunctionFactory.h>
|
2019-03-14 02:55:04 +00:00
|
|
|
|
2019-05-07 23:31:35 +00:00
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
2020-07-11 21:04:22 +00:00
|
|
|
namespace ErrorCodes
|
|
|
|
{
|
|
|
|
extern const int ILLEGAL_TYPE_OF_ARGUMENT;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-10-11 19:20:20 +00:00
|
|
|
std::vector<FunctionJSONHelpers::Move> FunctionJSONHelpers::prepareMoves(const char * function_name, ColumnsWithTypeAndName & block, const ColumnNumbers & arguments, size_t first_index_argument, size_t num_index_arguments)
|
2020-07-11 21:04:22 +00:00
|
|
|
{
|
|
|
|
std::vector<Move> moves;
|
|
|
|
moves.reserve(num_index_arguments);
|
|
|
|
for (const auto i : ext::range(first_index_argument, first_index_argument + num_index_arguments))
|
|
|
|
{
|
2020-10-10 18:24:57 +00:00
|
|
|
const auto & column = block[arguments[i]];
|
2020-07-11 21:04:22 +00:00
|
|
|
if (!isString(column.type) && !isInteger(column.type))
|
|
|
|
throw Exception{"The argument " + std::to_string(i + 1) + " of function " + String(function_name)
|
|
|
|
+ " should be a string specifying key or an integer specifying index, illegal type: " + column.type->getName(),
|
|
|
|
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT};
|
|
|
|
|
|
|
|
if (column.column && isColumnConst(*column.column))
|
|
|
|
{
|
|
|
|
const auto & column_const = assert_cast<const ColumnConst &>(*column.column);
|
|
|
|
if (isString(column.type))
|
|
|
|
moves.emplace_back(MoveType::ConstKey, column_const.getValue<String>());
|
|
|
|
else
|
|
|
|
moves.emplace_back(MoveType::ConstIndex, column_const.getInt(0));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (isString(column.type))
|
|
|
|
moves.emplace_back(MoveType::Key, "");
|
|
|
|
else
|
|
|
|
moves.emplace_back(MoveType::Index, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return moves;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t FunctionJSONHelpers::calculateMaxSize(const ColumnString::Offsets & offsets)
|
|
|
|
{
|
|
|
|
size_t max_size = 0;
|
|
|
|
for (const auto i : ext::range(0, offsets.size()))
|
|
|
|
{
|
|
|
|
size_t size = offsets[i] - offsets[i - 1];
|
|
|
|
if (max_size < size)
|
|
|
|
max_size = size;
|
|
|
|
}
|
|
|
|
if (max_size)
|
|
|
|
--max_size;
|
|
|
|
return max_size;
|
|
|
|
}
|
|
|
|
|
2019-05-07 23:31:35 +00:00
|
|
|
|
2019-03-14 02:55:04 +00:00
|
|
|
void registerFunctionsJSON(FunctionFactory & factory)
|
|
|
|
{
|
2019-05-16 19:39:42 +00:00
|
|
|
factory.registerFunction<FunctionJSON<NameJSONHas, JSONHasImpl>>();
|
2019-10-19 07:26:19 +00:00
|
|
|
factory.registerFunction<FunctionJSON<NameIsValidJSON, IsValidJSONImpl>>();
|
2019-05-16 19:39:42 +00:00
|
|
|
factory.registerFunction<FunctionJSON<NameJSONLength, JSONLengthImpl>>();
|
|
|
|
factory.registerFunction<FunctionJSON<NameJSONKey, JSONKeyImpl>>();
|
|
|
|
factory.registerFunction<FunctionJSON<NameJSONType, JSONTypeImpl>>();
|
|
|
|
factory.registerFunction<FunctionJSON<NameJSONExtractInt, JSONExtractInt64Impl>>();
|
|
|
|
factory.registerFunction<FunctionJSON<NameJSONExtractUInt, JSONExtractUInt64Impl>>();
|
|
|
|
factory.registerFunction<FunctionJSON<NameJSONExtractFloat, JSONExtractFloat64Impl>>();
|
|
|
|
factory.registerFunction<FunctionJSON<NameJSONExtractBool, JSONExtractBoolImpl>>();
|
|
|
|
factory.registerFunction<FunctionJSON<NameJSONExtractString, JSONExtractStringImpl>>();
|
|
|
|
factory.registerFunction<FunctionJSON<NameJSONExtract, JSONExtractImpl>>();
|
|
|
|
factory.registerFunction<FunctionJSON<NameJSONExtractKeysAndValues, JSONExtractKeysAndValuesImpl>>();
|
|
|
|
factory.registerFunction<FunctionJSON<NameJSONExtractRaw, JSONExtractRawImpl>>();
|
2019-12-08 00:18:24 +00:00
|
|
|
factory.registerFunction<FunctionJSON<NameJSONExtractArrayRaw, JSONExtractArrayRawImpl>>();
|
2020-04-20 10:08:22 +00:00
|
|
|
factory.registerFunction<FunctionJSON<NameJSONExtractKeysAndValuesRaw, JSONExtractKeysAndValuesRawImpl>>();
|
2019-03-14 02:55:04 +00:00
|
|
|
}
|
2019-05-07 23:31:35 +00:00
|
|
|
|
2019-03-14 02:55:04 +00:00
|
|
|
}
|