Skip to content

Commit f0e8aca

Browse files
authored
Merge pull request #20 from n-r-w/more_less_expr
Greater, Less expr
2 parents 0326fc5 + d3138bf commit f0e8aca

File tree

3 files changed

+240
-4
lines changed

3 files changed

+240
-4
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,17 @@ Not(Select("col").From("table")) // NOT (SELECT col FROM table)
155155
Not(Not(Select("col").From("table"))) // SELECT col FROM table
156156
```
157157
158+
### Equal, NotEqual, Greater, GreaterOrEqual, Less, LessOrEqual functions
159+
160+
```go
161+
Equal(Select("col").From("table"), 1) // (SELECT col FROM table) = 1
162+
NotEqual(Select("col").From("table"), 1) // (SELECT col FROM table) != 1
163+
Greater(Select("col").From("table"), 1) // (SELECT col FROM table) > 1
164+
GreaterOrEqual(Select("col").From("table"), 1) // (SELECT col FROM table) >= 1
165+
Less(Select("col").From("table"), 1) // (SELECT col FROM table) < 1
166+
LessOrEqual(Select("col").From("table"), 1) // (SELECT col FROM table) <= 1
167+
```
168+
158169
### Range function
159170
160171
```go

expr.go

Lines changed: 115 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ func (e avgExpr) ToSql() (sql string, args []any, err error) {
539539
return
540540
}
541541

542-
// ExistsExpr helps to use EXISTS in SQL query
542+
// existsExpr helps to use EXISTS in SQL query
543543
type existsExpr struct {
544544
expr Sqlizer
545545
}
@@ -558,7 +558,7 @@ func (e existsExpr) ToSql() (sql string, args []any, err error) {
558558
return
559559
}
560560

561-
// NotExistsExpr helps to use NOT EXISTS in SQL query
561+
// notExistsExpr helps to use NOT EXISTS in SQL query
562562
type notExistsExpr struct {
563563
expr Sqlizer
564564
}
@@ -577,7 +577,118 @@ func (e notExistsExpr) ToSql() (sql string, args []any, err error) {
577577
return
578578
}
579579

