wjones127 commented on a change in pull request #8844:
URL: https://github.com/apache/arrow/pull/8844#discussion_r606018159



##########
File path: cpp/src/gandiva/like_holder.cc
##########
@@ -62,39 +56,95 @@ const FunctionNode LikeHolder::TryOptimize(const 
FunctionNode& node) {
   return node;
 }
 
+const FunctionNode SQLLikeHolder::TryOptimize(const FunctionNode& node) {
+  Result<std::string> pattern_result = GetPattern(node);
+  if (!pattern_result.ok()) {
+    return node;
+  }
+  std::string sql_pattern = pattern_result.ValueOrDie();
+
+  std::string pcre_pattern;
+  auto conversion_status = RegexUtil::SqlLikePatternToPcre(sql_pattern, 
pcre_pattern);
+  if (!conversion_status.ok()) {
+    return node;
+  }
+
+  auto literal_type = node.children().at(1)->return_type();
+  auto pcre_node =
+    std::make_shared<LiteralNode>(literal_type, LiteralHolder(pcre_pattern), 
false);
+  auto new_node = FunctionNode("regexp_matches", {node.children().at(0), 
pcre_node},
+                               node.return_type());
+
+  return RegexpMatchesHolder::TryOptimize(new_node);
+}
+
 static bool IsArrowStringLiteral(arrow::Type::type type) {
   return type == arrow::Type::STRING || type == arrow::Type::BINARY;
 }
 
-Status LikeHolder::Make(const FunctionNode& node, std::shared_ptr<LikeHolder>* 
holder) {
+Status RegexpMatchesHolder::ValidateArguments(const FunctionNode& node) {
   ARROW_RETURN_IF(node.children().size() != 2,
-                  Status::Invalid("'like' function requires two parameters"));
+                  Status::Invalid("'" + node.descriptor()->name() +
+                                  "' function requires two parameters"));
 
   auto literal = dynamic_cast<LiteralNode*>(node.children().at(1).get());
   ARROW_RETURN_IF(
       literal == nullptr,
-      Status::Invalid("'like' function requires a literal as the second 
parameter"));
+      Status::Invalid("'" + node.descriptor()->name() +
+                      "' function requires a literal as the second 
parameter"));
 
   auto literal_type = literal->return_type()->id();
   ARROW_RETURN_IF(
       !IsArrowStringLiteral(literal_type),
-      Status::Invalid(
-          "'like' function requires a string literal as the second 
parameter"));
+      Status::Invalid("'" + node.descriptor()->name() +
+                      "' function requires a string literal as the second 
parameter"));
 
-  return Make(arrow::util::get<std::string>(literal->holder()), holder);
+  return Status::OK();
 }
 
-Status LikeHolder::Make(const std::string& sql_pattern,
-                        std::shared_ptr<LikeHolder>* holder) {
-  std::string pcre_pattern;
-  ARROW_RETURN_NOT_OK(RegexUtil::SqlLikePatternToPcre(sql_pattern, 
pcre_pattern));
+Result<std::string> RegexpMatchesHolder::GetPattern(const FunctionNode& node) {

Review comment:
       FYI This looks to be the first use of `Arrow::Result` in the Gandiva 
codebase, but this seems to be what the main arrow C++ codebase is using 
recently. Let me know if you object.




-- 
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.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to