-
Notifications
You must be signed in to change notification settings - Fork 11
/
boolean_expr.go
131 lines (108 loc) · 2.82 KB
/
boolean_expr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package be_indexer
import (
"encoding/json"
"fmt"
"github.com/echoface/be_indexer/util"
)
type (
BEField string
// ValueOpt value数值的描述符; 注意这里将其与最终的bool逻辑运算符区分开;
// 描述一个值: >5 代表了所有数值空间中[5, *)所有的值; 结合布尔描述
// 中的Incl/Excl 才构成一个布尔描述; 简而言之它用于描述存在"哪些值"
ValueOpt int
Values interface{}
// BoolValues expression a bool logic like: (in) [15,16,17], (not in) [shanghai,yz]
// 默认opt: ValueOptEQ
// 包含: [5, *) 的布尔描述等同于 "排除: (-*, 5)"
BoolValues struct {
Incl bool `json:"inc"` // include: true exclude: false
Value Values `json:"value"` // values can be parser parse to id
Operator ValueOpt `json:"operator,omitempty"` // value对应数值空间的描述符, 默认: EQ
}
// BooleanExpr expression a bool logic like: age (in) [15,16,17], city (not in) [shanghai,yz]
BooleanExpr struct {
BoolValues
Field BEField `json:"field"`
}
Assignments map[BEField]Values
)
const (
// ValueOptEQ ...数值范围描述符
ValueOptEQ ValueOpt = 0
ValueOptGT ValueOpt = 1
ValueOptLT ValueOpt = 2
ValueOptBetween ValueOpt = 3
)
func (ass Assignments) Size() (size int) {
for _, v := range ass {
if util.NilInterface(v) {
continue
}
size++
}
return size
}
func NewBoolExpr2(field BEField, expr BoolValues) *BooleanExpr {
return &BooleanExpr{expr, field}
}
func NewBoolExpr(field BEField, inc bool, v Values) *BooleanExpr {
expr := &BooleanExpr{
Field: field,
BoolValues: BoolValues{
Value: v,
Incl: inc,
},
}
return expr
}
func NewIntValues(v int, o ...int) Values {
return append([]int{v}, o...)
}
func NewInt32Values(v int32, o ...int32) Values {
return append([]int32{v}, o...)
}
func NewInt64Values(v int64, o ...int64) Values {
return append([]int64{v}, o...)
}
func NewStrValues(v string, ss ...string) Values {
return append([]string{v}, ss...)
}
func NewGTBoolValue(value int64) BoolValues {
return NewBoolValue(ValueOptGT, value, true)
}
func NewLTBoolValue(value int64) BoolValues {
return NewBoolValue(ValueOptLT, value, true)
}
func NewBoolValue(op ValueOpt, value Values, incl bool) BoolValues {
return BoolValues{
Operator: op,
Incl: incl,
Value: value,
}
}
func (v *BoolValues) booleanToken() string {
if v.Incl {
return "in"
}
return "not"
}
func (v *BoolValues) String() string {
return fmt.Sprintf("%s %s%v", v.booleanToken(), v.operatorName(), v.Value)
}
func (v *BoolValues) operatorName() string {
switch v.Operator {
case ValueOptGT:
return ">"
case ValueOptLT:
return "<"
case ValueOptBetween:
return "between"
default:
break
}
return ""
}
func (v *BoolValues) JSONString() string {
data, _ := json.Marshal(v)
return string(data)
}