OmniSciDB  cde582ebc3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Parser::RegexpExpr Class Reference

#include <ParserNode.h>

+ Inheritance diagram for Parser::RegexpExpr:
+ Collaboration diagram for Parser::RegexpExpr:

Public Member Functions

 RegexpExpr (bool n, Expr *a, Expr *p, Expr *e)
 
bool get_is_not () const
 
const Exprget_arg () const
 
const Exprget_pattern_string () const
 
const Exprget_escape_string () const
 
std::shared_ptr< Analyzer::Expranalyze (const Catalog_Namespace::Catalog &catalog, Analyzer::Query &query, TlistRefType allow_tlist_ref=TLIST_NONE) const override
 
std::string to_string () const override
 
- Public Member Functions inherited from Parser::Node
virtual ~Node ()
 

Static Public Member Functions

static std::shared_ptr
< Analyzer::Expr
get (std::shared_ptr< Analyzer::Expr > arg_expr, std::shared_ptr< Analyzer::Expr > pattern_expr, std::shared_ptr< Analyzer::Expr > escape_expr, const bool is_not)
 

Static Private Member Functions

static void check_pattern_expr (const std::string &pattern_str, char escape_char)
 
static bool translate_to_like_pattern (std::string &pattern_str, char escape_char)
 

Private Attributes

bool is_not_
 
std::unique_ptr< Exprarg_
 
std::unique_ptr< Exprpattern_string_
 
std::unique_ptr< Exprescape_string_
 

Additional Inherited Members

- Public Types inherited from Parser::Expr
enum  TlistRefType { TLIST_NONE, TLIST_REF, TLIST_COPY }
 

Detailed Description

Definition at line 526 of file ParserNode.h.

Constructor & Destructor Documentation

Parser::RegexpExpr::RegexpExpr ( bool  n,
Expr a,
Expr p,
Expr e 
)
inline

Definition at line 528 of file ParserNode.h.

529  : is_not_(n), arg_(a), pattern_string_(p), escape_string_(e) {}
constexpr double a
Definition: Utm.h:32
std::unique_ptr< Expr > pattern_string_
Definition: ParserNode.h:547
std::unique_ptr< Expr > arg_
Definition: ParserNode.h:546
std::unique_ptr< Expr > escape_string_
Definition: ParserNode.h:548
constexpr double n
Definition: Utm.h:38

Member Function Documentation

std::shared_ptr< Analyzer::Expr > Parser::RegexpExpr::analyze ( const Catalog_Namespace::Catalog catalog,
Analyzer::Query query,
TlistRefType  allow_tlist_ref = TLIST_NONE 
) const
overridevirtual

Implements Parser::Expr.

Definition at line 774 of file ParserNode.cpp.

777  {
778  auto arg_expr = arg_->analyze(catalog, query, allow_tlist_ref);
779  auto pattern_expr = pattern_string_->analyze(catalog, query, allow_tlist_ref);
780  auto escape_expr = escape_string_ == nullptr
781  ? nullptr
782  : escape_string_->analyze(catalog, query, allow_tlist_ref);
783  return RegexpExpr::get(arg_expr, pattern_expr, escape_expr, is_not_);
784 }
static std::shared_ptr< Analyzer::Expr > get(std::shared_ptr< Analyzer::Expr > arg_expr, std::shared_ptr< Analyzer::Expr > pattern_expr, std::shared_ptr< Analyzer::Expr > escape_expr, const bool is_not)
Definition: ParserNode.cpp:786
std::unique_ptr< Expr > pattern_string_
Definition: ParserNode.h:547
std::unique_ptr< Expr > arg_
Definition: ParserNode.h:546
std::unique_ptr< Expr > escape_string_
Definition: ParserNode.h:548
void Parser::RegexpExpr::check_pattern_expr ( const std::string &  pattern_str,
char  escape_char 
)
staticprivate

Definition at line 737 of file ParserNode.cpp.

737  {
738  if (pattern_str.back() == escape_char) {
739  throw std::runtime_error("REGEXP pattern must not end with escape character.");
740  }
741 }
std::shared_ptr< Analyzer::Expr > Parser::RegexpExpr::get ( std::shared_ptr< Analyzer::Expr arg_expr,
std::shared_ptr< Analyzer::Expr pattern_expr,
std::shared_ptr< Analyzer::Expr escape_expr,
const bool  is_not 
)
static

Definition at line 786 of file ParserNode.cpp.

References Analyzer::Constant::get_constval(), kBOOLEAN, kNOT, run_benchmark_import::result, and Datum::stringval.

Referenced by RelAlgTranslator::translateRegexp().

