Skip to content

Commit 9ab894b

Browse files
committed
RHINENG-21424: handle null/notnull filters
1 parent 5a21949 commit 9ab894b

1 file changed

Lines changed: 18 additions & 14 deletions

File tree

manager/controllers/filter.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ 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)
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

161165
func (t Filters) ToQueryParams() string {

0 commit comments

Comments
 (0)