Skip to content

Commit 5e76d88

Browse files
committed
RHINENG-21424: handle null/notnull filters
1 parent bc1b214 commit 5e76d88

1 file changed

Lines changed: 21 additions & 13 deletions

File tree

manager/controllers/filter.go

Lines changed: 21 additions & 13 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,43 @@ 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) {
133-
if fieldName != "advisory_type_name" {
134-
return originalValues, originalOperator
130+
func (t *FilterData) transformParams(fieldName string) (operator string, values []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"}
135134
}
135+
if fieldName == "advisory_type_name" {
136+
return t.transformAdvisoryTypeParams()
137+
}
138+
// no change
139+
return t.Operator, t.Values
140+
}
136141

137-
transformedValues = make([]string, 0, len(originalValues))
138-
for _, originalValue := range originalValues {
142+
func (t *FilterData) transformAdvisoryTypeParams() (
143+
// expand "other" in advisory_type filter into list of what we mean by other
144+
transformedOperator string, transformedValues []string) {
145+
transformedValues = make([]string, 0, len(t.Values))
146+
for _, originalValue := range t.Values {
139147
if originalValue == "other" {
140148
transformedValues = append(transformedValues, database.OtherAdvisoryTypes...)
141149
} else {
142150
transformedValues = append(transformedValues, originalValue)
143151
}
144152
}
145153

146-
if len(transformedValues) == len(originalValues) {
147-
return originalValues, originalOperator
154+
if len(transformedValues) == len(t.Values) {
155+
return t.Operator, t.Values
148156
}
149157

150-
switch originalOperator {
158+
switch t.Operator {
151159
case OpEq:
152160
transformedOperator = OpIn
153161
case OpNeq:
154162
transformedOperator = OpNotIn
155163
default:
156-
transformedOperator = originalOperator
164+
transformedOperator = t.Operator
157165
}
158-
return transformedValues, transformedOperator
166+
return transformedOperator, transformedValues
159167
}
160168

161169
func (t Filters) ToQueryParams() string {

0 commit comments

Comments
 (0)