790  {
791  if (!arg_expr->get_type_info().is_string()) {
792  throw std::runtime_error("expression before REGEXP must be of a string type.");
793  }
794  if (!pattern_expr->get_type_info().is_string()) {
795  throw std::runtime_error("expression after REGEXP must be of a string type.");
796  }
797  char escape_char = '\\';
798  if (escape_expr != nullptr) {
799  if (!escape_expr->get_type_info().is_string()) {
800  throw std::runtime_error("expression after ESCAPE must be of a string type.");
801  }
802  if (!escape_expr->get_type_info().is_string()) {
803  throw std::runtime_error("expression after ESCAPE must be of a string type.");
804  }
805  auto c = std::dynamic_pointer_cast<Analyzer::Constant>(escape_expr);
806  if (c != nullptr && c->get_constval().stringval->length() > 1) {
807  throw std::runtime_error("String after ESCAPE must have a single character.");
808  }
809  escape_char = (*c->get_constval().stringval)[0];
810  if (escape_char != '\\') {
811  throw std::runtime_error("Only supporting '\\' escape character.");
812  }
813  }
814  auto c = std::dynamic_pointer_cast<Analyzer::Constant>(pattern_expr);
815  if (c != nullptr) {
816  std::string& pattern = *c->get_constval().stringval;
817  if (translate_to_like_pattern(pattern, escape_char)) {
818  return LikeExpr::get(arg_expr, pattern_expr, escape_expr, false, is_not);
819  }
820  }
821  std::shared_ptr<Analyzer::Expr> result =
822  makeExpr<Analyzer::RegexpExpr>(arg_expr->decompress(), pattern_expr, escape_expr);
823  if (is_not) {
824  result = makeExpr<Analyzer::UOper>(kBOOLEAN, kNOT, result);
825  }
826  return result;
827 }
static bool translate_to_like_pattern(std::string &pattern_str, char escape_char)
Definition: ParserNode.cpp:743
std::string * stringval
Definition: sqltypes.h:220
static std::shared_ptr< Analyzer::Expr > get(std::shared_ptr< Analyzer::Expr > arg_expr, std::shared_ptr< Analyzer::Expr > like_expr, std::shared_ptr< Analyzer::Expr > escape_expr, const bool is_ilike, const bool is_not)
Definition: ParserNode.cpp:691
Datum get_constval() const
Definition: Analyzer.h:342
Definition: sqldefs.h:38

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

const Expr* Parser::RegexpExpr::get_arg ( ) const
inline

Definition at line 531 of file ParserNode.h.

References arg_.

531 { return arg_.get(); }
std::unique_ptr< Expr > arg_
Definition: ParserNode.h:546
const Expr* Parser::RegexpExpr::get_escape_string ( ) const
inline

Definition at line 533 of file ParserNode.h.

References escape_string_.

533 { return escape_string_.get(); }
std::unique_ptr< Expr > escape_string_
Definition: ParserNode.h:548
bool Parser::RegexpExpr::get_is_not ( ) const
inline

Definition at line 530 of file ParserNode.h.

References is_not_.

530 { return is_not_; }
const Expr* Parser::RegexpExpr::get_pattern_string ( ) const
inline

Definition at line 532 of file ParserNode.h.

References pattern_string_.

532 { return pattern_string_.get(); }
std::unique_ptr< Expr > pattern_string_
Definition: ParserNode.h:547
std::string Parser::RegexpExpr::to_string ( ) const
overridevirtual

Implements Parser::Expr.

Definition at line 2214 of file ParserNode.cpp.

2214  {
2215  std::string str = arg_->to_string();
2216  if (is_not_) {
2217  str += " NOT REGEXP ";
2218  } else {
2219  str += " REGEXP ";
2220  }
2221  str += pattern_string_->to_string();
2222  if (escape_string_ != nullptr) {
2223  str += " ESCAPE " + escape_string_->to_string();
2224  }
2225  return str;
2226 }
std::unique_ptr< Expr > pattern_string_
Definition: ParserNode.h:547
std::unique_ptr< Expr > arg_
Definition: ParserNode.h:546
std::unique_ptr< Expr > escape_string_
Definition: ParserNode.h:548
bool Parser::RegexpExpr::translate_to_like_pattern ( std::string &  pattern_str,
char  escape_char 
)
staticprivate

Definition at line 743 of file ParserNode.cpp.

743  {
744  char prev_char = '\0';
745  char prev_prev_char = '\0';
746  std::string like_str;
747  for (char& cur_char : pattern_str) {
748  if (prev_char == escape_char || isalnum(cur_char) || cur_char == ' ' ||
749  cur_char == '.') {
750  like_str.push_back((cur_char == '.') ? '_' : cur_char);
751  prev_prev_char = prev_char;
752  prev_char = cur_char;
753  continue;
754  }
755  if (prev_char == '.' && prev_prev_char != escape_char) {
756  if (cur_char == '*' || cur_char == '+') {
757  if (cur_char == '*') {
758  like_str.pop_back();
759  }
760  // .* --> %
761  // .+ --> _%
762  like_str.push_back('%');
763  prev_prev_char = prev_char;
764  prev_char = cur_char;
765  continue;
766  }
767  }
768  return false;
769  }
770  pattern_str = like_str;
771  return true;
772 }

Member Data Documentation

std::unique_ptr<Expr> Parser::RegexpExpr::arg_
private

Definition at line 546 of file ParserNode.h.

Referenced by get_arg().

std::unique_ptr<Expr> Parser::RegexpExpr::escape_string_
private

Definition at line 548 of file ParserNode.h.

Referenced by get_escape_string().

bool Parser::RegexpExpr::is_not_
private

Definition at line 545 of file ParserNode.h.

Referenced by get_is_not().

std::unique_ptr<Expr> Parser::RegexpExpr::pattern_string_
private

Definition at line 547 of file ParserNode.h.

Referenced by get_pattern_string().


The documentation for this class was generated from the following files: