orm: support lowercase operators like, in, not in etc (fix #25032) (#25035)

This commit is contained in:
Swastik Baranwal 2025-08-04 10:57:44 +05:30 committed by GitHub
parent d249bfb04e
commit 1569a821cd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 4 deletions

View File

@ -93,17 +93,18 @@ fn (mut ss MyTextScanner) next_tok() string {
mut ret := '' mut ret := ''
ss.skip_whitespace() ss.skip_whitespace()
ss.last_tok_start = ss.pos ss.last_tok_start = ss.pos
ss_upper := ss.input.to_upper()
// check for longest token first // check for longest token first
if ss.input[ss.pos..].starts_with('IS NOT NULL') { if ss_upper[ss.pos..].starts_with('IS NOT NULL') {
ss.pos += 11 ss.pos += 11
return 'IS NOT NULL' return 'IS NOT NULL'
} }
if ss.input[ss.pos..].starts_with('IS NULL') { if ss_upper[ss.pos..].starts_with('IS NULL') {
ss.pos += 7 ss.pos += 7
return 'IS NULL' return 'IS NULL'
} }
if ss.input[ss.pos..].starts_with('NOT IN') { if ss_upper[ss.pos..].starts_with('NOT IN') {
ss.pos += 6 ss.pos += 6
return 'NOT IN' return 'NOT IN'
} }
@ -186,7 +187,7 @@ fn (qb_ &QueryBuilder[T]) parse_conditions(conds string, params []Primitive) ! {
} }
} }
.op { .op {
current_op = match tok { current_op = match tok.to_upper() {
'=' { '=' {
OperationKind.eq OperationKind.eq
} }

View File

@ -86,6 +86,12 @@ fn test_orm_func_where() {
qb.where('(salary >= ? AND (age <= ? OR title LIKE ?))', 50000, 35, '%Manager%')! qb.where('(salary >= ? AND (age <= ? OR title LIKE ?))', 50000, 35, '%Manager%')!
assert qb.where.parentheses == [[1, 2], [0, 2]] assert qb.where.parentheses == [[1, 2], [0, 2]]
// test lowercase `like`
qb.reset()
qb.where('(salary >= ? AND (age <= ? OR title like ?))', 50000, 35, '%Manager%')!
assert qb.where.parentheses == [[1, 2], [0, 2]]
assert qb.where.kinds == [.ge, .le, .orm_like]
// complex_nesting // complex_nesting
qb.reset() qb.reset()
qb.where('((age = ? OR (salary > ? AND id < ?)) AND (name LIKE ?))', 1, 2, 3, '%test%')! qb.where('((age = ? OR (salary > ? AND id < ?)) AND (name LIKE ?))', 1, 2, 3, '%test%')!
@ -96,6 +102,12 @@ fn test_orm_func_where() {
qb.where('name IN ? AND age NOT IN ?', ['Tom'], [2])! qb.where('name IN ? AND age NOT IN ?', ['Tom'], [2])!
assert qb.where.fields == ['name', 'age'] assert qb.where.fields == ['name', 'age']
assert qb.where.kinds == [.in, .not_in] assert qb.where.kinds == [.in, .not_in]
// lowercase in and not in
qb.reset()
qb.where('name in ? AND age not in ?', ['Tom'], [2])!
assert qb.where.fields == ['name', 'age']
assert qb.where.kinds == [.in, .not_in]
} }
fn test_orm_func_stmts() { fn test_orm_func_stmts() {
@ -503,6 +515,12 @@ fn test_orm_func_stmts() {
assert selected_users[0].name == 'Silly' assert selected_users[0].name == 'Silly'
assert selected_users.len == 1 assert selected_users.len == 1
// complex select with lowercase `is null` and `like`
selected_users1 := qb.where('created_at is null && ((salary > ? && age < ?) || (role like ?))',
2000, 30, '%employee%')!.query()!
assert selected_users1[0].name == 'Silly'
assert selected_users1.len == 1
// chain where // chain where
and_where := qb.where('salary > ?', 2000)!.where('age > ?', 40)!.query()! and_where := qb.where('salary > ?', 2000)!.where('age > ?', 40)!.query()!
assert and_where.len == 1 assert and_where.len == 1