28 namespace seqan3::detail
34 class search_configurator
43 template <
typename search_configuration_t,
typename index_t,
typename query_index_t>
44 struct select_search_result
48 using index_cursor_type =
typename index_t::cursor_type;
50 using index_size_type =
typename index_t::size_type;
52 using traits_type = search_traits<search_configuration_t>;
61 using reference_begin_position_t =
std::conditional_t<traits_type::output_reference_begin_position,
67 using type = search_result<query_id_t, index_cursor_t, reference_id_t, reference_begin_position_t>;
76 template <
typename configuration_t,
typename index_t,
typename ...policies_t>
77 struct select_search_algorithm
81 lazy_conditional_t<template_specialisation_of<typename index_t::cursor_type, bi_fm_index_cursor>,
82 lazy<search_scheme_algorithm, configuration_t, index_t, policies_t...>,
83 lazy<unidirectional_search_algorithm, configuration_t, index_t, policies_t...>>;
97 template <
typename configuration_t>
98 static auto add_default_hit_configuration(configuration_t
const & cfg)
100 if constexpr (!detail::search_traits<configuration_t>::has_hit_configuration)
101 return cfg | search_cfg::hit_all{};
115 template <
typename configuration_t>
116 static auto add_default_output_configuration(configuration_t
const & cfg)
118 if constexpr (!seqan3::detail::search_traits<configuration_t>::has_output_configuration)
120 search_cfg::output_query_id{} |
121 search_cfg::output_reference_id{} |
122 search_cfg::output_reference_begin_position{};
139 template <
typename configuration_t>
140 static auto add_defaults(configuration_t
const & cfg)
142 static_assert(detail::is_type_specialisation_of_v<configuration_t, configuration>,
143 "cfg must be a specialisation of seqan3::configuration.");
145 auto cfg1 = add_default_hit_configuration(cfg);
146 auto cfg2 = add_default_output_configuration(cfg1);
166 template <
typename query_t,
typename configuration_t,
typename index_t>
167 static auto configure_algorithm(configuration_t
const & cfg, index_t
const & index)
169 using query_index_t = std::tuple_element_t<0, query_t>;
170 using search_result_t =
typename select_search_result<configuration_t, index_t, query_index_t>::type;
172 using type_erased_algorithm_t =
std::function<void(query_t, callback_t)>;
174 auto complete_config = cfg | search_cfg::detail::result_type<search_result_t>{};
175 return std::pair{configure_hit_strategy<type_erased_algorithm_t>(complete_config, index), complete_config};
178 template <
typename algorithm_t,
typename configuration_t,
typename index_t>
179 static algorithm_t configure_hit_strategy(configuration_t
const &, index_t
const &);
195 template <
typename algorithm_t,
typename configuration_t,
typename index_t>
196 static algorithm_t select_and_return_algorithm(configuration_t
const & config, index_t
const & index)
198 using selected_algorithm_t =
199 typename select_search_algorithm<configuration_t,
202 policy_search_result_builder<configuration_t>>::type;
204 return selected_algorithm_t{config, index};
228 template <
typename algorithm_t,
typename configuration_t,
typename index_t>
229 algorithm_t search_configurator::configure_hit_strategy(configuration_t
const & cfg, index_t
const & index)
232 auto next_config_step = [&] (
auto new_cfg) -> algorithm_t
234 return select_and_return_algorithm<algorithm_t>(new_cfg, index);
238 if constexpr (configuration_t::template exists<search_cfg::hit>())
240 auto hit_variant = get<search_cfg::hit>(cfg).hit_variant;
242 if (std::holds_alternative<empty_type>(hit_variant))
244 "Please refer to the configuration documentation of the search algorithm for "
248 auto cfg_without_hit = cfg.template remove<search_cfg::hit>();
253 [&] (search_cfg::hit_all_best) {
return next_config_step(cfg_without_hit | search_cfg::hit_all_best{}); },
254 [&] (search_cfg::hit_single_best) {
return next_config_step(cfg_without_hit | search_cfg::hit_single_best{}); },
255 [&] (search_cfg::hit_strata
const & strata) {
return next_config_step(cfg_without_hit | strata); },
256 [&] (
auto) {
return next_config_step(cfg_without_hit | search_cfg::hit_all{}); }
261 static_assert(detail::search_traits<configuration_t>::has_hit_configuration,
262 "The hit strategy for the search algorithm was not configured. "
263 "Please refer to the configuration documentation of the search algorithm for more details.");
265 return next_config_step(cfg);
Provides type traits for working with templates.
Provides the configuration to define the hit strategies "hit_strata", "hit_all", "hit_all_best",...
Provides lazy template instantiation traits.
Provides the configuration for maximum number of errors for all error types.
Provides a type that combines multiple invocables.
Provides the seqan3::detail::policy_max_error.
Provides the seqan3::detail::policy_search_result_builder.
Provides seqan3::search_cfg::detail::result_type.
Provides the configuration for the content of the search result.
Provides seqan3::search_result.
Provides the algorithm to search in an index using search schemes.
Provides an approximate string matching algorithm based on simple backtracking. This should only be u...