From 1ed4e1b84745f4c14f71d6394c1bccc0d7a26af7 Mon Sep 17 00:00:00 2001 From: Nikolai Kochetov Date: Fri, 30 Aug 2024 16:52:42 +0000 Subject: [PATCH] Serialization of sort description. --- src/Core/SortDescription.cpp | 59 ++++++++++++++++++++++++++++++++++++ src/Core/SortDescription.h | 7 +++++ 2 files changed, 66 insertions(+) diff --git a/src/Core/SortDescription.cpp b/src/Core/SortDescription.cpp index 1b3f81f8547..01f22b9b9e5 100644 --- a/src/Core/SortDescription.cpp +++ b/src/Core/SortDescription.cpp @@ -15,6 +15,11 @@ namespace DB { +namespace ErrorCodes +{ + extern const int NOT_IMPLEMENTED; +} + void dumpSortDescription(const SortDescription & description, WriteBuffer & out) { bool first = true; @@ -209,4 +214,58 @@ JSONBuilder::ItemPtr explainSortDescription(const SortDescription & description) return json_array; } +void serializeSortDescription(const SortDescription & sort_description, WriteBuffer & out) +{ + writeVarUInt(sort_description.size(), out); + for (const auto & desc : sort_description) + { + writeStringBinary(desc.column_name, out); + + UInt8 flags = 0; + if (desc.direction > 0) + flags |= 1; + if (desc.nulls_direction > 0) + flags |= 2; + if (desc.collator) + flags |= 4; + if (desc.with_fill) + flags |= 8; + + writeIntBinary(flags, out); + + if (desc.collator) + writeStringBinary(desc.collator->getLocale(), out); + + if (desc.with_fill) + throw Exception(ErrorCodes::NOT_IMPLEMENTED, "WITH FILL is not supported in serialized sort description"); + } +} + +void deserializeSortDescription(SortDescription & sort_description, ReadBuffer & in) +{ + size_t size = 0; + readVarUInt(size, in); + sort_description.resize(size); + for (auto & desc : sort_description) + { + readStringBinary(desc.column_name, in); + UInt8 flags = 0; + readIntBinary(flags, in); + + desc.direction = (flags & 1) ? 1 : -1; + desc.nulls_direction = (flags & 2) ? 1 : -1; + + if (flags & 4) + { + String collator_locale; + readStringBinary(collator_locale, in); + if (!collator_locale.empty()) + desc.collator = std::make_shared(collator_locale); + } + + if (flags & 8) + throw Exception(ErrorCodes::NOT_IMPLEMENTED, "WITH FILL is not supported in deserialized sort description"); + } +} + } diff --git a/src/Core/SortDescription.h b/src/Core/SortDescription.h index 5c6f3e3150a..a87872193eb 100644 --- a/src/Core/SortDescription.h +++ b/src/Core/SortDescription.h @@ -140,4 +140,11 @@ void dumpSortDescription(const SortDescription & description, WriteBuffer & out) std::string dumpSortDescription(const SortDescription & description); JSONBuilder::ItemPtr explainSortDescription(const SortDescription & description); + +class WriteBuffer; +class ReadBuffer; + +void serializeSortDescription(const SortDescription & sort_description, WriteBuffer & out); +void deserializeSortDescription(SortDescription & sort_description, ReadBuffer & in); + }