mirror of
https://github.com/rancher/norman.git
synced 2025-09-18 08:14:56 +00:00
More initial dev
This commit is contained in:
108
types/condition.go
Normal file
108
types/condition.go
Normal file
@@ -0,0 +1,108 @@
|
||||
package types
|
||||
|
||||
var (
|
||||
COND_EQ = QueryConditionType{"eq", 1}
|
||||
COND_NE = QueryConditionType{"ne", 1}
|
||||
COND_NULL = QueryConditionType{"null", 0}
|
||||
COND_NOTNULL = QueryConditionType{"notnull", 0}
|
||||
COND_IN = QueryConditionType{"in", -1}
|
||||
COND_NOTIN = QueryConditionType{"notin", -1}
|
||||
COND_OR = QueryConditionType{"or", 1}
|
||||
COND_AND = QueryConditionType{"and", 1}
|
||||
|
||||
mods = map[string]QueryConditionType{
|
||||
COND_EQ.Name: COND_EQ,
|
||||
COND_NE.Name: COND_NE,
|
||||
COND_NULL.Name: COND_NULL,
|
||||
COND_NOTNULL.Name: COND_NOTNULL,
|
||||
COND_IN.Name: COND_IN,
|
||||
COND_NOTIN.Name: COND_NOTIN,
|
||||
COND_OR.Name: COND_OR,
|
||||
COND_AND.Name: COND_AND,
|
||||
}
|
||||
)
|
||||
|
||||
type QueryConditionType struct {
|
||||
Name string
|
||||
Args int
|
||||
}
|
||||
|
||||
type QueryCondition struct {
|
||||
Field string
|
||||
Values []interface{}
|
||||
conditionType QueryConditionType
|
||||
left, right *QueryCondition
|
||||
}
|
||||
|
||||
func (q *QueryCondition) ToCondition() Condition {
|
||||
cond := Condition{
|
||||
Modifier: q.conditionType.Name,
|
||||
}
|
||||
if q.conditionType.Args == 1 && len(q.Values) > 0 {
|
||||
cond.Value = q.Values[0]
|
||||
} else if q.conditionType.Args == -1 {
|
||||
cond.Value = q.Values
|
||||
}
|
||||
|
||||
return cond
|
||||
}
|
||||
|
||||
func ValidMod(mod string) bool {
|
||||
_, ok := mods[mod]
|
||||
return ok
|
||||
}
|
||||
|
||||
func NewConditionFromString(field, mod string, values ...interface{}) *QueryCondition {
|
||||
return &QueryCondition{
|
||||
Field: field,
|
||||
Values: values,
|
||||
conditionType: mods[mod],
|
||||
}
|
||||
}
|
||||
|
||||
func NewCondition(mod QueryConditionType, values ...interface{}) *QueryCondition {
|
||||
return &QueryCondition{
|
||||
Values: values,
|
||||
conditionType: mod,
|
||||
}
|
||||
}
|
||||
|
||||
func NE(value interface{}) *QueryCondition {
|
||||
return NewCondition(COND_NE, value)
|
||||
}
|
||||
|
||||
func EQ(value interface{}) *QueryCondition {
|
||||
return NewCondition(COND_EQ, value)
|
||||
}
|
||||
|
||||
func NULL(value interface{}) *QueryCondition {
|
||||
return NewCondition(COND_NULL)
|
||||
}
|
||||
|
||||
func NOTNULL(value interface{}) *QueryCondition {
|
||||
return NewCondition(COND_NOTNULL)
|
||||
}
|
||||
|
||||
func IN(values ...interface{}) *QueryCondition {
|
||||
return NewCondition(COND_IN, values...)
|
||||
}
|
||||
|
||||
func NOTIN(values ...interface{}) *QueryCondition {
|
||||
return NewCondition(COND_NOTIN, values...)
|
||||
}
|
||||
|
||||
func (c *QueryCondition) AND(right *QueryCondition) *QueryCondition {
|
||||
return &QueryCondition{
|
||||
conditionType: COND_AND,
|
||||
left: c,
|
||||
right: right,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *QueryCondition) OR(right *QueryCondition) *QueryCondition {
|
||||
return &QueryCondition{
|
||||
conditionType: COND_OR,
|
||||
left: c,
|
||||
right: right,
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user