From 48e9b3d6681242001feadaecae06ef7f9be99b79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Botond=20D=C3=A9nes?= Date: Thu, 26 Jun 2025 09:02:29 +0300 Subject: [PATCH] tools/scylla-sstable: extract query result printers To cql3/query_result_printer.hh. Allowing for other users, outside of tools. --- cql3/query_result_printer.hh | 20 +++++++++ cql3/result_set.cc | 83 ++++++++++++++++++++++++++++++++++ tools/scylla-sstable.cc | 86 ++---------------------------------- 3 files changed, 106 insertions(+), 83 deletions(-) create mode 100644 cql3/query_result_printer.hh diff --git a/cql3/query_result_printer.hh b/cql3/query_result_printer.hh new file mode 100644 index 0000000000..5164ac09b1 --- /dev/null +++ b/cql3/query_result_printer.hh @@ -0,0 +1,20 @@ +/* + * Copyright 2025-present ScyllaDB + */ + +/* + * SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0 + */ + +#pragma once + +#include + +namespace cql3 { + +class result; + +void print_query_results_text(std::ostream& os, const result& result); +void print_query_results_json(std::ostream& os, const result& result); + +} // namespace cql3 diff --git a/cql3/result_set.cc b/cql3/result_set.cc index 53ff9e9cd0..4dc4f30c93 100644 --- a/cql3/result_set.cc +++ b/cql3/result_set.cc @@ -9,8 +9,10 @@ */ #include +#include "types/json_utils.hh" #include "utils/assert.hh" #include "utils/hashers.hh" +#include "utils/rjson.hh" #include "cql3/result_set.hh" namespace cql3 { @@ -195,4 +197,85 @@ make_empty_metadata() { return empty_metadata_cache; } +void print_query_results_text(std::ostream& os, const cql3::result& result) { + const auto& metadata = result.get_metadata(); + const auto& column_metadata = metadata.get_names(); + + struct column_values { + size_t max_size{0}; + sstring header_format; + sstring row_format; + std::vector values; + + void add(sstring value) { + max_size = std::max(max_size, value.size()); + values.push_back(std::move(value)); + } + }; + + std::vector columns; + columns.resize(column_metadata.size()); + + for (size_t i = 0; i < column_metadata.size(); ++i) { + columns[i].add(column_metadata[i]->name->text()); + } + + for (const auto& row : result.result_set().rows()) { + for (size_t i = 0; i < row.size(); ++i) { + if (row[i]) { + columns[i].add(column_metadata[i]->type->to_string(linearized(managed_bytes_view(*row[i])))); + } else { + columns[i].add(""); + } + } + } + + std::vector separators(columns.size(), sstring()); + for (size_t i = 0; i < columns.size(); ++i) { + auto& col_values = columns[i]; + col_values.header_format = seastar::format(" {{:<{}}} ", col_values.max_size); + col_values.row_format = seastar::format(" {{:>{}}} ", col_values.max_size); + for (size_t c = 0; c < col_values.max_size; ++c) { + separators[i] += "-"; + } + } + + for (size_t r = 0; r < result.result_set().rows().size() + 1; ++r) { + std::vector row; + row.reserve(columns.size()); + for (size_t i = 0; i < columns.size(); ++i) { + const auto& format = r == 0 ? columns[i].header_format : columns[i].row_format; + row.push_back(fmt::format(fmt::runtime(std::string_view(format)), columns[i].values[r])); + } + fmt::print(os, "{}\n", fmt::join(row, "|")); + if (!r) { + fmt::print(os, "-{}-\n", fmt::join(separators, "-+-")); + } + } +} + +void print_query_results_json(std::ostream& os, const cql3::result& result) { + const auto& metadata = result.get_metadata(); + const auto& column_metadata = metadata.get_names(); + + rjson::streaming_writer writer(os); + + writer.StartArray(); + for (const auto& row : result.result_set().rows()) { + writer.StartObject(); + for (size_t i = 0; i < row.size(); ++i) { + writer.Key(column_metadata[i]->name->text()); + if (!row[i] || row[i]->empty()) { + writer.Null(); + continue; + } + const auto value = to_json_string(*column_metadata[i]->type, *row[i]); + const auto type = to_json_type(*column_metadata[i]->type, *row[i]); + writer.RawValue(value, type); + } + writer.EndObject(); + } + writer.EndArray(); +} + } diff --git a/tools/scylla-sstable.cc b/tools/scylla-sstable.cc index 6d59ede241..77eccdbdaf 100644 --- a/tools/scylla-sstable.cc +++ b/tools/scylla-sstable.cc @@ -23,6 +23,7 @@ #include "cql3/statements/raw/parsed_statement.hh" #include "cql3/statements/modification_statement.hh" #include "cql3/statements/select_statement.hh" +#include "cql3/query_result_printer.hh" #include "db/config.hh" #include "db/extensions.hh" #include "db/large_data_handler.hh" @@ -1993,87 +1994,6 @@ void shard_of_operation(schema_ptr schema, reader_permit permit, } } -void print_query_results_text(std::ostream& os, const cql3::result& result) { - const auto& metadata = result.get_metadata(); - const auto& column_metadata = metadata.get_names(); - - struct column_values { - size_t max_size{0}; - sstring header_format; - sstring row_format; - std::vector values; - - void add(sstring value) { - max_size = std::max(max_size, value.size()); - values.push_back(std::move(value)); - } - }; - - std::vector columns; - columns.resize(column_metadata.size()); - - for (size_t i = 0; i < column_metadata.size(); ++i) { - columns[i].add(column_metadata[i]->name->text()); - } - - for (const auto& row : result.result_set().rows()) { - for (size_t i = 0; i < row.size(); ++i) { - if (row[i]) { - columns[i].add(column_metadata[i]->type->to_string(linearized(managed_bytes_view(*row[i])))); - } else { - columns[i].add(""); - } - } - } - - std::vector separators(columns.size(), sstring()); - for (size_t i = 0; i < columns.size(); ++i) { - auto& col_values = columns[i]; - col_values.header_format = seastar::format(" {{:<{}}} ", col_values.max_size); - col_values.row_format = seastar::format(" {{:>{}}} ", col_values.max_size); - for (size_t c = 0; c < col_values.max_size; ++c) { - separators[i] += "-"; - } - } - - for (size_t r = 0; r < result.result_set().rows().size() + 1; ++r) { - std::vector row; - row.reserve(columns.size()); - for (size_t i = 0; i < columns.size(); ++i) { - const auto& format = r == 0 ? columns[i].header_format : columns[i].row_format; - row.push_back(fmt::format(fmt::runtime(std::string_view(format)), columns[i].values[r])); - } - fmt::print(os, "{}\n", fmt::join(row, "|")); - if (!r) { - fmt::print(os, "-{}-\n", fmt::join(separators, "-+-")); - } - } -} - -void print_query_results_json(std::ostream& os, const cql3::result& result) { - const auto& metadata = result.get_metadata(); - const auto& column_metadata = metadata.get_names(); - - rjson::streaming_writer writer(os); - - writer.StartArray(); - for (const auto& row : result.result_set().rows()) { - writer.StartObject(); - for (size_t i = 0; i < row.size(); ++i) { - writer.Key(column_metadata[i]->name->text()); - if (!row[i] || row[i]->empty()) { - writer.Null(); - continue; - } - const auto value = to_json_string(*column_metadata[i]->type, *row[i]); - const auto type = to_json_type(*column_metadata[i]->type, *row[i]); - writer.RawValue(value, type); - } - writer.EndObject(); - } - writer.EndArray(); -} - class query_operation_result_visitor : public cql_transport::messages::result_message::visitor { output_format _output_format; private: @@ -2093,10 +2013,10 @@ public: const auto& result = rows.rs(); switch (_output_format) { case output_format::text: - print_query_results_text(std::cout, result); + cql3::print_query_results_text(std::cout, result); break; case output_format::json: - print_query_results_json(std::cout, result); + cql3::print_query_results_json(std::cout, result); break; } }