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  }