@@ -439,8 +439,14 @@ fn match_alert_operator(expr: &ConditionConfig) -> Expr {
439439    // if it can be parsed as a number, then parse it 
440440    // else keep it as a string 
441441    if  expr. value . as_ref ( ) . is_some_and ( |v| !v. is_empty ( ) )  { 
442-         let  value = expr. value . as_ref ( ) . unwrap ( ) ; 
443-         let  value = NumberOrString :: from_string ( value. clone ( ) ) ; 
442+         let  string_value = expr
443+             . value 
444+             . as_ref ( ) 
445+             . unwrap ( ) 
446+             . replace ( "'" ,  "\\ '" ) 
447+             . replace ( '%' ,  "\\ %" ) 
448+             . replace ( '_' ,  "\\ _" ) ; 
449+         let  value = NumberOrString :: from_string ( string_value. clone ( ) ) ; 
444450
445451        // for maintaining column case 
446452        let  column = format ! ( r#""{}""# ,  expr. column) ; 
@@ -451,28 +457,30 @@ fn match_alert_operator(expr: &ConditionConfig) -> Expr {
451457            WhereConfigOperator :: GreaterThan  => col ( column) . gt ( lit ( value) ) , 
452458            WhereConfigOperator :: LessThanOrEqual  => col ( column) . lt_eq ( lit ( value) ) , 
453459            WhereConfigOperator :: GreaterThanOrEqual  => col ( column) . gt_eq ( lit ( value) ) , 
454-             WhereConfigOperator :: ILike  => col ( column) . ilike ( lit ( value) ) , 
455-             WhereConfigOperator :: Contains  => col ( column) . like ( lit ( value) ) , 
460+             WhereConfigOperator :: ILike  => col ( column) . ilike ( lit ( string_value) ) , 
461+             WhereConfigOperator :: Contains  => { 
462+                 col ( column) . like ( lit ( format ! ( "%{string_value}%" ) ) ) 
463+             } , 
456464            WhereConfigOperator :: BeginsWith  => Expr :: BinaryExpr ( BinaryExpr :: new ( 
457465                Box :: new ( col ( column) ) , 
458466                Operator :: RegexIMatch , 
459-                 Box :: new ( lit ( format ! ( "^{value }" ) ) ) , 
467+                 Box :: new ( lit ( format ! ( "^{string_value }" ) ) ) , 
460468            ) ) , 
461469            WhereConfigOperator :: EndsWith  => Expr :: BinaryExpr ( BinaryExpr :: new ( 
462470                Box :: new ( col ( column) ) , 
463471                Operator :: RegexIMatch , 
464-                 Box :: new ( lit ( format ! ( "{value }$" ) ) ) , 
472+                 Box :: new ( lit ( format ! ( "{string_value }$" ) ) ) , 
465473            ) ) , 
466-             WhereConfigOperator :: DoesNotContain  => col ( column) . not_ilike ( lit ( value ) ) , 
474+             WhereConfigOperator :: DoesNotContain  => col ( column) . not_ilike ( lit ( string_value ) ) , 
467475            WhereConfigOperator :: DoesNotBeginWith  => Expr :: BinaryExpr ( BinaryExpr :: new ( 
468476                Box :: new ( col ( column) ) , 
469477                Operator :: RegexNotIMatch , 
470-                 Box :: new ( lit ( format ! ( "^{value }" ) ) ) , 
478+                 Box :: new ( lit ( format ! ( "^{string_value }" ) ) ) , 
471479            ) ) , 
472480            WhereConfigOperator :: DoesNotEndWith  => Expr :: BinaryExpr ( BinaryExpr :: new ( 
473481                Box :: new ( col ( column) ) , 
474482                Operator :: RegexNotIMatch , 
475-                 Box :: new ( lit ( format ! ( "{value }$" ) ) ) , 
483+                 Box :: new ( lit ( format ! ( "{string_value }$" ) ) ) , 
476484            ) ) , 
477485            _ => unreachable ! ( "value must not be null for operators other than `is null` and `is not null`. Should've been caught in validation" ) 
478486        } 
0 commit comments