From ad41f2d5a8450ab7d36e251320781a0470b2ef2b Mon Sep 17 00:00:00 2001 From: Harpreet Sangar Date: Tue, 28 Mar 2023 10:00:47 +0530 Subject: [PATCH] Add `filter_result_iterator_t::contains_atleast_one`. --- src/filter.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/filter.cpp b/src/filter.cpp index c152d77f..13069fb7 100644 --- a/src/filter.cpp +++ b/src/filter.cpp @@ -755,3 +755,45 @@ Option filter::parse_filter_query(const std::string& filter_query, return Option(true); } + +bool filter_result_iterator_t::contains_atleast_one(const void *obj) { + if(IS_COMPACT_POSTING(obj)) { + compact_posting_list_t* list = COMPACT_POSTING_PTR(obj); + + size_t i = 0; + while(i < list->length && valid()) { + size_t num_existing_offsets = list->id_offsets[i]; + size_t existing_id = list->id_offsets[i + num_existing_offsets + 1]; + + if (existing_id == seq_id) { + return true; + } + + // advance smallest value + if (existing_id < seq_id) { + i += num_existing_offsets + 2; + } else { + skip_to(existing_id); + } + } + } else { + auto list = (posting_list_t*)(obj); + posting_list_t::iterator_t it = list->new_iterator(); + + while(it.valid() && valid()) { + uint32_t id = it.id(); + + if(id == seq_id) { + return true; + } + + if(id < seq_id) { + it.skip_to(seq_id); + } else { + skip_to(id); + } + } + } + + return false; +}