Skip to content

Commit b5db926

Browse files
committed
add less operator
1 parent ea55326 commit b5db926

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

querybuilder/operator/less.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package operator
2+
3+
import "time"
4+
5+
func init() {
6+
AddOperator(Less)
7+
}
8+
9+
var Less = &Operator{
10+
Name: "less",
11+
Evaluate: func(input, value interface{}) bool {
12+
if input == nil {
13+
return false
14+
}
15+
16+
switch value.(type) {
17+
case float64:
18+
return input.(float64) < value.(float64)
19+
case int:
20+
return input.(int) < value.(int)
21+
case string:
22+
return len(input.(string)) < len(value.(string))
23+
case time.Time:
24+
i := input.(time.Time)
25+
v := value.(time.Time)
26+
return i.Before(v)
27+
default:
28+
return false
29+
}
30+
},
31+
}

querybuilder/operator/less_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package operator
2+
3+
import (
4+
"testing"
5+
"time"
6+
)
7+
8+
func TestLess(t *testing.T) {
9+
vdate := time.Date(2000, 1, 1, 15, 0, 0, 0, time.UTC)
10+
11+
var inputs = []struct {
12+
title string
13+
value interface{}
14+
input interface{}
15+
want bool
16+
}{
17+
{title: "nil", input: nil, value: 3, want: false},
18+
{title: "int =", input: 3, value: 3, want: false},
19+
{title: "int <", input: 2, value: 3, want: true},
20+
{title: "int >", input: 4, value: 3, want: false},
21+
{title: "float =", input: float64(2.4), value: float64(2.4), want: false},
22+
{title: "float <", input: float64(2.4), value: float64(2.5), want: true},
23+
{title: "float >", input: float64(2.4), value: float64(1.4), want: false},
24+
{title: "string =", input: "string", value: "string", want: false},
25+
{title: "string <", input: "string", value: "mystring", want: true},
26+
{title: "string >", input: "mystring", value: "string", want: false},
27+
{title: "date =", input: time.Date(2000, 1, 1, 15, 0, 0, 0, time.UTC), value: vdate, want: false},
28+
{title: "date <", input: time.Date(2000, 1, 1, 14, 59, 0, 0, time.UTC), value: vdate, want: true},
29+
{title: "date >", input: time.Date(2000, 1, 1, 15, 1, 0, 0, time.UTC), value: vdate, want: false},
30+
}
31+
32+
for _, input := range inputs {
33+
t.Run(input.title, func(t *testing.T) {
34+
got := Less.Evaluate(input.input, input.value)
35+
if got != input.want {
36+
t.Errorf("%v less %v got: %t, want: %t", input.input, input.value, got, input.want)
37+
}
38+
})
39+
}
40+
}

0 commit comments

Comments
 (0)