22 namespace seqan3::detail
46 template <
typename index_t,
typename query_t,
typename configuration_t>
47 inline auto search_single(index_t
const & index, query_t & query, configuration_t
const & cfg)
49 using search_traits_t = search_traits<configuration_t>;
52 detail::search_param max_error{0, 0, 0, 0};
53 if constexpr (search_traits_t::search_with_max_error)
55 auto & [total, subs, ins, del] = max_error;
57 get<search_cfg::max_error>(cfg).value);
59 else if constexpr (search_traits_t::search_with_max_error_rate)
63 auto & [total, subs, ins, del] = max_error;
67 }, get<search_cfg::max_error_rate>(cfg).value);
77 auto internal_delegate = [&internal_hits, &max_error] (
auto const & it)
83 if constexpr (search_traits_t::search_best_hits)
85 detail::search_param max_error2{max_error};
87 while (internal_hits.
empty() && max_error2.total <= max_error.total)
89 detail::search_algo<true>(index, query, max_error2, internal_delegate);
93 else if constexpr (search_traits_t::search_all_best_hits)
95 detail::search_param max_error2{max_error};
97 while (internal_hits.
empty() && max_error2.total <= max_error.total)
99 detail::search_algo<false>(index, query, max_error2, internal_delegate);
103 else if constexpr (search_traits_t::search_strata_hits)
105 detail::search_param max_error2{max_error};
106 max_error2.total = 0;
107 while (internal_hits.
empty() && max_error2.total <= max_error.total)
109 detail::search_algo<true>(index, query, max_error2, internal_delegate);
112 if (!internal_hits.
empty())
114 internal_hits.
clear();
115 uint8_t
const s = get<search_cfg::mode>(cfg).value;
116 max_error2.total += s - 1;
117 detail::search_algo<false>(index, query, max_error2, internal_delegate);
122 detail::search_algo<false>(index, query, max_error, internal_delegate);
128 if constexpr (search_traits_t::search_return_index_cursor)
130 return internal_hits;
136 typename index_t::size_type>;
139 if constexpr (search_traits_t::search_best_hits)
142 if (!internal_hits.
empty())
144 auto text_pos = internal_hits[0].lazy_locate();
150 for (
auto const & cur : internal_hits)
152 for (
auto const & text_pos : cur.locate())
180 template <
typename index_t,
typename queries_t,
typename configuration_t>
181 inline auto search_all(index_t
const & index, queries_t && queries, configuration_t
const & cfg)
183 using cfg_t = remove_cvref_t<configuration_t>;
190 typename index_t::size_type>;
192 typename index_t::cursor_type,
195 if constexpr (std::ranges::forward_range<queries_t> && std::ranges::random_access_range<value_type_t<queries_t>>)
200 for (
auto const query : queries)
202 hits.
push_back(search_single(index, query, cfg));
209 return search_single(index, queries, cfg);