From 70c23bb1e754b5b8d5c60e9cd8ba964adb49f572 Mon Sep 17 00:00:00 2001 From: Guido Spadotto Date: Mon, 5 Feb 2024 22:52:21 +0100 Subject: [PATCH] Redis State Store query: numeric operators do not work correctly on large numbers (#3334) Signed-off-by: Guido Spadotto Signed-off-by: Guido Spadotto Co-authored-by: Guido Spadotto --- state/redis/redis_query.go | 24 ++++++++++++++++++------ state/redis/redis_query_test.go | 8 ++++---- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/state/redis/redis_query.go b/state/redis/redis_query.go index 15aca0c3b0..7647cb9ed0 100644 --- a/state/redis/redis_query.go +++ b/state/redis/redis_query.go @@ -61,8 +61,10 @@ func (q *Query) VisitEQ(f *query.EQ) (string, error) { switch v := f.Val.(type) { case string: return fmt.Sprintf("@%s:(%s)", alias, v), nil + case float64, float32: + return fmt.Sprintf("@%s:[%f %f]", alias, v, v), nil default: - return fmt.Sprintf("@%s:[%v %v]", alias, v, v), nil + return fmt.Sprintf("@%s:[%d %d]", alias, v, v), nil } } @@ -77,8 +79,10 @@ func (q *Query) VisitNEQ(f *query.NEQ) (string, error) { switch v := f.Val.(type) { case string: return fmt.Sprintf("@%s:(%s)", alias, v), nil + case float64, float32: + return fmt.Sprintf("@%s:[%f %f]", alias, v, v), nil default: - return fmt.Sprintf("@%s:[%v %v]", alias, v, v), nil + return fmt.Sprintf("@%s:[%d %d]", alias, v, v), nil } } @@ -92,8 +96,10 @@ func (q *Query) VisitGT(f *query.GT) (string, error) { switch v := f.Val.(type) { case string: return "", fmt.Errorf("unsupported type of value %s; string type not permitted", f.Val) + case float64, float32: + return fmt.Sprintf("@%s:[(%f +inf]", alias, v), nil default: - return fmt.Sprintf("@%s:[(%v +inf]", alias, v), nil + return fmt.Sprintf("@%s:[(%d +inf]", alias, v), nil } } @@ -107,8 +113,10 @@ func (q *Query) VisitGTE(f *query.GTE) (string, error) { switch v := f.Val.(type) { case string: return "", fmt.Errorf("unsupported type of value %s; string type not permitted", f.Val) + case float64, float32: + return fmt.Sprintf("@%s:[%f +inf]", alias, v), nil default: - return fmt.Sprintf("@%s:[%v +inf]", alias, v), nil + return fmt.Sprintf("@%s:[%d +inf]", alias, v), nil } } @@ -122,8 +130,10 @@ func (q *Query) VisitLT(f *query.LT) (string, error) { switch v := f.Val.(type) { case string: return "", fmt.Errorf("unsupported type of value %s; string type not permitted", f.Val) + case float64, float32: + return fmt.Sprintf("@%s:[-inf (%f]", alias, v), nil default: - return fmt.Sprintf("@%s:[-inf (%v]", alias, v), nil + return fmt.Sprintf("@%s:[-inf (%d]", alias, v), nil } } @@ -136,8 +146,10 @@ func (q *Query) VisitLTE(f *query.LTE) (string, error) { switch v := f.Val.(type) { case string: return "", fmt.Errorf("unsupported type of value %s; string type not permitted", f.Val) + case float64, float32: + return fmt.Sprintf("@%s:[-inf %f]", alias, v), nil default: - return fmt.Sprintf("@%s:[-inf %v]", alias, v), nil + return fmt.Sprintf("@%s:[-inf %d]", alias, v), nil } } diff --git a/state/redis/redis_query_test.go b/state/redis/redis_query_test.go index baec62bbf3..93a58b2bd1 100644 --- a/state/redis/redis_query_test.go +++ b/state/redis/redis_query_test.go @@ -24,7 +24,7 @@ import ( "github.com/dapr/components-contrib/state/query" ) -func TestMongoQuery(t *testing.T) { +func TestRedisQuery(t *testing.T) { tests := []struct { input string query []interface{} @@ -44,15 +44,15 @@ func TestMongoQuery(t *testing.T) { }, { input: "../../tests/state/query/q6.json", - query: []interface{}{"((@id:[123 123])|((@org:(B)) (((@id:[567 567])|(@id:[890 890])))))", "SORTBY", "id", "LIMIT", "0", "2"}, + query: []interface{}{"((@id:[123.000000 123.000000])|((@org:(B)) (((@id:[567.000000 567.000000])|(@id:[890.000000 890.000000])))))", "SORTBY", "id", "LIMIT", "0", "2"}, }, { input: "../../tests/state/query/q6-notequal.json", - query: []interface{}{"((@id:[123 123])|(-(@org:(B)) (((@id:[567 567])|(@id:[890 890])))))", "SORTBY", "id", "LIMIT", "0", "2"}, + query: []interface{}{"((@id:[123.000000 123.000000])|(-(@org:(B)) (((@id:[567.000000 567.000000])|(@id:[890.000000 890.000000])))))", "SORTBY", "id", "LIMIT", "0", "2"}, }, { input: "../../tests/state/query/q7.json", - query: []interface{}{"((@id:[-inf (123])|((@org:[2 +inf]) (((@id:[567 567])|(@id:[890 890])))))", "SORTBY", "id", "LIMIT", "0", "2"}, + query: []interface{}{"((@id:[-inf (123.000000])|((@org:[2.000000 +inf]) (((@id:[567.000000 567.000000])|(@id:[890.000000 890.000000])))))", "SORTBY", "id", "LIMIT", "0", "2"}, }, } for _, test := range tests {