Skip to content

Commit 42c0654

Browse files
committed
RHINENG-21424: handle null/notnull filters
1 parent 25bbf7d commit 42c0654

1 file changed

Lines changed: 17 additions & 12 deletions

File tree

manager/controllers/filter.go

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func checkValueCount(operator string, nValues int) bool {
7979
// Convert a single filter to where clauses
8080
func (t *FilterData) ToWhere(fieldName string, attributes database.AttrMap) (string, []any, error) {
8181
var err error
82-
transformedValues, transformedOperator := transformFilterParams(fieldName, t.Values, t.Operator)
82+
transformedOperator, transformedValues := t.transformParams(fieldName)
8383
var values = make([]interface{}, len(transformedValues))
8484
for i, v := range transformedValues {
8585
fieldInfo, found := attributes[fieldName]
@@ -127,35 +127,40 @@ func (t *FilterData) ToWhere(fieldName string, attributes database.AttrMap) (str
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) (
131+
transformedOperator string, transformedValues []string) {
132+
if len(t.Values) == 1 && (t.Values[0] == "null" || t.Values[0] == "notnull") {
133+
// handle special cases filter=null and filter=notnull
134+
return t.Values[0], []string{"0"}
135+
}
133136
if fieldName != "advisory_type_name" {
134-
return originalValues, originalOperator
137+
// no change
138+
return t.Operator, t.Values
135139
}
136140

137-
transformedValues = make([]string, 0, len(originalValues))
138-
for _, originalValue := range originalValues {
141+
// special case, in advisory_type_name filter expand "other" into list of what we mean by other
142+
transformedValues = make([]string, 0, len(t.Values))
143+
for _, originalValue := range t.Values {
139144
if originalValue == "other" {
140145
transformedValues = append(transformedValues, database.OtherAdvisoryTypes...)
141146
} else {
142147
transformedValues = append(transformedValues, originalValue)
143148
}
144149
}
145150

146-
if len(transformedValues) == len(originalValues) {
147-
return originalValues, originalOperator
151+
if len(transformedValues) == len(t.Values) {
152+
return t.Operator, t.Values
148153
}
149154

150-
switch originalOperator {
155+
switch t.Operator {
151156
case OpEq:
152157
transformedOperator = OpIn
153158
case OpNeq:
154159
transformedOperator = OpNotIn
155160
default:
156-
transformedOperator = originalOperator
161+
transformedOperator = t.Operator
157162
}
158-
return transformedValues, transformedOperator
163+
return transformedOperator, transformedValues
159164
}
160165

161166
func (t Filters) ToQueryParams() string {

0 commit comments

Comments
 (0)