Refactor and_filter_result.

This commit is contained in:
Harpreet Sangar 2023-03-10 18:14:44 +05:30
parent 3be000609a
commit f718887031
3 changed files with 67 additions and 60 deletions

View File

@ -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 {

View File

@ -983,3 +983,68 @@ void field::compact_nested_fields(tsl::htrie_map<char, field>& 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;
}
}
}

View File

@ -2158,7 +2158,6 @@ Option<bool> Index::recursive_filter(filter_node_t* const root,
}
}
return Option(true);
}