diff --git a/pkg/api/server/cel2sql/convert_test.go b/pkg/api/server/cel2sql/convert_test.go index cdc21638f..84c634178 100644 --- a/pkg/api/server/cel2sql/convert_test.go +++ b/pkg/api/server/cel2sql/convert_test.go @@ -74,6 +74,16 @@ func TestConvertRecordExpressions(t *testing.T) { in: `data.metadata.name.contains("foo")`, want: "POSITION('foo' IN (data->'metadata'->>'name')) <> 0", }, + { + name: "not contains string function", + in: `!(data.metadata.annotations.contains("foo"))`, + want: "NOT POSITION('foo' IN (data->'metadata'->>'annotations')) <> 0", + }, + { + name: "complex not expressions", + in: `!(data.metadata.annotations.contains("foo")) && data.metadata.name.endsWith("bar")`, + want: "NOT POSITION('foo' IN (data->'metadata'->>'annotations')) <> 0 AND (data->'metadata'->>'name') LIKE '%' || 'bar'", + }, { name: "endsWith string function", in: `data.metadata.name.endsWith("bar")`, @@ -226,6 +236,11 @@ func TestConvertResultExpressions(t *testing.T) { in: `summary.annotations["branch"] == "main"`, want: `recordsummary_annotations @> '{"branch":"main"}'::jsonb`, }, + { + name: "not Result.Summary.Annotations", + in: `!(summary.annotations["branch"] == "main")`, + want: `NOT recordsummary_annotations @> '{"branch":"main"}'::jsonb`, + }, { name: "Result.Summary.Annotations", in: `"main" == summary.annotations["branch"]`, diff --git a/pkg/api/server/cel2sql/interpreter.go b/pkg/api/server/cel2sql/interpreter.go index ccb5d06a2..a7e884406 100644 --- a/pkg/api/server/cel2sql/interpreter.go +++ b/pkg/api/server/cel2sql/interpreter.go @@ -293,7 +293,6 @@ func (i *interpreter) interpretUnaryCallExpr(expr *exprpb.Expr_Call) error { if err := i.interpretExpr(expr.Args[0]); err != nil { return err } - i.query.WriteString(space) return nil } diff --git a/pkg/api/server/cel2sql/operators.go b/pkg/api/server/cel2sql/operators.go index 4d7b1dbe9..d52dbdb86 100644 --- a/pkg/api/server/cel2sql/operators.go +++ b/pkg/api/server/cel2sql/operators.go @@ -20,13 +20,12 @@ import ( var ( unaryOperators = map[string]string{ - operators.Negate: "NOT", + operators.LogicalNot: "NOT", } binaryOperators = map[string]string{ operators.LogicalAnd: "AND", operators.LogicalOr: "OR", - operators.LogicalNot: "NOT", operators.Equals: "=", operators.NotEquals: "<>", operators.Less: "<",