github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/go-xorm/builder/cond_in.go (about) 1 package builder 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 type condIn struct { 9 col string 10 vals []interface{} 11 } 12 13 var _ Cond = condIn{} 14 15 func In(col string, values ...interface{}) Cond { 16 return condIn{col, values} 17 } 18 19 func (condIn condIn) WriteTo(w Writer) error { 20 if len(condIn.vals) <= 0 { 21 return ErrNoInConditions 22 } 23 24 switch condIn.vals[0].(type) { 25 case []int8: 26 vals := condIn.vals[0].([]int8) 27 if len(vals) <= 0 { 28 return ErrNoInConditions 29 } 30 questionMark := strings.Repeat("?,", len(vals)) 31 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 32 return err 33 } 34 for _, val := range vals { 35 w.Append(val) 36 } 37 case []int16: 38 vals := condIn.vals[0].([]int16) 39 if len(vals) <= 0 { 40 return ErrNoInConditions 41 } 42 questionMark := strings.Repeat("?,", len(vals)) 43 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 44 return err 45 } 46 for _, val := range vals { 47 w.Append(val) 48 } 49 case []int: 50 vals := condIn.vals[0].([]int) 51 if len(vals) <= 0 { 52 return ErrNoInConditions 53 } 54 questionMark := strings.Repeat("?,", len(vals)) 55 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 56 return err 57 } 58 for _, val := range vals { 59 w.Append(val) 60 } 61 case []int32: 62 vals := condIn.vals[0].([]int32) 63 if len(vals) <= 0 { 64 return ErrNoInConditions 65 } 66 questionMark := strings.Repeat("?,", len(vals)) 67 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 68 return err 69 } 70 for _, val := range vals { 71 w.Append(val) 72 } 73 case []int64: 74 vals := condIn.vals[0].([]int64) 75 if len(vals) <= 0 { 76 return ErrNoInConditions 77 } 78 questionMark := strings.Repeat("?,", len(vals)) 79 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 80 return err 81 } 82 for _, val := range vals { 83 w.Append(val) 84 } 85 case []uint8: 86 vals := condIn.vals[0].([]uint8) 87 if len(vals) <= 0 { 88 return ErrNoInConditions 89 } 90 questionMark := strings.Repeat("?,", len(vals)) 91 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 92 return err 93 } 94 for _, val := range vals { 95 w.Append(val) 96 } 97 case []uint16: 98 vals := condIn.vals[0].([]uint16) 99 if len(vals) <= 0 { 100 return ErrNoInConditions 101 } 102 questionMark := strings.Repeat("?,", len(vals)) 103 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 104 return err 105 } 106 for _, val := range vals { 107 w.Append(val) 108 } 109 case []uint: 110 vals := condIn.vals[0].([]uint) 111 if len(vals) <= 0 { 112 return ErrNoInConditions 113 } 114 questionMark := strings.Repeat("?,", len(vals)) 115 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 116 return err 117 } 118 for _, val := range vals { 119 w.Append(val) 120 } 121 case []uint32: 122 vals := condIn.vals[0].([]uint32) 123 if len(vals) <= 0 { 124 return ErrNoInConditions 125 } 126 questionMark := strings.Repeat("?,", len(vals)) 127 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 128 return err 129 } 130 for _, val := range vals { 131 w.Append(val) 132 } 133 case []uint64: 134 vals := condIn.vals[0].([]uint64) 135 if len(vals) <= 0 { 136 return ErrNoInConditions 137 } 138 questionMark := strings.Repeat("?,", len(vals)) 139 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 140 return err 141 } 142 for _, val := range vals { 143 w.Append(val) 144 } 145 case []string: 146 vals := condIn.vals[0].([]string) 147 if len(vals) <= 0 { 148 return ErrNoInConditions 149 } 150 questionMark := strings.Repeat("?,", len(vals)) 151 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 152 return err 153 } 154 for _, val := range vals { 155 w.Append(val) 156 } 157 case []interface{}: 158 vals := condIn.vals[0].([]interface{}) 159 if len(vals) <= 0 { 160 return ErrNoInConditions 161 } 162 questionMark := strings.Repeat("?,", len(vals)) 163 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 164 return err 165 } 166 w.Append(vals...) 167 case expr: 168 val := condIn.vals[0].(expr) 169 if _, err := fmt.Fprintf(w, "%s IN (", condIn.col); err != nil { 170 return err 171 } 172 if err := val.WriteTo(w); err != nil { 173 return err 174 } 175 if _, err := fmt.Fprintf(w, ")"); err != nil { 176 return err 177 } 178 case *Builder: 179 bd := condIn.vals[0].(*Builder) 180 if _, err := fmt.Fprintf(w, "%s IN (", condIn.col); err != nil { 181 return err 182 } 183 if err := bd.WriteTo(w); err != nil { 184 return err 185 } 186 if _, err := fmt.Fprintf(w, ")"); err != nil { 187 return err 188 } 189 default: 190 if len(condIn.vals) <= 0 { 191 return ErrNoInConditions 192 } 193 questionMark := strings.Repeat("?,", len(condIn.vals)) 194 if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { 195 return err 196 } 197 w.Append(condIn.vals...) 198 } 199 return nil 200 } 201 202 func (condIn condIn) And(conds ...Cond) Cond { 203 return And(condIn, And(conds...)) 204 } 205 206 func (condIn condIn) Or(conds ...Cond) Cond { 207 return Or(condIn, Or(conds...)) 208 } 209 210 func (condIn condIn) IsValid() bool { 211 return len(condIn.col) > 0 && len(condIn.vals) > 0 212 }