Skip to content

Commit

Permalink
Replace boost::variant with std::variant in LikeMatcher (hyrise#1562)
Browse files Browse the repository at this point in the history
This pr replaces boost::variant with std::variant in LikeMatcher class.

It is a preparation for a future JIT pr improving the evaluation of like queries.
JIT cannot handle boost::variant code during specialization but it can handle std::variant code.
  • Loading branch information
FabianWiebe authored and mrks committed Mar 28, 2019
1 parent 94a1bc4 commit 38aab7f
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 21 deletions.
1 change: 1 addition & 0 deletions scripts/cpplint.py
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,7 @@
'unordered_set',
'utility',
'valarray',
'variant',
'vector',
# 17.6.1.2 C++ headers for C library facilities
'cassert',
Expand Down
17 changes: 9 additions & 8 deletions src/lib/expression/evaluation/like_matcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,19 +42,20 @@ LikeMatcher::PatternTokens LikeMatcher::pattern_string_to_tokens(const pmr_strin
LikeMatcher::AllPatternVariant LikeMatcher::pattern_string_to_pattern_variant(const pmr_string& pattern) {
const auto tokens = pattern_string_to_tokens(pattern);

if (tokens.size() == 2 && tokens[0].type() == typeid(pmr_string) && tokens[1] == PatternToken{Wildcard::AnyChars}) {
if (tokens.size() == 2 && std::holds_alternative<pmr_string>(tokens[0]) &&
tokens[1] == PatternToken{Wildcard::AnyChars}) {
// Pattern has the form 'hello%'
return StartsWithPattern{boost::get<pmr_string>(tokens[0])};
return StartsWithPattern{std::get<pmr_string>(tokens[0])};

} else if (tokens.size() == 2 && tokens[0] == PatternToken{Wildcard::AnyChars} && // NOLINT
tokens[1].type() == typeid(pmr_string)) {
std::holds_alternative<pmr_string>(tokens[1])) {
// Pattern has the form '%hello'
return EndsWithPattern{boost::get<pmr_string>(tokens[1])};
return EndsWithPattern{std::get<pmr_string>(tokens[1])};

} else if (tokens.size() == 3 && tokens[0] == PatternToken{Wildcard::AnyChars} && // NOLINT
tokens[1].type() == typeid(pmr_string) && tokens[2] == PatternToken{Wildcard::AnyChars}) {
std::holds_alternative<pmr_string>(tokens[1]) && tokens[2] == PatternToken{Wildcard::AnyChars}) {
// Pattern has the form '%hello%'
return ContainsPattern{boost::get<pmr_string>(tokens[1])};
return ContainsPattern{std::get<pmr_string>(tokens[1])};

} else {
/**
Expand All @@ -76,12 +77,12 @@ LikeMatcher::AllPatternVariant LikeMatcher::pattern_string_to_pattern_variant(co
pattern_is_contains_multiple = false;
break;
}
if (!expect_any_chars && token.type() != typeid(pmr_string)) {
if (!expect_any_chars && !std::holds_alternative<pmr_string>(token)) {
pattern_is_contains_multiple = false;
break;
}
if (!expect_any_chars) {
strings.emplace_back(boost::get<pmr_string>(token));
strings.emplace_back(std::get<pmr_string>(token));
}

expect_any_chars = !expect_any_chars;
Expand Down
26 changes: 13 additions & 13 deletions src/lib/expression/evaluation/like_matcher.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

#include <regex>
#include <string>
#include <variant>
#include <vector>

#include "boost/variant.hpp"
#include "types.hpp"
#include "utils/assert.hpp"

Expand All @@ -29,7 +29,7 @@ class LikeMatcher {
explicit LikeMatcher(const pmr_string& pattern);

enum class Wildcard { SingleChar /* '_' */, AnyChars /* '%' */ };
using PatternToken = boost::variant<pmr_string, Wildcard>; // Keep type order, users rely on which()
using PatternToken = std::variant<pmr_string, Wildcard>; // Keep type order, users rely on which()
using PatternTokens = std::vector<PatternToken>;

/**
Expand Down Expand Up @@ -64,7 +64,7 @@ class LikeMatcher {
* general pattern.
*/
using AllPatternVariant =
boost::variant<std::regex, StartsWithPattern, EndsWithPattern, ContainsPattern, MultipleContainsPattern>;
std::variant<std::regex, StartsWithPattern, EndsWithPattern, ContainsPattern, MultipleContainsPattern>;

static AllPatternVariant pattern_string_to_pattern_variant(const pmr_string& pattern);

Expand All @@ -77,28 +77,28 @@ class LikeMatcher {
*/
template <typename Functor>
void resolve(const bool invert_results, const Functor& functor) const {
if (_pattern_variant.type() == typeid(StartsWithPattern)) {
const auto& prefix = boost::get<StartsWithPattern>(_pattern_variant).string;
if (std::holds_alternative<StartsWithPattern>(_pattern_variant)) {
const auto& prefix = std::get<StartsWithPattern>(_pattern_variant).string;
functor([&](const pmr_string& string) -> bool {
if (string.size() < prefix.size()) return invert_results;
return (string.compare(0, prefix.size(), prefix) == 0) ^ invert_results;
});

} else if (_pattern_variant.type() == typeid(EndsWithPattern)) {
const auto& suffix = boost::get<EndsWithPattern>(_pattern_variant).string;
} else if (std::holds_alternative<EndsWithPattern>(_pattern_variant)) {
const auto& suffix = std::get<EndsWithPattern>(_pattern_variant).string;
functor([&](const pmr_string& string) -> bool {
if (string.size() < suffix.size()) return invert_results;
return (string.compare(string.size() - suffix.size(), suffix.size(), suffix) == 0) ^ invert_results;
});

} else if (_pattern_variant.type() == typeid(ContainsPattern)) {
const auto& contains_str = boost::get<ContainsPattern>(_pattern_variant).string;
} else if (std::holds_alternative<ContainsPattern>(_pattern_variant)) {
const auto& contains_str = std::get<ContainsPattern>(_pattern_variant).string;
functor([&](const pmr_string& string) -> bool {
return (string.find(contains_str) != pmr_string::npos) ^ invert_results;
});

} else if (_pattern_variant.type() == typeid(MultipleContainsPattern)) {
const auto& contains_strs = boost::get<MultipleContainsPattern>(_pattern_variant).strings;
} else if (std::holds_alternative<MultipleContainsPattern>(_pattern_variant)) {
const auto& contains_strs = std::get<MultipleContainsPattern>(_pattern_variant).strings;

functor([&](const pmr_string& string) -> bool {
auto current_position = size_t{0};
Expand All @@ -110,8 +110,8 @@ class LikeMatcher {
return !invert_results;
});

} else if (_pattern_variant.type() == typeid(std::regex)) {
const auto& regex = boost::get<std::regex>(_pattern_variant);
} else if (std::holds_alternative<std::regex>(_pattern_variant)) {
const auto& regex = std::get<std::regex>(_pattern_variant);

functor([&](const pmr_string& string) -> bool { return std::regex_match(string, regex) ^ invert_results; });

Expand Down

0 comments on commit 38aab7f

Please sign in to comment.