mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
Even better
This commit is contained in:
parent
947106972d
commit
265e2b30a8
@ -92,7 +92,7 @@ namespace
|
||||
}
|
||||
};
|
||||
|
||||
auto parse_json_document = [](const IColumn & column, rapidjson::Document & document, size_t i)
|
||||
auto parse_json_document = [](const ColumnString & column, rapidjson::Document & document, size_t i)
|
||||
{
|
||||
auto str_ref = column.getDataAt(i);
|
||||
const char * json = str_ref.data;
|
||||
@ -102,11 +102,12 @@ namespace
|
||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Wrong JSON string to merge. Expected JSON object");
|
||||
};
|
||||
|
||||
const auto * first_column_arg = arguments[0].column.get();
|
||||
const auto * first_column_arg_string = checkAndGetColumn<ColumnString>(first_column_arg);
|
||||
const auto * first_column_arg_const = checkAndGetColumnConst<ColumnString>(first_column_arg);
|
||||
const bool is_first_const = isColumnConst(*arguments[0].column);
|
||||
const auto * first_column_arg_string = is_first_const
|
||||
? checkAndGetColumnConstData<ColumnString>(arguments[0].column.get())
|
||||
: checkAndGetColumn<ColumnString>(arguments[0].column.get());
|
||||
|
||||
if (!first_column_arg_string && !first_column_arg_const)
|
||||
if (!first_column_arg_string)
|
||||
throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Arguments of function {} must be strings", getName());
|
||||
|
||||
std::vector<rapidjson::Document> merged_jsons;
|
||||
@ -115,22 +116,29 @@ namespace
|
||||
for (size_t i = 0; i < input_rows_count; ++i)
|
||||
{
|
||||
auto & merged_json = merged_jsons.emplace_back(rapidjson::Type::kObjectType, &allocator);
|
||||
parse_json_document(*first_column_arg, merged_json, i);
|
||||
if (is_first_const)
|
||||
parse_json_document(*first_column_arg_string, merged_json, 0);
|
||||
else
|
||||
parse_json_document(*first_column_arg_string, merged_json, i);
|
||||
}
|
||||
|
||||
for (size_t col_idx = 1; col_idx < arguments.size(); ++col_idx)
|
||||
{
|
||||
const auto * column_arg = arguments[col_idx].column.get();
|
||||
const auto * column_arg_string = checkAndGetColumn<ColumnString>(column_arg);
|
||||
const auto * column_arg_const = checkAndGetColumnConst<ColumnString>(column_arg);
|
||||
const bool is_const = isColumnConst(*arguments[col_idx].column);
|
||||
const auto * column_arg_string = is_const
|
||||
? checkAndGetColumnConstData<ColumnString>(arguments[col_idx].column.get())
|
||||
: checkAndGetColumn<ColumnString>(arguments[col_idx].column.get());
|
||||
|
||||
if (!column_arg_string && !column_arg_const)
|
||||
if (!column_arg_string)
|
||||
throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Arguments of function {} must be strings", getName());
|
||||
|
||||
for (size_t i = 0; i < input_rows_count; ++i)
|
||||
{
|
||||
rapidjson::Document document(&allocator);
|
||||
parse_json_document(*column_arg, document, i);
|
||||
if (is_const)
|
||||
parse_json_document(*column_arg_string, document, 0);
|
||||
else
|
||||
parse_json_document(*column_arg_string, document, i);
|
||||
merge_objects(merged_jsons[i], document);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user