From f71888703168da27a7c168ad0db4430d983814c8 Mon Sep 17 00:00:00 2001 From: Harpreet Sangar Date: Fri, 10 Mar 2023 18:14:44 +0530 Subject: [PATCH] Refactor `and_filter_result`. --- include/field.h | 61 ++-------------------------------------------- src/field.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ src/index.cpp | 1 - 3 files changed, 67 insertions(+), 60 deletions(-) diff --git a/include/field.h b/include/field.h index 87a17702..b7865a29 100644 --- a/include/field.h +++ b/include/field.h @@ -661,66 +661,9 @@ struct filter_result_t { } } - static void and_filter_results(const filter_result_t& a, const filter_result_t& b, filter_result_t& result) { - auto lenA = a.count, lenB = b.count; - if (lenA == 0 || lenB == 0) { - return; - } + static void and_filter_results(const filter_result_t& a, const filter_result_t& b, filter_result_t& result); - result.docs = new uint32_t[std::min(lenA, lenB)]; - - auto A = a.docs, B = b.docs, out = result.docs; - const uint32_t *endA = A + lenA; - const uint32_t *endB = B + lenB; - - for (auto const& item: a.reference_filter_results) { - if (result.reference_filter_results.count(item.first) == 0) { - result.reference_filter_results[item.first] = new reference_filter_result_t[std::min(lenA, lenB)]; - } - } - for (auto const& item: b.reference_filter_results) { - if (result.reference_filter_results.count(item.first) == 0) { - result.reference_filter_results[item.first] = new reference_filter_result_t[std::min(lenA, lenB)]; - } - } - - while (true) { - while (*A < *B) { - SKIP_FIRST_COMPARE: - if (++A == endA) { - result.count = out - result.docs; - return; - } - } - while (*A > *B) { - if (++B == endB) { - result.count = out - result.docs; - return; - } - } - if (*A == *B) { - *out = *A; - - for (auto const& item: a.reference_filter_results) { - result.reference_filter_results[item.first][out - result.docs] = item.second[A - a.docs]; - item.second[A - a.docs].docs = nullptr; - } - for (auto const& item: b.reference_filter_results) { - result.reference_filter_results[item.first][out - result.docs] = item.second[B - b.docs]; - item.second[B - b.docs].docs = nullptr; - } - - out++; - - if (++A == endA || ++B == endB) { - result.count = out - result.docs; - return; - } - } else { - goto SKIP_FIRST_COMPARE; - } - } - } + static void or_filter_results(const filter_result_t& a, const filter_result_t& b, filter_result_t& result); }; namespace sort_field_const { diff --git a/src/field.cpp b/src/field.cpp index c7297359..9b20aeef 100644 --- a/src/field.cpp +++ b/src/field.cpp @@ -983,3 +983,68 @@ void field::compact_nested_fields(tsl::htrie_map& nested_fields) { nested_fields.erase_prefix(field_name + "."); } } + +void filter_result_t::and_filter_results(const filter_result_t& a, const filter_result_t& b, filter_result_t& result) { + auto lenA = a.count, lenB = b.count; + if (lenA == 0 || lenB == 0) { + return; + } + + result.docs = new uint32_t[std::min(lenA, lenB)]; + + auto A = a.docs, B = b.docs, out = result.docs; + const uint32_t *endA = A + lenA; + const uint32_t *endB = B + lenB; + + for (auto const& item: a.reference_filter_results) { + if (result.reference_filter_results.count(item.first) == 0) { + result.reference_filter_results[item.first] = new reference_filter_result_t[std::min(lenA, lenB)]; + } + } + for (auto const& item: b.reference_filter_results) { + if (result.reference_filter_results.count(item.first) == 0) { + result.reference_filter_results[item.first] = new reference_filter_result_t[std::min(lenA, lenB)]; + } + } + + while (true) { + while (*A < *B) { + SKIP_FIRST_COMPARE: + if (++A == endA) { + result.count = out - result.docs; + return; + } + } + while (*A > *B) { + if (++B == endB) { + result.count = out - result.docs; + return; + } + } + if (*A == *B) { + *out = *A; + + for (auto const& item: a.reference_filter_results) { + auto& reference = result.reference_filter_results[item.first][out - result.docs]; + reference.count = item.second[A - a.docs].count; + reference.docs = new uint32_t[reference.count]; + memcpy(reference.docs, item.second[A - a.docs].docs, reference.count * sizeof(uint32_t)); + } + for (auto const& item: b.reference_filter_results) { + auto& reference = result.reference_filter_results[item.first][out - result.docs]; + reference.count = item.second[B - b.docs].count; + reference.docs = new uint32_t[reference.count]; + memcpy(reference.docs, item.second[B - b.docs].docs, reference.count * sizeof(uint32_t)); + } + + out++; + + if (++A == endA || ++B == endB) { + result.count = out - result.docs; + return; + } + } else { + goto SKIP_FIRST_COMPARE; + } + } +} diff --git a/src/index.cpp b/src/index.cpp index 0e09cc8b..c81e4881 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -2158,7 +2158,6 @@ Option Index::recursive_filter(filter_node_t* const root, } } - return Option(true); }