func operateStrings(op lex.Token, av, bv value.StringValue) value.Value { // Any other ops besides eq/not ? a, b := av.Val(), bv.Val() switch op.T { case lex.TokenEqualEqual, lex.TokenEqual: // == //u.Infof("==? %v %v", av, bv) if a == b { return value.BoolValueTrue } return value.BoolValueFalse case lex.TokenNE: // != //u.Infof("!=? %v %v", av, bv) if a == b { return value.BoolValueFalse } return value.BoolValueTrue case lex.TokenLike: // a(value) LIKE b(pattern) match, err := glob.Match(b, a) if err != nil { value.NewErrorValuef("invalid LIKE pattern: %q", a) } if match { return value.BoolValueTrue } return value.BoolValueFalse } return value.NewErrorValuef("unsupported operator for strings: %s", op.T) }
// Split a string, accepts an optional with parameter // // split(item, ",") // func SplitFunc(ctx expr.EvalContext, input value.Value, splitByV value.StringValue) (value.StringsValue, bool) { sv, ok := value.ToString(input.Rv()) splitBy, splitByOk := value.ToString(splitByV.Rv()) if !ok || !splitByOk { return value.NewStringsValue(make([]string, 0)), false } if sv == "" { return value.NewStringsValue(make([]string, 0)), false } if splitBy == "" { return value.NewStringsValue(make([]string, 0)), false } vals := strings.Split(sv, splitBy) return value.NewStringsValue(vals), true }
func operateStrings(op lex.Token, av, bv value.StringValue) value.Value { // Any other ops besides eq/not ? a, b := av.Val(), bv.Val() switch op.T { // Below here are Boolean Returns case lex.TokenEqualEqual, lex.TokenEqual: // == //u.Infof("==? %v %v", av, bv) if a == b { return value.BoolValueTrue } else { return value.BoolValueFalse } case lex.TokenNE: // != //u.Infof("==? %v %v", av, bv) if a == b { return value.BoolValueFalse } else { return value.BoolValueTrue } } return value.ErrValue }
func operateStrings(op lex.Token, av, bv value.StringValue) value.Value { // Any other ops besides =, ==, !=, contains, like? a, b := av.Val(), bv.Val() switch op.T { case lex.TokenEqualEqual, lex.TokenEqual: // == //u.Infof("==? %v %v", av, bv) if a == b { return value.BoolValueTrue } return value.BoolValueFalse case lex.TokenNE: // != //u.Infof("!=? %v %v", av, bv) if a == b { return value.BoolValueFalse } return value.BoolValueTrue case lex.TokenContains: if strings.Contains(a, b) { return value.BoolValueTrue } return value.BoolValueFalse case lex.TokenLike: // a(value) LIKE b(pattern) bv, ok := LikeCompare(a, b) if !ok { return value.NewErrorValuef("invalid LIKE pattern: %q", a) } return bv case lex.TokenIN: if a == b { return value.BoolValueTrue } return value.BoolValueFalse } return value.NewErrorValuef("unsupported operator for strings: %s", op.T) }