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 }