diff --git a/pkg/datastore/filedb/filter.go b/pkg/datastore/filedb/filter.go index 56b1605d7a..7228c2a7a8 100644 --- a/pkg/datastore/filedb/filter.go +++ b/pkg/datastore/filedb/filter.go @@ -75,7 +75,12 @@ func filter(col datastore.Collection, e interface{}, filters []datastore.ListFil return false, nil } - cmp, err := compare(val, filter.Value, filter.Operator) + operand, err := normalizeFieldValue(filter.Value) + if err != nil { + return false, err + } + + cmp, err := compare(val, operand, filter.Operator) if err != nil { return false, err } @@ -220,3 +225,33 @@ func normalizeFieldName(key string) string { } return strings.ToLower(string(key[0])) + key[1:] } + +// normalizeFieldValue converts value of any type to the primitive type +// Note: Find a better way to handle this instead of marshal/unmarshal. +func normalizeFieldValue(val interface{}) (interface{}, error) { + var needConvert = false + switch val.(type) { + case int, int8, int16, int32, int64: + case uint, uint8, uint16, uint32: + case float32, float64: + case string: + case bool: + default: + needConvert = true + } + + if !needConvert { + return val, nil + } + + raw, err := json.Marshal(val) + if err != nil { + return nil, err + } + + var out interface{} + if err = json.Unmarshal(raw, &out); err != nil { + return nil, err + } + return out, nil +} diff --git a/pkg/datastore/filedb/filter_test.go b/pkg/datastore/filedb/filter_test.go index da8ea5da9b..bcc4b22d8b 100644 --- a/pkg/datastore/filedb/filter_test.go +++ b/pkg/datastore/filedb/filter_test.go @@ -243,7 +243,7 @@ func TestFilter(t *testing.T) { { Field: "Kind", Operator: datastore.OperatorEqual, - Value: 0, + Value: model.ApplicationKind_KUBERNETES, }, }, expect: true, @@ -316,6 +316,30 @@ func TestFilter(t *testing.T) { }, expect: true, }, + { + name: "filter with IN operator - passed", + entity: &model.Deployment{Status: model.DeploymentStatus_DEPLOYMENT_PENDING}, + filters: []datastore.ListFilter{ + { + Field: "Status", + Operator: datastore.OperatorIn, + Value: model.GetNotCompletedDeploymentStatuses(), + }, + }, + expect: true, + }, + { + name: "filter with IN operator - not passed", + entity: &model.Deployment{Status: model.DeploymentStatus_DEPLOYMENT_CANCELLED}, + filters: []datastore.ListFilter{ + { + Field: "Status", + Operator: datastore.OperatorIn, + Value: model.GetNotCompletedDeploymentStatuses(), + }, + }, + expect: false, + }, } for _, tc := range testcases {