diff options
author | Tor Egge <Tor.Egge@online.no> | 2023-03-21 21:23:29 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2023-03-21 21:23:29 +0100 |
commit | a74fc174fd55f39aaaf4fbe1d68ce5a2e7719999 (patch) | |
tree | 43dca1c0328119b4bf7e559ebc37aae4ff20f052 /searchlib/src/vespa | |
parent | 4100c3f0f060f91e8fc595e8f1c47520aa807ec9 (diff) |
Adjust serialized sort data for raw attributes.
Diffstat (limited to 'searchlib/src/vespa')
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/raw_attribute.cpp | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/raw_attribute.cpp b/searchlib/src/vespa/searchlib/attribute/raw_attribute.cpp index 65841f59827..f8c6768ba5b 100644 --- a/searchlib/src/vespa/searchlib/attribute/raw_attribute.cpp +++ b/searchlib/src/vespa/searchlib/attribute/raw_attribute.cpp @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "raw_attribute.h" +#include <cassert> namespace search::attribute { @@ -11,32 +12,58 @@ RawAttribute::RawAttribute(const vespalib::string& name, const Config& config) RawAttribute::~RawAttribute() = default; -long -RawAttribute::onSerializeForAscendingSort(DocId doc, void* serTo, long available, const common::BlobConverter*) const +namespace { + +template <bool desc> +unsigned char remap(unsigned char val) { - auto raw = get_raw(doc); - if (available >= (long)raw.size()) { - memcpy(serTo, raw.data(), raw.size()); + return (desc ? (0xff - val) : val); +} + +template <bool desc> +long serialize_for_sort(vespalib::ConstArrayRef<char> raw, void* serTo, long available) +{ + auto src = reinterpret_cast<const unsigned char *>(raw.data()); + auto src_end = src + raw.size(); + size_t extra = 1; + for (auto p = src; p != src_end; ++p) { + if (*p >= 0xfe) { + ++extra; + } + } + if (available >= (long)(raw.size() + extra)) { + auto dst = static_cast<unsigned char *>(serTo); + auto dst_orig = dst; + for (auto p = src; p != src_end; ++p) { + if (*p >= 0xfe) { + *dst++ = remap<desc>(0xff); + *dst++ = remap<desc>(*p); + } else { + *dst++ = remap<desc>(*p + 1); + } + } + *dst++ = remap<desc>(0); + assert(raw.size() + extra + dst_orig == dst); } else { return -1; } - return raw.size(); + return raw.size() + extra; +} + +} + +long +RawAttribute::onSerializeForAscendingSort(DocId doc, void* serTo, long available, const common::BlobConverter*) const +{ + auto raw = get_raw(doc); + return serialize_for_sort<false>(raw, serTo, available); } long RawAttribute::onSerializeForDescendingSort(DocId doc, void* serTo, long available, const common::BlobConverter*) const { auto raw = get_raw(doc); - if (available >= (long)raw.size()) { - auto *dst = static_cast<unsigned char *>(serTo); - const auto * src(reinterpret_cast<const uint8_t *>(raw.data())); - for (size_t i(0); i < raw.size(); ++i) { - dst[i] = 0xff - src[i]; - } - } else { - return -1; - } - return raw.size(); + return serialize_for_sort<true>(raw, serTo, available); } } |