Skip to content

Commit 82d624b

Browse files
author
Timofey S
committed
add method AddORFilters for adding multiple filters into one OR statement
1 parent 0cfa601 commit 82d624b

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

main.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,35 @@ func (q *Query) AddFilter(name string, m Method, value interface{}) *Query {
252252
return q
253253
}
254254

255+
// AddORFilters adds multiple filter into one `OR` statement inside parenteses.
256+
// E.g. (firstname ILIKE ? OR lastname ILIKE ?)
257+
func (q *Query) AddORFilters(fn func(query *Query)) *Query {
258+
_q := New()
259+
260+
fn(_q)
261+
262+
if len(_q.Filters) < 2 {
263+
return q
264+
}
265+
266+
firstIdx := 0
267+
lastIdx := len(_q.Filters) - 1
268+
269+
for i := 0; i < len(_q.Filters); i++ {
270+
switch i {
271+
case firstIdx:
272+
_q.Filters[i].OR = StartOR
273+
case lastIdx:
274+
_q.Filters[i].OR = EndOR
275+
default:
276+
_q.Filters[i].OR = InOR
277+
}
278+
}
279+
280+
q.Filters = append(q.Filters, _q.Filters...)
281+
return q
282+
}
283+
255284
// AddFilterRaw adds a filter to Query as SQL condition.
256285
// This function supports only single condition per one call.
257286
// If you'd like add more then one conditions you should call this func several times.

main_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,3 +577,37 @@ func TestEmptySliceFilterWithAnotherFilter(t *testing.T) {
577577
q.AddFilter("another_id", EQ, uuid.New().String())
578578
t.Log(q.SQL("test"))
579579
}
580+
581+
func TestQuery_AddORFilters(t *testing.T) {
582+
t.Run("2 OR conditions", func(t *testing.T) {
583+
q := New().AddFilter("test", EQ, "ok")
584+
q.AddORFilters(func(query *Query) {
585+
query.AddFilter("firstname", ILIKE, "*hello*")
586+
query.AddFilter("lastname", ILIKE, "*hello*")
587+
})
588+
out := q.SQL("table")
589+
t.Log(out)
590+
assert.Equal(t, `SELECT * FROM table WHERE test = ? AND (firstname ILIKE ? OR lastname ILIKE ?)`, out)
591+
})
592+
593+
t.Run("3 OR conditions", func(t *testing.T) {
594+
q := New().AddFilter("test", EQ, "ok")
595+
q.AddORFilters(func(query *Query) {
596+
query.AddFilter("firstname", ILIKE, "*hello*")
597+
query.AddFilter("lastname", ILIKE, "*hello*")
598+
query.AddFilter("email", ILIKE, "*hello*")
599+
})
600+
out := q.SQL("table")
601+
t.Log(out)
602+
assert.Equal(t, `SELECT * FROM table WHERE test = ? AND (firstname ILIKE ? OR lastname ILIKE ? OR email ILIKE ?)`, out)
603+
})
604+
}
605+
606+
func ExampleQuery_AddORFilters() {
607+
q := New().AddFilter("test", EQ, "ok")
608+
q.AddORFilters(func(query *Query) {
609+
query.AddFilter("firstname", ILIKE, "*hello*")
610+
query.AddFilter("lastname", ILIKE, "*hello*")
611+
})
612+
q.SQL("table") // SELECT * FROM table WHERE test = ? AND (firstname ILIKE ? OR lastname ILIKE ?)
613+
}

0 commit comments

Comments
 (0)