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