Even better

This commit is contained in:
Nikolay Degterinsky 2023-12-04 18:42:25 +01:00 committed by GitHub
parent 947106972d
commit 265e2b30a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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);
}
}