github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/go-xorm/builder/cond_or.go (about) 1 package builder 2 3 import "fmt" 4 5 type condOr []Cond 6 7 var _ Cond = condOr{} 8 9 func Or(conds ...Cond) Cond { 10 var result = make(condOr, 0, len(conds)) 11 for _, cond := range conds { 12 if cond == nil || !cond.IsValid() { 13 continue 14 } 15 result = append(result, cond) 16 } 17 return result 18 } 19 20 func (or condOr) WriteTo(w Writer) error { 21 for i, cond := range or { 22 var needQuote bool 23 switch cond.(type) { 24 case condAnd: 25 needQuote = true 26 case Eq: 27 needQuote = (len(cond.(Eq)) > 1) 28 } 29 30 if needQuote { 31 fmt.Fprint(w, "(") 32 } 33 34 err := cond.WriteTo(w) 35 if err != nil { 36 return err 37 } 38 39 if needQuote { 40 fmt.Fprint(w, ")") 41 } 42 43 if i != len(or)-1 { 44 fmt.Fprint(w, " OR ") 45 } 46 } 47 48 return nil 49 } 50 51 func (o condOr) And(conds ...Cond) Cond { 52 return And(o, And(conds...)) 53 } 54 55 func (o condOr) Or(conds ...Cond) Cond { 56 return Or(o, Or(conds...)) 57 } 58 59 func (o condOr) IsValid() bool { 60 return len(o) > 0 61 }