diff --git a/runtime/metricsview/metricssql/filter_parser.go b/runtime/metricsview/metricssql/filter_parser.go index c5cb4d53f6b..fe61cd75f5c 100644 --- a/runtime/metricsview/metricssql/filter_parser.go +++ b/runtime/metricsview/metricssql/filter_parser.go @@ -392,19 +392,26 @@ func parseBetween(ctx context.Context, n *ast.BetweenExpr, q *query) (*metricsvi if err != nil { return nil, err } + + // NOT BETWEEN is the negation of BETWEEN: (expr < left OR expr > right) + outerOp, leftOp, rightOp := metricsview.OperatorAnd, metricsview.OperatorGte, metricsview.OperatorLte + if n.Not { + outerOp, leftOp, rightOp = metricsview.OperatorOr, metricsview.OperatorLt, metricsview.OperatorGt + } + return &metricsview.Expression{ Condition: &metricsview.Condition{ - Operator: metricsview.OperatorAnd, + Operator: outerOp, Expressions: []*metricsview.Expression{ { Condition: &metricsview.Condition{ - Operator: metricsview.OperatorGte, + Operator: leftOp, Expressions: []*metricsview.Expression{expr, left}, }, }, { Condition: &metricsview.Condition{ - Operator: metricsview.OperatorLte, + Operator: rightOp, Expressions: []*metricsview.Expression{expr, right}, }, }, diff --git a/runtime/metricsview/metricssql/filter_parser_test.go b/runtime/metricsview/metricssql/filter_parser_test.go index 64d09b86379..6d5914991b4 100644 --- a/runtime/metricsview/metricssql/filter_parser_test.go +++ b/runtime/metricsview/metricssql/filter_parser_test.go @@ -190,6 +190,82 @@ func TestParseFilter(t *testing.T) { }, false, }, + { + "between expression", + "x BETWEEN 1 AND 10", + &metricsview.Expression{ + Condition: &metricsview.Condition{ + Operator: metricsview.OperatorAnd, + Expressions: []*metricsview.Expression{ + { + Condition: &metricsview.Condition{ + Operator: metricsview.OperatorGte, + Expressions: []*metricsview.Expression{ + { + Name: "x", + }, + { + Value: 1, + }, + }, + }, + }, + { + Condition: &metricsview.Condition{ + Operator: metricsview.OperatorLte, + Expressions: []*metricsview.Expression{ + { + Name: "x", + }, + { + Value: 10, + }, + }, + }, + }, + }, + }, + }, + false, + }, + { + "not between expression", + "x NOT BETWEEN 1 AND 10", + &metricsview.Expression{ + Condition: &metricsview.Condition{ + Operator: metricsview.OperatorOr, + Expressions: []*metricsview.Expression{ + { + Condition: &metricsview.Condition{ + Operator: metricsview.OperatorLt, + Expressions: []*metricsview.Expression{ + { + Name: "x", + }, + { + Value: 1, + }, + }, + }, + }, + { + Condition: &metricsview.Condition{ + Operator: metricsview.OperatorGt, + Expressions: []*metricsview.Expression{ + { + Name: "x", + }, + { + Value: 10, + }, + }, + }, + }, + }, + }, + }, + false, + }, { "subquery expression with distinct", "dim IN (SELECT DISTINCT dim FROM mv)",