HappenLee commented on code in PR #32333: URL: https://github.com/apache/doris/pull/32333#discussion_r1528042121
########## be/src/vec/functions/like.cpp: ########## @@ -60,6 +60,129 @@ static const re2::RE2 LIKE_STARTS_WITH_RE(R"((((\\%)|(\\_)|([^%_\\]))+)(?:%+))") static const re2::RE2 LIKE_EQUALS_RE("(((\\\\_)|([^%_]))+)"); static const re2::RE2 LIKE_ALLPASS_RE("%+"); +struct VectorAllpassSearchState : public VectorPatternSearchState { + VectorAllpassSearchState() : VectorPatternSearchState(FunctionLikeBase::vector_allpass_fn) {} + + ~VectorAllpassSearchState() override = default; + + void like_pattern_match(const std::string& pattern_str) override { + if (!pattern_str.empty() && RE2::FullMatch(pattern_str, LIKE_ALLPASS_RE)) { + _search_strings->insert_default(); + } else { + _pattern_matched = false; + } + } + + void regexp_pattern_match(const std::string& pattern_str) override { + if (RE2::FullMatch(pattern_str, ALLPASS_RE)) { + _search_strings->insert_default(); + } else { + _pattern_matched = false; + } + } +}; + +struct VectorEqualSearchState : public VectorPatternSearchState { + VectorEqualSearchState() : VectorPatternSearchState(FunctionLikeBase::vector_equals_fn) {} + + ~VectorEqualSearchState() override = default; + + void like_pattern_match(const std::string& pattern_str) override { + std::string search_string; + if (pattern_str.empty() || RE2::FullMatch(pattern_str, LIKE_EQUALS_RE, &search_string)) { + FunctionLike::remove_escape_character(&search_string); + _search_strings->insert_data(search_string.c_str(), search_string.size()); + } else { + _pattern_matched = false; + } + } + + void regexp_pattern_match(const std::string& pattern_str) override { + std::string search_string; + if (RE2::FullMatch(pattern_str, EQUALS_RE, &search_string)) { + _search_strings->insert_data(search_string.c_str(), search_string.size()); + } else { + _pattern_matched = false; + } + } +}; + +struct VectorSubStringSearchState : public VectorPatternSearchState { + VectorSubStringSearchState() + : VectorPatternSearchState(FunctionLikeBase::vector_substring_fn) {} + + ~VectorSubStringSearchState() override = default; + + void like_pattern_match(const std::string& pattern_str) override { + std::string search_string; + if (RE2::FullMatch(pattern_str, LIKE_SUBSTRING_RE, &search_string)) { + FunctionLike::remove_escape_character(&search_string); + _search_strings->insert_data(search_string.c_str(), search_string.size()); + } else { + _pattern_matched = false; + } + } + + void regexp_pattern_match(const std::string& pattern_str) override { + std::string search_string; + if (RE2::FullMatch(pattern_str, SUBSTRING_RE, &search_string)) { + _search_strings->insert_data(search_string.c_str(), search_string.size()); + } else { + _pattern_matched = false; + } + } +}; + +struct VectorStartsWithSearchState : public VectorPatternSearchState { + VectorStartsWithSearchState() + : VectorPatternSearchState(FunctionLikeBase::vector_starts_with_fn) {} + ~VectorStartsWithSearchState() override = default; + + void like_pattern_match(const std::string& pattern_str) override { + std::string search_string; + if (RE2::FullMatch(pattern_str, LIKE_STARTS_WITH_RE, &search_string)) { + FunctionLike::remove_escape_character(&search_string); + _search_strings->insert_data(search_string.c_str(), search_string.size()); + } else { + _pattern_matched = false; + } + } + + void regexp_pattern_match(const std::string& pattern_str) override { + std::string search_string; + if (RE2::FullMatch(pattern_str, STARTS_WITH_RE, &search_string)) { + _search_strings->insert_data(search_string.c_str(), search_string.size()); + } else { + _pattern_matched = false; + } + } +}; + +struct VectorEndsWithSearchState : public VectorPatternSearchState { + VectorEndsWithSearchState() : VectorPatternSearchState(FunctionLikeBase::vector_ends_with_fn) {} + + ~VectorEndsWithSearchState() override = default; + + void like_pattern_match(const std::string& pattern_str) override { + std::string search_string; Review Comment: reuse the string val -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org