Skip to content

Commit 942d82d

Browse files
committed
added comparison operator support
1 parent 77f2ae0 commit 942d82d

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

ormlite.go

+26-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"database/sql"
66
"fmt"
7+
"github.com/davecgh/go-spew/spew"
78
"reflect"
89
"strings"
910
"time"
@@ -49,6 +50,16 @@ type OrderBy struct {
4950
// Where is a map containing fields and their values to meet in the result
5051
type Where map[string]interface{}
5152

53+
type Greater float64
54+
55+
type Less float64
56+
57+
type GreaterOrEqual float64
58+
59+
type LessOrEqual float64
60+
61+
type NotEqual float64
62+
5263
const (
5364
// AND is a glue between multiple statements after `where`
5465
AND = " and "
@@ -257,7 +268,21 @@ func queryWithOptions(ctx context.Context, db *sql.DB, table string, columns []s
257268
keys = append(keys, fmt.Sprintf("%s like ?", k))
258269
values = append(values, fmt.Sprintf("%%%s%%", v))
259270
default:
260-
keys = append(keys, fmt.Sprintf("%s = ?", k))
271+
spew.Dump(v)
272+
switch v.(type) {
273+
case Greater:
274+
keys = append(keys, fmt.Sprintf("%s > ?", k))
275+
case GreaterOrEqual:
276+
keys = append(keys, fmt.Sprintf("%s >= ?", k))
277+
case Less:
278+
keys = append(keys, fmt.Sprintf("%s < ?", k))
279+
case LessOrEqual:
280+
keys = append(keys, fmt.Sprintf("%s <= ?", k))
281+
case NotEqual:
282+
keys = append(keys, fmt.Sprintf("%s != ?", k))
283+
default:
284+
keys = append(keys, fmt.Sprintf("%s = ?", k))
285+
}
261286
values = append(values, v)
262287
}
263288
} else {

ormlite_test.go

+45
Original file line numberDiff line numberDiff line change
@@ -1080,3 +1080,48 @@ func (s *testCustomFieldInMTMModel) TestParenthesis() {
10801080
func TestCustomFieldInMTM(t *testing.T) {
10811081
suite.Run(t, new(testCustomFieldInMTMModel))
10821082
}
1083+
1084+
type testOperatorsModel struct {
1085+
ID int64 `ormlite:"primary"`
1086+
Number int
1087+
}
1088+
1089+
func (m *testOperatorsModel) Table() string { return "test" }
1090+
1091+
func TestGreaterOrLessOperator(t *testing.T) {
1092+
db, err := sql.Open("sqlite3", ":memory:?_fk=1")
1093+
require.NoError(t, err)
1094+
1095+
_, err = db.Exec(`
1096+
create table test(id integer primary key, number integer);
1097+
insert into test(number) values (1), (2), (3), (4), (5);
1098+
`)
1099+
require.NoError(t, err)
1100+
1101+
var mm []*testOperatorsModel
1102+
if assert.NoError(t, QuerySlice(db, &Options{Where: Where{"number": Greater(4)}}, &mm)) {
1103+
if assert.Len(t, mm, 1) {
1104+
assert.EqualValues(t, 5, mm[0].ID)
1105+
}
1106+
}
1107+
1108+
mm = nil
1109+
if assert.NoError(t, QuerySlice(db, &Options{Where: Where{"number": Less(3)}}, &mm)) {
1110+
assert.Len(t, mm, 2)
1111+
}
1112+
1113+
mm = nil
1114+
if assert.NoError(t, QuerySlice(db, &Options{Where: Where{"number": GreaterOrEqual(3)}}, &mm)) {
1115+
assert.Len(t, mm, 3)
1116+
}
1117+
1118+
mm = nil
1119+
if assert.NoError(t, QuerySlice(db, &Options{Where: Where{"number": LessOrEqual(2)}}, &mm)) {
1120+
assert.Len(t, mm, 2)
1121+
}
1122+
1123+
mm = nil
1124+
if assert.NoError(t, QuerySlice(db, &Options{Where: Where{"number": NotEqual(3)}}, &mm)) {
1125+
assert.Len(t, mm, 4)
1126+
}
1127+
}

0 commit comments

Comments
 (0)