github.com/yongjacky/phoenix-go-orm-builder@v0.3.5/cond_eq.go (about) 1 // Copyright 2016 The Xorm Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package builder 6 7 import ( 8 "fmt" 9 "sort" 10 ) 11 12 // Incr implements a type used by Eq 13 type Incr int 14 15 // Decr implements a type used by Eq 16 type Decr int 17 18 // Eq defines equals conditions 19 type Eq map[string]interface{} 20 21 var _ Cond = Eq{} 22 23 // OpWriteTo writes conditions with special operator 24 func (eq Eq) OpWriteTo(op string, w Writer) error { 25 var i = 0 26 for _, k := range eq.sortedKeys() { 27 v := eq[k] 28 switch v.(type) { 29 case []int, []int64, []string, []int32, []int16, []int8, []uint, []uint64, []uint32, []uint16, []interface{}: 30 if err := In(k, v).WriteTo(w); err != nil { 31 return err 32 } 33 case expr: 34 if _, err := fmt.Fprintf(w, "%s=(", k); err != nil { 35 return err 36 } 37 38 if err := v.(expr).WriteTo(w); err != nil { 39 return err 40 } 41 42 if _, err := fmt.Fprintf(w, ")"); err != nil { 43 return err 44 } 45 case *Builder: 46 if _, err := fmt.Fprintf(w, "%s=(", k); err != nil { 47 return err 48 } 49 50 if err := v.(*Builder).WriteTo(w); err != nil { 51 return err 52 } 53 54 if _, err := fmt.Fprintf(w, ")"); err != nil { 55 return err 56 } 57 case Incr: 58 if _, err := fmt.Fprintf(w, "%s=%s+?", k, k); err != nil { 59 return err 60 } 61 w.Append(int(v.(Incr))) 62 case Decr: 63 if _, err := fmt.Fprintf(w, "%s=%s-?", k, k); err != nil { 64 return err 65 } 66 w.Append(int(v.(Decr))) 67 case nil: 68 if _, err := fmt.Fprintf(w, "%s=null", k); err != nil { 69 return err 70 } 71 default: 72 if _, err := fmt.Fprintf(w, "%s=?", k); err != nil { 73 return err 74 } 75 w.Append(v) 76 } 77 if i != len(eq)-1 { 78 if _, err := fmt.Fprint(w, op); err != nil { 79 return err 80 } 81 } 82 i = i + 1 83 } 84 return nil 85 } 86 87 // WriteTo writes SQL to Writer 88 func (eq Eq) WriteTo(w Writer) error { 89 return eq.OpWriteTo(" AND ", w) 90 } 91 92 // And implements And with other conditions 93 func (eq Eq) And(conds ...Cond) Cond { 94 return And(eq, And(conds...)) 95 } 96 97 // Or implements Or with other conditions 98 func (eq Eq) Or(conds ...Cond) Cond { 99 return Or(eq, Or(conds...)) 100 } 101 102 // IsValid tests if this Eq is valid 103 func (eq Eq) IsValid() bool { 104 return len(eq) > 0 105 } 106 107 // sortedKeys returns all keys of this Eq sorted with sort.Strings. 108 // It is used internally for consistent ordering when generating 109 // SQL, see https://gitea.com/xorm/builder/issues/10 110 func (eq Eq) sortedKeys() []string { 111 keys := make([]string, 0, len(eq)) 112 for key := range eq { 113 keys = append(keys, key) 114 } 115 sort.Strings(keys) 116 return keys 117 }