From 757419b524152f9f15eb3d4b1ee248e7f5146ac3 Mon Sep 17 00:00:00 2001 From: Piotr Sarna Date: Wed, 6 Mar 2019 10:23:36 +0100 Subject: [PATCH] index: add serialization function for index targets Since target_parser is responsible for deserializing target strings, the function that serializes them belongs in the same class. --- index/secondary_index.cc | 42 ++++++++++++++++++++++++++++++++++++++++ index/target_parser.hh | 2 ++ 2 files changed, 44 insertions(+) diff --git a/index/secondary_index.cc b/index/secondary_index.cc index 22a1545532..b846702606 100644 --- a/index/secondary_index.cc +++ b/index/secondary_index.cc @@ -41,9 +41,12 @@ #include "secondary_index.hh" #include "index/target_parser.hh" +#include "cql3/statements/index_target.hh" #include #include +#include +#include #include "json.hh" @@ -139,4 +142,43 @@ sstring target_parser::get_target_column_name_from_string(const sstring& targets return targets; } +sstring target_parser::serialize_targets(const std::vector<::shared_ptr>& targets) { + using cql3::statements::index_target; + + struct as_json_visitor { + Json::Value operator()(const index_target::multiple_columns& columns) const { + Json::Value json_array(Json::arrayValue); + for (const auto& column : columns) { + json_array.append(Json::Value(column->to_string())); + } + return json_array; + } + + Json::Value operator()(const index_target::single_column& column) const { + return Json::Value(column->to_string()); + } + }; + + if (targets.size() == 1 && std::holds_alternative(targets.front()->value)) { + return std::get(targets.front()->value)->to_string(); + } + + Json::Value json_map(Json::objectValue); + Json::Value pk_json = std::visit(as_json_visitor(), targets.front()->value); + if (!pk_json.isArray()) { + Json::Value pk_array(Json::arrayValue); + pk_array.append(std::move(pk_json)); + pk_json = std::move(pk_array); + } + json_map[PK_TARGET_KEY] = std::move(pk_json); + if (targets.size() > 1) { + Json::Value ck_json(Json::arrayValue); + for (unsigned i = 1; i < targets.size(); ++i) { + ck_json.append(std::visit(as_json_visitor(), targets.at(i)->value)); + } + json_map[CK_TARGET_KEY] = ck_json; + } + return json::to_sstring(json_map); +} + } diff --git a/index/target_parser.hh b/index/target_parser.hh index 97e2fb176d..9ac2fcb0c8 100644 --- a/index/target_parser.hh +++ b/index/target_parser.hh @@ -61,6 +61,8 @@ struct target_parser { static bool is_local(sstring target_string); static sstring get_target_column_name_from_string(const sstring& targets); + + static sstring serialize_targets(const std::vector<::shared_ptr>& targets); }; }