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  }