@@ -79,8 +79,8 @@ func checkValueCount(operator string, nValues int) bool {
7979// Convert a single filter to where clauses
8080func (t * FilterData ) ToWhere (fieldName string , attributes database.AttrMap ) (string , []any , error ) {
8181 var err error
82- transformedValues , transformedOperator := transformFilterParams ( fieldName , t . Values , t . Operator )
83- var values = make ([]interface {} , len (transformedValues ))
82+ transformedOperator , transformedValues := t . transformParams ( fieldName )
83+ var values = make ([]any , len (transformedValues ))
8484 for i , v := range transformedValues {
8585 fieldInfo , found := attributes [fieldName ]
8686 if ! found {
@@ -123,39 +123,43 @@ func (t *FilterData) ToWhere(fieldName string, attributes database.AttrMap) (str
123123 case OpNotNull :
124124 return fmt .Sprintf ("%s IS NOT NULL " , attributes [fieldName ].DataQuery ), []any {}, nil
125125 default :
126- return "" , []interface {} {}, errors .Errorf ("Unknown filter : %s" , t .Operator )
126+ return "" , []any {}, errors .Errorf ("Unknown filter : %s" , t .Operator )
127127 }
128128}
129129
130- // transformFilterParams Allow exceptions in ToWhere values usage (e.g. "other").
131- func transformFilterParams (fieldName string , originalValues []string , originalOperator string ) (
132- transformedValues []string , transformedOperator string ) {
130+ func (t * FilterData ) transformParams (fieldName string ) (transformedOperator string , transformedValues []string ) {
131+ if len (t .Values ) == 1 && (t .Values [0 ] == "null" || t .Values [0 ] == "notnull" ) {
132+ // handle special cases filter=null and filter=notnull
133+ return t .Values [0 ], []string {"0" }
134+ }
133135 if fieldName != "advisory_type_name" {
134- return originalValues , originalOperator
136+ // no change
137+ return t .Operator , t .Values
135138 }
136139
137- transformedValues = make ([]string , 0 , len (originalValues ))
138- for _ , originalValue := range originalValues {
140+ // special case, in advisory_type_name filter expand "other" into list of what we mean by other
141+ transformedValues = make ([]string , 0 , len (t .Values ))
142+ for _ , originalValue := range t .Values {
139143 if originalValue == "other" {
140144 transformedValues = append (transformedValues , database .OtherAdvisoryTypes ... )
141145 } else {
142146 transformedValues = append (transformedValues , originalValue )
143147 }
144148 }
145149
146- if len (transformedValues ) == len (originalValues ) {
147- return originalValues , originalOperator
150+ if len (transformedValues ) == len (t . Values ) {
151+ return t . Operator , t . Values
148152 }
149153
150- switch originalOperator {
154+ switch t . Operator {
151155 case OpEq :
152156 transformedOperator = OpIn
153157 case OpNeq :
154158 transformedOperator = OpNotIn
155159 default :
156- transformedOperator = originalOperator
160+ transformedOperator = t . Operator
157161 }
158- return transformedValues , transformedOperator
162+ return transformedOperator , transformedValues
159163}
160164
161165func (t Filters ) ToQueryParams () string {
0 commit comments