Skip to content

Commit c8b796c

Browse files
committed
add between operator
1 parent 9788b03 commit c8b796c

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

querybuilder/operator/between.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package operator
2+
3+
import (
4+
"reflect"
5+
"time"
6+
)
7+
8+
func init() {
9+
AddOperator(Between)
10+
}
11+
12+
// Between
13+
var Between = &Operator{
14+
Name: "between",
15+
Evaluate: func(input, value interface{}) bool {
16+
rvalue := reflect.ValueOf(value)
17+
if rvalue.Kind() != reflect.Slice {
18+
return false
19+
}
20+
21+
v := value.([]interface{})
22+
23+
switch input.(type) {
24+
case float64:
25+
i := input.(float64)
26+
sv := v[0].(float64)
27+
ev := v[1].(float64)
28+
return i > sv && i < ev
29+
case int:
30+
i := input.(int)
31+
sv := v[0].(int)
32+
ev := v[1].(int)
33+
return i > sv && i < ev
34+
case time.Time:
35+
i := input.(time.Time)
36+
sv := v[0].(time.Time)
37+
ev := v[1].(time.Time)
38+
return i.After(sv) && i.Before(ev)
39+
default:
40+
return false
41+
}
42+
},
43+
}

querybuilder/operator/between_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package operator
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
"time"
7+
)
8+
9+
func TestBetween(t *testing.T) {
10+
sd := time.Date(0001, 1, 1, 9, 0, 0, 0, time.UTC)
11+
ed := time.Date(0001, 1, 1, 10, 0, 0, 0, time.UTC)
12+
13+
var inputs = []struct {
14+
title string
15+
value interface{}
16+
input interface{}
17+
want bool
18+
}{
19+
{title: "double", value: []interface{}{1.5, 10.5}, input: 5.0, want: true},
20+
{title: "double_f", value: []interface{}{1.5, 10.5}, input: 10.6, want: false},
21+
{title: "integer", value: []interface{}{1, 10}, input: 5, want: true},
22+
{title: "integer_f", value: []interface{}{1, 10}, input: 11, want: false},
23+
{title: "time", value: []interface{}{sd, ed}, input: time.Date(0001, 1, 1, 9, 30, 0, 0, time.UTC), want: true},
24+
{title: "time_f", value: []interface{}{sd, ed}, input: time.Date(0001, 1, 1, 10, 30, 0, 0, time.UTC), want: false},
25+
}
26+
27+
for _, input := range inputs {
28+
t.Run(input.title, func(t *testing.T) {
29+
got := Between.Evaluate(input.input, input.value)
30+
rv := reflect.ValueOf(input.value)
31+
if got != input.want {
32+
t.Errorf("%v between %v and %v got: %t, want: %t", input.input, rv.Index(0), rv.Index(1), got, input.want)
33+
}
34+
})
35+
}
36+
}

0 commit comments

Comments
 (0)