package orm import ( "fmt" "strings" ) const ( ExprSep = "__" ) type condValue struct { exprs []string args []interface{} cond *Condition isOr bool isNot bool isCond bool } type Condition struct { params []condValue } func NewCondition() *Condition { c := &Condition{} return c } func (c Condition) And(expr string, args ...interface{}) *Condition { if expr == "" || len(args) == 0 { panic(fmt.Errorf(" args cannot empty")) } c.params = append(c.params, condValue{exprs: strings.Split(expr, ExprSep), args: args}) return &c } func (c Condition) AndNot(expr string, args ...interface{}) *Condition { if expr == "" || len(args) == 0 { panic(fmt.Errorf(" args cannot empty")) } c.params = append(c.params, condValue{exprs: strings.Split(expr, ExprSep), args: args, isNot: true}) return &c } func (c *Condition) AndCond(cond *Condition) *Condition { c = c.clone() if c == cond { panic(fmt.Errorf(" cannot use self as sub cond")) } if cond != nil { c.params = append(c.params, condValue{cond: cond, isCond: true}) } return c } func (c Condition) Or(expr string, args ...interface{}) *Condition { if expr == "" || len(args) == 0 { panic(fmt.Errorf(" args cannot empty")) } c.params = append(c.params, condValue{exprs: strings.Split(expr, ExprSep), args: args, isOr: true}) return &c } func (c Condition) OrNot(expr string, args ...interface{}) *Condition { if expr == "" || len(args) == 0 { panic(fmt.Errorf(" args cannot empty")) } c.params = append(c.params, condValue{exprs: strings.Split(expr, ExprSep), args: args, isNot: true, isOr: true}) return &c } func (c *Condition) OrCond(cond *Condition) *Condition { c = c.clone() if c == cond { panic(fmt.Errorf(" cannot use self as sub cond")) } if cond != nil { c.params = append(c.params, condValue{cond: cond, isCond: true, isOr: true}) } return c } func (c *Condition) IsEmpty() bool { return len(c.params) == 0 } func (c Condition) clone() *Condition { return &c }