26#include <unordered_set>
31 template <
class P,
class Blob = profile_blob<P>>
struct query_root;
32 template <
class P>
struct query_root_builder;
33 template <
class P,
class Blob = profile_blob<P>>
struct query_cursor;
37 template <
class P,
class Blob = profile_blob<P>>
struct query_match {
55 static_assert(std::is_same_v<typename blob_type::policy_type, P>);
62 if (source->virtual_size() > P::group_size)
63 error_detail::raise<std::invalid_argument>(
"query root head exceeds one cascade group");
75 static_assert(P::group_size >= 3);
76 if (!source) error_detail::raise<std::invalid_argument>(
"null query root");
77 std::unordered_set<blob_type const *> seen;
78 for (
auto current = source; current; current = current->target()) {
79 if (!seen.insert(current.get()).second) error_detail::raise<std::invalid_argument>(
"cyclic query chain");
80 auto native = current->native().size(),
borrowed = current->borrowed().size();
81 if (
native > std::numeric_limits<std::uint64_t>::max() -
borrowed ||
83 error_detail::raise<std::invalid_argument>(
"query catalog size mismatch");
84 auto groups = current->virtual_size() / P::group_size +
85 (current->virtual_size() % P::group_size != 0);
86 if (current->group_count() != groups)
87 error_detail::raise<std::invalid_argument>(
"query catalog group count mismatch");
88 auto target = current->target();
89 if (
borrowed != (target ? target->group_count() : 0))
90 error_detail::raise<std::invalid_argument>(
"query chain sample count or target mismatch");
91 if (current->cut_lcps().size() != current->group_count())
92 error_detail::raise<std::invalid_argument>(
"query chain cut LCP count mismatch");
110 auto count =
head_->virtual_size();
111 std::size_t levels = 0;
112 while (count > P::group_size) {
113 count = count / P::group_size + (count % P::group_size != 0);
128 std::uint64_t
step(std::uint64_t quanta) {
129 if (!
head_) error_detail::raise<std::logic_error>(
"query root preparation has no source");
130 if (
finished_) error_detail::raise<std::logic_error>(
"query root preparation is finished");
134 if (!
head_) error_detail::raise<std::logic_error>(
"query root preparation has no source");
135 if (!
done()) error_detail::raise<std::logic_error>(
"query root preparation still has input");
169 if (!
current_) error_detail::raise<std::invalid_argument>(
"query root has no head");
176 std::uint64_t
step(std::uint64_t catalog_budget = 1) {
177 if (
failed_) error_detail::raise<std::logic_error>(
"query cursor has failed");
179 std::uint64_t visited = 0;
181 while (
current_ && visited != catalog_budget) {
184 if (result.borrowed_predecessor) {
185 auto const & next = *result.borrowed_predecessor;
186 if (!target || next.target_ordinal % P::group_size ||
187 next.target_ordinal >= target->virtual_size())
188 error_detail::raise<std::invalid_argument>(
"query descent has no valid target context");
192 if (result.borrowed_predecessor) {
193 auto & next = *result.borrowed_predecessor;
194 group_ = next.target_ordinal / P::group_size;
195 context_ = std::move(next.comparison);
212 if (
failed_) error_detail::raise<std::logic_error>(
"query cursor has failed");
213 if (!
pending_) error_detail::raise<std::logic_error>(
"query cursor has no pending match");
227 template <
class P,
class Blob>
229 requires std::is_same_v<Blob, profile_blob<P>> {
231 while (!builder.
done()) builder.
step(4096);
234 template <
class P,
class Blob>
Outlines exceptional check failures while preserving their types and messages.
Builds fractional-index chains through bounded streaming queues.
Definition active_engine.h:18
Definition profile_blob.h:187
static profile_blob build(std::span< profile_record const > native, std::span< bit_string const > borrowed={})
Definition profile_blob.h:193
std::shared_ptr< blob_type const > pair_type
Definition query.h:164
P policy_type
Definition query.h:162
std::uint64_t step(std::uint64_t catalog_budget=1)
Definition query.h:176
bool failed() const noexcept
Definition query.h:174
bool done() const noexcept
Definition query.h:172
std::uint64_t group_
Definition query.h:222
pair_type current_
Definition query.h:220
query_cursor(query_root< P, Blob > const &root, bit_view query)
Definition query.h:167
match_type take_match()
Definition query.h:211
bool has_match() const noexcept
Definition query.h:173
std::optional< match_type > pending_
Definition query.h:223
bool failed_
Definition query.h:224
Blob blob_type
Definition query.h:163
profile_query_context< P > context_
Definition query.h:221
P policy_type
Definition query.h:38
std::uint64_t ordinal
Definition query.h:42
bit_string value
Definition query.h:43
Blob blob_type
Definition query.h:39
std::shared_ptr< blob_type const > pair_type
Definition query.h:40
pair_type source
Definition query.h:41
std::shared_ptr< blob_type const > pair_type
Definition query.h:106
query_root< P > finish()
Definition query.h:133
query_root_builder & operator=(query_root_builder const &)=delete
bool done() const noexcept
Definition query.h:126
bool finished() const noexcept
Definition query.h:127
std::uint64_t step(std::uint64_t quanta)
Definition query.h:128
std::optional< index_pipeline< P > > pipeline_
Definition query.h:145
query_root_builder(query_root_builder const &)=delete
query_root_builder & operator=(query_root_builder &&)=default
query_root_builder(pair_type source)
Definition query.h:108
bool finished_
Definition query.h:146
pair_type head_
Definition query.h:144
P policy_type
Definition query.h:104
query_root_builder(query_root_builder &&)=default
query_root(pair_type head)
Definition query.h:71
P policy_type
Definition query.h:52
static void validate(pair_type const &source)
Definition query.h:74
query_cursor< P, Blob > cursor(bit_view query) const
Definition query.h:235
Blob blob_type
Definition query.h:53
std::shared_ptr< blob_type const > pair_type
Definition query.h:54
static query_root build(pair_type source)
Definition query.h:228
pair_type head_
Definition query.h:72
pair_type head() const noexcept
Definition query.h:66
static query_root adopt_prepared(pair_type source)
Definition query.h:60