580-
// InExpr helps to use IN in SQL query
580+
// equalExpr helps to use = in SQL query
581+
type equalExpr struct {
582+
expr Sqlizer
583+
value any
584+
}
585+
586+
// Equal allows to use = in SQL query
587+
// Ex: SelectBuilder.Where(Equal(sq.Select(...), 1))
588+
func Equal(e Sqlizer, v any) equalExpr {
589+
return equalExpr{e, v}
590+
}
591+
592+
func (e equalExpr) ToSql() (sql string, args []any, err error) {
593+
sql, args, err = e.expr.ToSql()
594+
if err == nil {
595+
sql = fmt.Sprintf("(%s) = ?", sql)
596+
args = append(args, e.value)
597+
}
598+
return
599+
}
600+
601+
// notEqualExpr helps to use <> in SQL query
602+
type notEqualExpr equalExpr
603+
604+
// NotEqual allows to use <> in SQL query
605+
// Ex: SelectBuilder.Where(NotEqual(sq.Select(...), 1))
606+
func NotEqual(e Sqlizer, v any) notEqualExpr {
607+
return notEqualExpr{e, v}
608+
}
609+
610+
func (e notEqualExpr) ToSql() (sql string, args []any, err error) {
611+
sql, args, err = e.expr.ToSql()
612+
if err == nil {
613+
sql = fmt.Sprintf("(%s) <> ?", sql)
614+
args = append(args, e.value)
615+
}
616+
return
617+
}
618+
619+
// greaterExpr helps to use > in SQL query
620+
type greaterExpr equalExpr
621+
622+
// Greater allows to use > in SQL query
623+
// Ex: SelectBuilder.Where(Greater(sq.Select(...), 1))
624+
func Greater(e Sqlizer, v any) greaterExpr {
625+
return greaterExpr{e, v}
626+
}
627+
628+
func (e greaterExpr) ToSql() (sql string, args []any, err error) {
629+
sql, args, err = e.expr.ToSql()
630+
if err == nil {
631+
sql = fmt.Sprintf("(%s) > ?", sql)
632+
args = append(args, e.value)
633+
}
634+
return
635+
}
636+
637+
// greaterOrEqualExpr helps to use >= in SQL query
638+
type greaterOrEqualExpr equalExpr
639+
640+
// GreaterOrEqual allows to use >= in SQL query
641+
// Ex: SelectBuilder.Where(GreaterOrEqual(sq.Select(...), 1))
642+
func GreaterOrEqual(e Sqlizer, v any) greaterOrEqualExpr {
643+
return greaterOrEqualExpr{e, v}
644+
}
645+
646+
func (e greaterOrEqualExpr) ToSql() (sql string, args []any, err error) {
647+
sql, args, err = e.expr.ToSql()
648+
if err == nil {
649+
sql = fmt.Sprintf("(%s) >= ?", sql)
650+
args = append(args, e.value)
651+
}
652+
return
653+
}
654+
655+
// lessExpr helps to use < in SQL query
656+
type lessExpr equalExpr
657+
658+
// Less allows to use < in SQL query
659+
// Ex: SelectBuilder.Where(Less(sq.Select(...), 1))
660+
func Less(e Sqlizer, v any) lessExpr {
661+
return lessExpr{e, v}
662+
}
663+
664+
func (e lessExpr) ToSql() (sql string, args []any, err error) {
665+
sql, args, err = e.expr.ToSql()
666+
if err == nil {
667+
sql = fmt.Sprintf("(%s) < ?", sql)
668+
args = append(args, e.value)
669+
}
670+
return
671+
}
672+
673+
// lessOrEqualExpr helps to use <= in SQL query
674+
type lessOrEqualExpr equalExpr
675+
676+
// LessOrEqual allows to use <= in SQL query
677+
// Ex: SelectBuilder.Where(LessOrEqual(sq.Select(...), 1))
678+
func LessOrEqual(e Sqlizer, v any) lessOrEqualExpr {
679+
return lessOrEqualExpr{e, v}
680+
}
681+
682+
func (e lessOrEqualExpr) ToSql() (sql string, args []any, err error) {
683+
sql, args, err = e.expr.ToSql()
684+
if err == nil {
685+
sql = fmt.Sprintf("(%s) <= ?", sql)
686+
args = append(args, e.value)
687+
}
688+
return
689+
}
690+
691+
// inExpr helps to use IN in SQL query
581692
type inExpr struct {
582693
column string
583694
expr any
@@ -618,7 +729,7 @@ func (e inExpr) ToSql() (sql string, args []any, err error) {
618729
return sql, args, err
619730
}
620731

621-
// NotInExpr helps to use NOT IN in SQL query
732+
// notInExpr helps to use NOT IN in SQL query
622733
type notInExpr inExpr
623734

624735
// NotIn allows to use NOT IN in SQL query

expr_test.go

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,120 @@ func TestAggr(t *testing.T) {
506506
assert.Equal(t, expectedArgs, args)
507507
}
508508

509+
func TestEqual(t *testing.T) {
510+
q := Select("col1").
511+
From("table1").
512+
Where(
513+
Equal(
514+
Select("col2").
515+
From("table2"),
516+
2),
517+
)
518+
sql, args, err := q.ToSql()
519+
assert.NoError(t, err)
520+
521+
expectedArgs := []any{2}
522+
assert.Equal(t, expectedArgs, args)
523+
524+
expectedSql := "SELECT col1 FROM table1 WHERE (SELECT col2 FROM table2) = ?"
525+
assert.Equal(t, expectedSql, sql)
526+
}
527+
528+
func TestNotEqual(t *testing.T) {
529+
q := Select("col1").
530+
From("table1").
531+
Where(
532+
NotEqual(
533+
Select("col2").
534+
From("table2"),
535+
2),
536+
)
537+
sql, args, err := q.ToSql()
538+
assert.NoError(t, err)
539+
540+
expectedArgs := []any{2}
541+
assert.Equal(t, expectedArgs, args)
542+
543+
expectedSql := "SELECT col1 FROM table1 WHERE (SELECT col2 FROM table2) <> ?"
544+
assert.Equal(t, expectedSql, sql)
545+
}
546+
547+
func TestGreater(t *testing.T) {
548+
q := Select("col1").
549+
From("table1").
550+
Where(
551+
Greater(
552+
Select("col2").
553+
From("table2"),
554+
2),
555+
)
556+
sql, args, err := q.ToSql()
557+
assert.NoError(t, err)
558+
559+
expectedArgs := []any{2}
560+
assert.Equal(t, expectedArgs, args)
561+
562+
expectedSql := "SELECT col1 FROM table1 WHERE (SELECT col2 FROM table2) > ?"
563+
assert.Equal(t, expectedSql, sql)
564+
}
565+
566+
func TestGreaterOrEqual(t *testing.T) {
567+
q := Select("col1").
568+
From("table1").
569+
Where(
570+
GreaterOrEqual(
571+
Select("col2").
572+
From("table2"),
573+
2),
574+
)
575+
sql, args, err := q.ToSql()
576+
assert.NoError(t, err)
577+
578+
expectedArgs := []any{2}
579+
assert.Equal(t, expectedArgs, args)
580+
581+
expectedSql := "SELECT col1 FROM table1 WHERE (SELECT col2 FROM table2) >= ?"
582+
assert.Equal(t, expectedSql, sql)
583+
}
584+
585+
func TestLess(t *testing.T) {
586+
q := Select("col1").
587+
From("table1").
588+
Where(
589+
Less(
590+
Select("col2").
591+
From("table2"),
592+
2),
593+
)
594+
sql, args, err := q.ToSql()
595+
assert.NoError(t, err)
596+
597+
expectedArgs := []any{2}
598+
assert.Equal(t, expectedArgs, args)
599+
600+
expectedSql := "SELECT col1 FROM table1 WHERE (SELECT col2 FROM table2) < ?"
601+
assert.Equal(t, expectedSql, sql)
602+
}
603+
604+
func TestLessOrEqual(t *testing.T) {
605+
q := Select("col1").
606+
From("table1").
607+
Where(
608+
LessOrEqual(
609+
Select("col2").
610+
From("table2"),
611+
2),
612+
)
613+
sql, args, err := q.ToSql()
614+
assert.NoError(t, err)
615+
616+
expectedArgs := []any{2}
617+
assert.Equal(t, expectedArgs, args)
618+
619+
expectedSql := "SELECT col1 FROM table1 WHERE (SELECT col2 FROM table2) <= ?"
620+
assert.Equal(t, expectedSql, sql)
621+
}
622+
509623
func TestIn(t *testing.T) {
510624
subQuery := Select("id").From("users").Where(Eq{"company": 20})
511625

0 commit comments

Comments
 (0)