Skip to content
This repository was archived by the owner on Feb 11, 2025. It is now read-only.

Commit 4663ece

Browse files
authored
Add tilde (like) operator (#2)
1 parent 9158624 commit 4663ece

File tree

8 files changed

+73
-57
lines changed

8 files changed

+73
-57
lines changed

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,12 @@ period_months < 4
155155

156156
### Field expression operators
157157

158-
| Operator | Meaning | Supported types |
159-
|----------------------|---------------|------------------------------|
160-
| `:` or `=` | Equal, one of | `int64`, `float64`, `string` |
161-
| `!=` or `!:` | Not equal | `int64`, `float64`, `string` |
162-
| `>`, `>=`, `<`, `<=` | Comparison | `int64`, `float64` |
158+
| Operator | Meaning | Supported types |
159+
|----------------------|-------------------------------|------------------------------|
160+
| `:` or `=` | Equal, one of | `int64`, `float64`, `string` |
161+
| `!=` or `!:` | Not equal | `int64`, `float64`, `string` |
162+
| `~` | “Like” or “contains” operator | `string` |
163+
| `>`, `>=`, `<`, `<=` | Comparison | `int64`, `float64` |
163164

164165

165166
### Boolean operators

dumbql.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
// SingleCharEscape <- ["\\/bfnrt]
4040
// UnicodeEscape <- 'u' HexDigit HexDigit HexDigit HexDigit
4141
// HexDigit <- [0-9a-f]i
42-
// CmpOp <- ( ">=" / ">" / "<=" / "<" / "!:" / "!=" / ":" / "=" )
42+
// CmpOp <- ( ">=" / ">" / "<=" / "<" / "!:" / "!=" / ":" / "=" / "~" )
4343
// OneOfExpr <- '[' _ values:(OneOfValues)? _ ']'
4444
// OneOfValues <- head:OneOfValue tail:(_ ',' _ OneOfValue)*
4545
// _ <- [ \t\r\n]*
@@ -58,11 +58,12 @@
5858
//
5959
// # Field expression operators
6060
//
61-
// | Operator | Meaning | Supported types |
62-
// |----------------------|---------------|------------------------------|
63-
// | `:` or `=` | Equal, one of | `int64`, `float64`, `string` |
64-
// | `!=` or `!:` | Not equal | `int64`, `float64`, `string` |
65-
// | `>`, `>=`, `<`, `<=` | Comparison | `int64`, `float64` |
61+
// | Operator | Meaning | Supported types |
62+
// |----------------------|-------------------------------|------------------------------|
63+
// | `:` or `=` | Equal, one of | `int64`, `float64`, `string` |
64+
// | `!=` or `!:` | Not equal | `int64`, `float64`, `string` |
65+
// | `~` | “Like” or “contains” operator | `string` |
66+
// | `>`, `>=`, `<`, `<=` | Comparison | `int64`, `float64` |
6667
//
6768
// # Boolean operators
6869
//

query/ast.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ const (
122122
GreaterThanOrEqual
123123
LessThan
124124
LessThanOrEqual
125+
Like
125126
)
126127

127128
func (c FieldOperator) String() string {
@@ -138,6 +139,8 @@ func (c FieldOperator) String() string {
138139
return "<"
139140
case LessThanOrEqual:
140141
return "<="
142+
case Like:
143+
return "~"
141144
default:
142145
return "unknown!"
143146
}

query/grammar.peg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ EscapeSequence <- SingleCharEscape / UnicodeEscape
2727
SingleCharEscape <- ["\\/bfnrt]
2828
UnicodeEscape <- 'u' HexDigit HexDigit HexDigit HexDigit
2929
HexDigit <- [0-9a-f]i
30-
CmpOp <- ( ">=" / ">" / "<=" / "<" / "!:" / "!=" / ":" / "=" )
30+
CmpOp <- ( ">=" / ">" / "<=" / "<" / "!:" / "!=" / ":" / "=" / "~" )
3131
OneOfExpr <- '[' _ values:(OneOfValues)? _ ']' { return parseOneOfExpression(values) }
3232
OneOfValues <- head:OneOfValue tail:(_ ',' _ OneOfValue)* { return parseOneOfValues(head, tail) }
3333
_ <- [ \t\r\n]*

query/parser.gen.go

Lines changed: 45 additions & 45 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

query/parser_helpers.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ func resolveFieldOperator(op any) (FieldOperator, error) {
3030
return NotEqual, nil
3131
case ":", "=":
3232
return Equal, nil
33+
case "~":
34+
return Like, nil
3335
default:
3436
return 0, fmt.Errorf("unknown compare operator %q", op)
3537
}

query/sql.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ func (f *FieldExpr) ToSql() (string, []any, error) { //nolint:revive
4444
sqlizer = sq.Lt{field: value}
4545
case LessThanOrEqual:
4646
sqlizer = sq.LtOrEq{field: value}
47+
case Like:
48+
sqlizer = sq.Like{field: value}
4749
default:
4850
return "", nil, fmt.Errorf("unknown operator %q", f.Op)
4951
}

query/sql_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,13 @@ func TestToSql(t *testing.T) { //nolint:funlen
8181
want: "SELECT * FROM dummy_table WHERE NOT (status = ? AND eps < ?)",
8282
wantArgs: []any{int64(200), 0.003},
8383
},
84+
{
85+
input: `name~"John"`,
86+
want: "SELECT * FROM dummy_table WHERE name LIKE ?",
87+
wantArgs: []any{
88+
"John",
89+
},
90+
},
8491
}
8592

8693
for _, test := range tests {

0 commit comments

Comments
 (0)