diff --git a/components/core/src/Grep.cpp b/components/core/src/Grep.cpp index b786796c9..d50a9c23c 100644 --- a/components/core/src/Grep.cpp +++ b/components/core/src/Grep.cpp @@ -487,17 +487,17 @@ SubQueryMatchabilityResult generate_logtypes_and_vars_for_subquery( return SubQueryMatchabilityResult::MayMatch; } -bool Grep::process_raw_query( +std::optional Grep::process_raw_query( Archive const& archive, string const& search_string, epochtime_t search_begin_ts, epochtime_t search_end_ts, bool ignore_case, - Query& query, log_surgeon::lexers::ByteLexer& forward_lexer, log_surgeon::lexers::ByteLexer& reverse_lexer, bool use_heuristic ) { + Query query; // Set properties which require no processing query.set_search_begin_timestamp(search_begin_ts); query.set_search_end_timestamp(search_end_ts); @@ -558,11 +558,11 @@ bool Grep::process_raw_query( // - (token1 as logtype) (token2 as var) // - (token1 as var) (token2 as logtype) // - (token1 as var) (token2 as var) - SubQuery sub_query; + std::vector sub_queries; string logtype; bool type_of_one_token_changed = true; while (type_of_one_token_changed) { - sub_query.clear(); + SubQuery sub_query; // Compute logtypes and variables for query auto matchability = generate_logtypes_and_vars_for_subquery( @@ -579,9 +579,9 @@ bool Grep::process_raw_query( // Since other sub-queries will be superceded by this one, we can stop processing // now - return true; + return query; case SubQueryMatchabilityResult::MayMatch: - query.add_sub_query(sub_query); + sub_queries.push_back(std::move(sub_query)); break; case SubQueryMatchabilityResult::WontMatch: default: @@ -599,7 +599,12 @@ bool Grep::process_raw_query( } } - return query.contains_sub_queries(); + if (sub_queries.empty()) { + return std::nullopt; + } + + query.add_sub_queries(sub_queries); + return query; } bool Grep::get_bounds_of_next_potential_var( diff --git a/components/core/src/Grep.hpp b/components/core/src/Grep.hpp index ea032623f..000c2e621 100644 --- a/components/core/src/Grep.hpp +++ b/components/core/src/Grep.hpp @@ -41,13 +41,12 @@ class Grep { * @param use_heuristic * @return true if query may match messages, false otherwise */ - static bool process_raw_query( + static std::optional process_raw_query( streaming_archive::reader::Archive const& archive, std::string const& search_string, epochtime_t search_begin_ts, epochtime_t search_end_ts, bool ignore_case, - Query& query, log_surgeon::lexers::ByteLexer& forward_lexer, log_surgeon::lexers::ByteLexer& reverse_lexer, bool use_heuristic diff --git a/components/core/src/Query.cpp b/components/core/src/Query.cpp index 12faded99..18c773ba9 100644 --- a/components/core/src/Query.cpp +++ b/components/core/src/Query.cpp @@ -176,12 +176,14 @@ void Query::set_search_string(string const& search_string) { m_search_string_matches_all = (m_search_string.empty() || "*" == m_search_string); } -void Query::add_sub_query(SubQuery const& sub_query) { - m_sub_queries.push_back(sub_query); +void Query::add_sub_queries(std::vector& sub_queries) { + m_sub_queries = std::move(sub_queries); - // Add to relevant sub-queries if necessary - if (sub_query.get_ids_of_matching_segments().count(m_prev_segment_id)) { - m_relevant_sub_queries.push_back(&m_sub_queries.back()); + for (auto& sub_query : m_sub_queries) { + // Add to relevant sub-queries if necessary + if (sub_query.get_ids_of_matching_segments().count(m_prev_segment_id)) { + m_relevant_sub_queries.push_back(&m_sub_queries.back()); + } } } diff --git a/components/core/src/Query.hpp b/components/core/src/Query.hpp index 398ad3f53..6d59ec6c6 100644 --- a/components/core/src/Query.hpp +++ b/components/core/src/Query.hpp @@ -172,7 +172,7 @@ class Query { void set_ignore_case(bool ignore_case) { m_ignore_case = ignore_case; } void set_search_string(std::string const& search_string); - void add_sub_query(SubQuery const& sub_query); + void add_sub_queries(std::vector& sub_query); void clear_sub_queries(); /** * Populates the set of relevant sub-queries with only those that match the given segment diff --git a/components/core/src/clg/clg.cpp b/components/core/src/clg/clg.cpp index e53ead9a3..afe6e2874 100644 --- a/components/core/src/clg/clg.cpp +++ b/components/core/src/clg/clg.cpp @@ -206,19 +206,18 @@ static bool search( std::set ids_of_segments_to_search; bool is_superseding_query = false; for (auto const& search_string : search_strings) { - Query query; - if (Grep::process_raw_query( - archive, - search_string, - search_begin_ts, - search_end_ts, - command_line_args.ignore_case(), - query, - forward_lexer, - reverse_lexer, - use_heuristic - )) - { + std::optional query_result = Grep::process_raw_query( + archive, + search_string, + search_begin_ts, + search_end_ts, + command_line_args.ignore_case(), + forward_lexer, + reverse_lexer, + use_heuristic + ); + if (query_result) { + Query& query = query_result.value(); no_queries_match = false; if (query.contains_sub_queries() == false) { diff --git a/components/core/src/clo/clo.cpp b/components/core/src/clo/clo.cpp index 02dd1c2b1..2a31b2257 100644 --- a/components/core/src/clo/clo.cpp +++ b/components/core/src/clo/clo.cpp @@ -260,23 +260,21 @@ static bool search_archive( auto search_begin_ts = command_line_args.get_search_begin_ts(); auto search_end_ts = command_line_args.get_search_end_ts(); - Query query; - if (false - == Grep::process_raw_query( - archive_reader, - command_line_args.get_search_string(), - search_begin_ts, - search_end_ts, - command_line_args.ignore_case(), - query, - *forward_lexer, - *reverse_lexer, - use_heuristic - )) - { + std::optional query_result = Grep::process_raw_query( + archive_reader, + command_line_args.get_search_string(), + search_begin_ts, + search_end_ts, + command_line_args.ignore_case(), + *forward_lexer, + *reverse_lexer, + use_heuristic + ); + if (query_result) { return true; } + Query& query = query_result.value(); // Get all segments potentially containing query results std::set ids_of_segments_to_search; for (auto& sub_query : query.get_sub_queries()) {