github.com/movsb/taorm@v0.0.0-20201209183410-91bafb0b22a6/filter/expression.go (about)

     1  package filter
     2  
     3  import (
     4  	"strconv"
     5  )
     6  
     7  // _ExpressionOverrider overrides expression.
     8  type _ExpressionOverrider struct {
     9  	Query string
    10  	Args  []interface{}
    11  }
    12  
    13  // Expression is a filter expression.
    14  // It is expressed as `key op value`.
    15  type Expression struct {
    16  	Name     string      // key name
    17  	Operator Token       // op
    18  	Type     ValueType   // value type
    19  	Value    interface{} // raw value or set value
    20  
    21  	nameChanged bool // is name set by user? if set, use it instead of converting it to column name
    22  
    23  	// It is overrode by the user mapper.
    24  	overrider *_ExpressionOverrider
    25  }
    26  
    27  // SetName sets the name of the expression.
    28  func (e *Expression) SetName(name string) {
    29  	e.Name = name
    30  	e.nameChanged = true
    31  }
    32  
    33  // SetNumber sets the number value of the expression.
    34  // TODO use interface{} to accept all numeric types.
    35  func (e *Expression) SetNumber(num int64) {
    36  	e.Type = ValueTypeNumber
    37  	e.Value = num
    38  }
    39  
    40  // SetString sets the string value of the expression.
    41  func (e *Expression) SetString(str string) {
    42  	e.Type = ValueTypeString
    43  	e.Value = str
    44  }
    45  
    46  // SetBoolean sets the boolean value of the expression.
    47  func (e *Expression) SetBoolean(b bool) {
    48  	e.Type = ValueTypeBoolean
    49  	e.Value = b
    50  }
    51  
    52  // convertTo converts value to the field-specific type.
    53  // If no conversion can be made, an error is returned.
    54  func (e *Expression) convertTo(toType ValueType) error {
    55  	bad := func() error {
    56  		return newBadConversionError(e.Name, e.Value, e.Type, toType)
    57  	}
    58  	switch toType {
    59  	case ValueTypeBoolean:
    60  		switch e.Type {
    61  		case ValueTypeBoolean:
    62  			return nil
    63  		case ValueTypeRaw:
    64  			switch e.Value.(string) {
    65  			case "1", "true":
    66  				e.SetBoolean(true)
    67  				return nil
    68  			case "0", "false":
    69  				e.SetBoolean(false)
    70  				return nil
    71  			}
    72  		}
    73  	case ValueTypeNumber:
    74  		switch e.Type {
    75  		case ValueTypeNumber:
    76  			return nil
    77  		case ValueTypeRaw:
    78  			n, err := strconv.ParseInt(e.Value.(string), 10, 64)
    79  			if err != nil {
    80  				return bad()
    81  			}
    82  			e.SetNumber(n)
    83  			return nil
    84  		}
    85  	case ValueTypeString:
    86  		switch e.Type {
    87  		case ValueTypeString:
    88  			return nil
    89  		case ValueTypeRaw:
    90  			// nothing to do
    91  			return nil
    92  		}
    93  	}
    94  	return bad()
    95  }