github.com/weaviate/weaviate@v1.24.6/entities/filters/filters.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package filters 13 14 import ( 15 "encoding/json" 16 17 "github.com/weaviate/weaviate/entities/models" 18 "github.com/weaviate/weaviate/entities/schema" 19 ) 20 21 type Operator int 22 23 const ( 24 OperatorEqual Operator = iota + 1 25 OperatorNotEqual 26 OperatorGreaterThan 27 OperatorGreaterThanEqual 28 OperatorLessThan 29 OperatorLessThanEqual 30 OperatorAnd 31 OperatorOr 32 OperatorWithinGeoRange 33 OperatorLike 34 OperatorIsNull 35 ContainsAny 36 ContainsAll 37 ) 38 39 func (o Operator) OnValue() bool { 40 switch o { 41 case OperatorEqual, 42 OperatorNotEqual, 43 OperatorGreaterThan, 44 OperatorGreaterThanEqual, 45 OperatorLessThan, 46 OperatorLessThanEqual, 47 OperatorWithinGeoRange, 48 OperatorLike, 49 OperatorIsNull, 50 ContainsAny, 51 ContainsAll: 52 return true 53 default: 54 return false 55 } 56 } 57 58 func (o Operator) Name() string { 59 switch o { 60 case OperatorEqual: 61 return "Equal" 62 case OperatorNotEqual: 63 return "NotEqual" 64 case OperatorGreaterThan: 65 return "GreaterThan" 66 case OperatorGreaterThanEqual: 67 return "GreaterThanEqual" 68 case OperatorLessThan: 69 return "LessThan" 70 case OperatorLessThanEqual: 71 return "LessThanEqual" 72 case OperatorAnd: 73 return "And" 74 case OperatorOr: 75 return "Or" 76 case OperatorWithinGeoRange: 77 return "WithinGeoRange" 78 case OperatorLike: 79 return "Like" 80 case OperatorIsNull: 81 return "IsNull" 82 case ContainsAny: 83 return "ContainsAny" 84 case ContainsAll: 85 return "ContainsAll" 86 default: 87 panic("Unknown operator") 88 } 89 } 90 91 type LocalFilter struct { 92 Root *Clause `json:"root"` 93 } 94 95 type Value struct { 96 Value interface{} `json:"value"` 97 Type schema.DataType `json:"type"` 98 } 99 100 func (v *Value) UnmarshalJSON(data []byte) error { 101 type Alias Value 102 aux := struct { 103 *Alias 104 }{ 105 Alias: (*Alias)(v), 106 } 107 108 err := json.Unmarshal(data, &aux) 109 if err != nil { 110 return err 111 } 112 113 asFloat, ok := v.Value.(float64) 114 if v.Type == schema.DataTypeInt && ok { 115 v.Value = int(asFloat) 116 } 117 118 if v.Type == schema.DataTypeGeoCoordinates { 119 temp := struct { 120 Value GeoRange `json:"value"` 121 }{} 122 123 if err := json.Unmarshal(data, &temp); err != nil { 124 return err 125 } 126 v.Value = temp.Value 127 } 128 129 return nil 130 } 131 132 type Clause struct { 133 Operator Operator `json:"operator"` 134 On *Path `json:"on"` 135 Value *Value `json:"value"` 136 Operands []Clause `json:"operands"` 137 } 138 139 // GeoRange to be used with fields of type GeoCoordinates. Identifies a point 140 // and a maximum distance from that point. 141 type GeoRange struct { 142 *models.GeoCoordinates 143 Distance float32 `json:"distance"` 144 }