diff --git a/logql/v2/ast.go b/logql/v2/ast.go index f39edec68..d7eaaf251 100644 --- a/logql/v2/ast.go +++ b/logql/v2/ast.go @@ -1039,3 +1039,91 @@ func (v *VectorExpr) String() string { } func (v *VectorExpr) Walk(fn WalkFn) { fn(v) } + +type LogMultiVariantExpr struct { + defaultLogQLExpr //nolint:unused + logRange *LogRangeQueryExpr + variants []LogMetricSampleExpr + Expr +} + +func newLogMultiVariantExpr(variants []LogMetricSampleExpr, logRange LogSelectorExpr) *LogMultiVariantExpr { + rangeExpr, ok := logRange.(*LogRangeQueryExpr) + if !ok { + rangeExpr = nil + } + + return &LogMultiVariantExpr{ + logRange: rangeExpr, + variants: variants, + } +} + +func (e *LogMultiVariantExpr) LogRange() *LogRangeQueryExpr { + return e.logRange +} + +func (e *LogMultiVariantExpr) Matchers() []*labels.Matcher { + if e.logRange != nil { + return e.logRange.Matchers() + } + return nil +} + +func (e *LogMultiVariantExpr) Interval() time.Duration { + if e.logRange == nil { + return 0 + } + + duration, err := parseDuration(e.logRange.rng) + if err != nil { + return 0 + } + return duration +} + +func (e *LogMultiVariantExpr) Variants() []LogMetricSampleExpr { + return e.variants +} + +func (e *LogMultiVariantExpr) AddVariant(v LogMetricSampleExpr) { + e.variants = append(e.variants, v) +} + +func (e *LogMultiVariantExpr) SetVariant(i int, v LogMetricSampleExpr) error { + if i >= len(e.variants) { + return fmt.Errorf("variant index out of range") + } + + e.variants[i] = v + return nil +} + +func (e *LogMultiVariantExpr) Walk(fn WalkFn) { + fn(e) + if e.logRange != nil { + e.logRange.Walk(fn) + } + + for _, v := range e.variants { + v.Walk(fn) + } +} + +func (e *LogMultiVariantExpr) String() string { + var sb strings.Builder + sb.WriteString("variants(") + for i, v := range e.variants { + sb.WriteString(v.String()) + if i+1 != len(e.variants) { + sb.WriteString(", ") + } + } + sb.WriteString(") of (") + sb.WriteString(e.logRange.String()) + sb.WriteString(")") + + return sb.String() +} + +func (e *LogMultiVariantExpr) logQLExpr() {} diff --git a/logql/v2/ast_test.go b/logql/v2/ast_test.go index fd9fd3672..a68f7f1f3 100644 --- a/logql/v2/ast_test.go +++ b/logql/v2/ast_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/prometheus/prometheus/model/labels" + "github.com/stretchr/testify/require" ) func Test_AstWalker_SimpleCountExpr(t *testing.T) { @@ -20,6 +21,12 @@ func Test_AstWalker_SimpleCountExpr(t *testing.T) { }, { input: `{first="value"} |= "baz" |= ip("8.8.8.8")`, total: 2, + }, { + input: `variants(count_over_time({foo="bar"}[5m])) of ({foo="bar"}[5m])`, + total: 8, + }, { + input: `variants(count_over_time({foo="bar"}[5m]), rate({foo="bar"}[5m])) of ({foo="bar"}[5m])`, + total: 12, }, } for _, tc := range tc { @@ -124,10 +131,24 @@ func Test_AstWalker_AppendMatcher(t *testing.T) { input: `(count_over_time({first="value"}[10h]))`, output: `(count_over_time({first="value", second="next"}[10h]))`, }, + // approx_topkk tests { input: `topk(25,(count_over_time({first="value"}[10h])))`, output: `topk(25,(count_over_time({first="value", second="next"}[10h])))`, }, + { + input: `approx_topk(25,(count_over_time({first="value"}[10h])))`, + output: `approx_topk(25,(count_over_time({first="value", second="next"}[10h])))`, + }, + // variant tests + { + input: `variants(count_over_time({job="foo"}[5m])) of ({job="foo"}[5m])`, + output: `variants(count_over_time({job="foo", second="next"}[5m])) of ({job="foo", second="next"}[5m])`, + }, + { + input: `variants(count_over_time({job="foo"}[5m]), bytes_over_time({job="foo"}[5m])) of ({job="foo"}[5m])`, + output: `variants(count_over_time({job="foo", second="next"}[5m]), bytes_over_time({job="foo", second="next"}[5m])) of ({job="foo", second="next"}[5m])`, + }, } for _, tc := range tc { expr, err := ParseExpr(tc.input) @@ -220,3 +241,36 @@ func Test_AstWalker_AppendORMatcher(t *testing.T) { } } } + +func Test_VariantsExpr_String(t *testing.T) { + t.Parallel() + tests := []struct { + expr string + }{ + { + `variants(count_over_time({foo="bar"}[5m])) of ({foo="bar"}[5m])`, + }, + { + `variants(count_over_time({baz="qux", foo=~"bar"}[5m]), bytes_over_time({baz="qux", foo=~"bar"}[5m])) of ({baz="qux", foo=~"bar"} | logfmt | this = "that"[5m])`, + }, + { + `variants(count_over_time({baz="qux", foo!="bar"}[5m]),rate({baz="qux", foo!="bar"}[5m])) of ({baz="qux", foo!="bar"} |= "that" [5m])`, + }, + { + `variants(sum by (app) (count_over_time({baz="qux", foo!="bar"}[5m])),rate({baz="qux", foo!="bar"}[5m])) of ({baz="qux", foo!="bar"} |= "that" [5m])`, + }, + } + + for _, tt := range tests { + t.Run(tt.expr, func(t *testing.T) { + t.Parallel() + expr, err := ParseExpr(tt.expr) + require.NoError(t, err) + + expr2, err := ParseExpr(expr.String()) + require.Nil(t, err) + + require.Equal(t, expr.String(), expr2.String()) + }) + } +} diff --git a/logql/v2/expr.y b/logql/v2/expr.y index 785874ff9..611d28541 100644 --- a/logql/v2/expr.y +++ b/logql/v2/expr.y @@ -23,6 +23,8 @@ import ( LogStageLabels LogLabelList LogParserLabels LogLabelList LogFMTFlags []string + LogMultiVariantExpr *LogMultiVariantExpr + LogMetricExprs []LogMetricSampleExpr Matcher *labels.Matcher Matchers []*labels.Matcher MetricOp string @@ -60,6 +62,8 @@ import ( %type logStageLabels %type logParserLabels %type logFMTFlags +%type logMultiVariantExpr +%type logMetricExprs %type matcher %type matchers %type metricOp @@ -70,11 +74,11 @@ import ( %token IDENTIFIER STRING RANGE NUMBER LOGFMTSTRICT LOGFMTKEEPEMPTY %token DURATION %token MATCHERS LABELS EQ RE NRE OPEN_BRACE CLOSE_BRACE OPEN_BRACKET CLOSE_BRACKET COMMA DOT - OPEN_PARENTHESIS CLOSE_PARENTHESIS COUNT_OVER_TIME RATE RATE_COUNTER SUM AVG MAX MIN COUNT STDDEV STDVAR BOTTOMK TOPK SORT SORT_DESC + OPEN_PARENTHESIS CLOSE_PARENTHESIS COUNT_OVER_TIME RATE RATE_COUNTER SUM AVG MAX MIN COUNT STDDEV STDVAR BOTTOMK TOPK APPROX_TOPK SORT SORT_DESC BYTES_OVER_TIME BYTES_RATE BOOL JSON REGEXP LOGFMT PIPE_MATCH PIPE_EXACT PIPE_MATCH_PATTERN PIPE_NOT_MATCH_PATTERN PIPE LINE_FMT LABEL_FMT UNWRAP AVG_OVER_TIME SUM_OVER_TIME MIN_OVER_TIME MAX_OVER_TIME STDVAR_OVER_TIME STDDEV_OVER_TIME QUANTILE_OVER_TIME FIRST_OVER_TIME LAST_OVER_TIME ABSENT_OVER_TIME BY WITHOUT VECTOR LABEL_REPLACE IP UNPACK PATTERN OFFSET BYTES_CONV DURATION_CONV DURATION_SECONDS_CONV ON IGNORING GROUP_LEFT GROUP_RIGHT - DECOLORIZE DROP KEEP + DECOLORIZE DROP KEEP VARIANTS OF %left OR %left AND UNLESS @@ -91,6 +95,7 @@ expr: | logMetricExpr { $$ = $1 } | logBinaryOpExpr { $$ = $1 } | logNumberExpr { $$ = $1 } + | logMultiVariantExpr { $$ = $1 } | OPEN_PARENTHESIS expr CLOSE_PARENTHESIS { $$ = newParenthesisExpr($2) } ; @@ -241,6 +246,15 @@ logFMTFlags: | logFMTFlags logFMTFlags { $$ = mergeParserFlags($1, $2) } ; +logMultiVariantExpr: + VARIANTS OPEN_PARENTHESIS logMetricExprs CLOSE_PARENTHESIS OF OPEN_PARENTHESIS logRangeQueryExpr CLOSE_PARENTHESIS { $$ = newLogMultiVariantExpr($3, $7) } + ; + +logMetricExprs: + logMetricExpr { $$ = []LogMetricSampleExpr{$1} } + | logMetricExprs COMMA logMetricExpr { $$ = append($1, $3) } + ; + binaryOpOptions: { $$ = BinaryOpOptions{} } | BOOL { $$ = BinaryOpOptions{ ReturnBool: true } } @@ -389,6 +403,7 @@ metricOp: | STDVAR { $$ = VectorOpTypeStdvar } | BOTTOMK { $$ = VectorOpTypeBottomK } | TOPK { $$ = VectorOpTypeTopK } + | APPROX_TOPK { $$ = VectorOpTypeApproxTopK } | SORT { $$ = VectorOpTypeSort } | SORT_DESC { $$ = VectorOpTypeSortDesc } | VECTOR { $$ = OpTypeVector } diff --git a/logql/v2/expr.y.go b/logql/v2/expr.y.go index 86e8dd6eb..85cada201 100644 --- a/logql/v2/expr.y.go +++ b/logql/v2/expr.y.go @@ -2,44 +2,47 @@ package v2 -import ( - __yyfmt__ "fmt" - "time" +import __yyfmt__ "fmt" + +import ( "github.com/prometheus/prometheus/model/labels" + "time" ) type exprSymType struct { - yys int - Expr Expr - LogBinaryOpExpr LogBinaryOpExpr - LogFilterExpr *LogFilterExpr - LogLabelFilterExpr *LogLabelFilterExpr - LogFormatExpr *LogFormatExpr - LogQueryExpr LogSelectorExpr - LogMetricExpr LogMetricSampleExpr - LogNumberExpr LogNumberExpr - LogPipelineExpr LogPipelineExpr - LogStageExpr LogStageExpr - LogRangeQueryExpr LogSelectorExpr - LogOffsetExpr *LogOffsetExpr - LogStageLabels LogLabelList - LogParserLabels LogLabelList - LogFMTFlags []string - Matcher *labels.Matcher - Matchers []*labels.Matcher - MetricOp string - BinaryOpOptions BinaryOpOptions - Range string - Filter string - Selector []*labels.Matcher - Grouping *grouping - Labels []string - str string - binaryOp string - ComparisonOp string - duration time.Duration - ConvOp string + yys int + Expr Expr + LogBinaryOpExpr LogBinaryOpExpr + LogFilterExpr *LogFilterExpr + LogLabelFilterExpr *LogLabelFilterExpr + LogFormatExpr *LogFormatExpr + LogQueryExpr LogSelectorExpr + LogMetricExpr LogMetricSampleExpr + LogNumberExpr LogNumberExpr + LogPipelineExpr LogPipelineExpr + LogStageExpr LogStageExpr + LogRangeQueryExpr LogSelectorExpr + LogOffsetExpr *LogOffsetExpr + LogStageLabels LogLabelList + LogParserLabels LogLabelList + LogFMTFlags []string + LogMultiVariantExpr *LogMultiVariantExpr + LogMetricExprs []LogMetricSampleExpr + Matcher *labels.Matcher + Matchers []*labels.Matcher + MetricOp string + BinaryOpOptions BinaryOpOptions + Range string + Filter string + Selector []*labels.Matcher + Grouping *grouping + Labels []string + str string + binaryOp string + ComparisonOp string + duration time.Duration + ConvOp string } const IDENTIFIER = 57346 @@ -74,65 +77,68 @@ const STDDEV = 57374 const STDVAR = 57375 const BOTTOMK = 57376 const TOPK = 57377 -const SORT = 57378 -const SORT_DESC = 57379 -const BYTES_OVER_TIME = 57380 -const BYTES_RATE = 57381 -const BOOL = 57382 -const JSON = 57383 -const REGEXP = 57384 -const LOGFMT = 57385 -const PIPE_MATCH = 57386 -const PIPE_EXACT = 57387 -const PIPE_MATCH_PATTERN = 57388 -const PIPE_NOT_MATCH_PATTERN = 57389 -const PIPE = 57390 -const LINE_FMT = 57391 -const LABEL_FMT = 57392 -const UNWRAP = 57393 -const AVG_OVER_TIME = 57394 -const SUM_OVER_TIME = 57395 -const MIN_OVER_TIME = 57396 -const MAX_OVER_TIME = 57397 -const STDVAR_OVER_TIME = 57398 -const STDDEV_OVER_TIME = 57399 -const QUANTILE_OVER_TIME = 57400 -const FIRST_OVER_TIME = 57401 -const LAST_OVER_TIME = 57402 -const ABSENT_OVER_TIME = 57403 -const BY = 57404 -const WITHOUT = 57405 -const VECTOR = 57406 -const LABEL_REPLACE = 57407 -const IP = 57408 -const UNPACK = 57409 -const PATTERN = 57410 -const OFFSET = 57411 -const BYTES_CONV = 57412 -const DURATION_CONV = 57413 -const DURATION_SECONDS_CONV = 57414 -const ON = 57415 -const IGNORING = 57416 -const GROUP_LEFT = 57417 -const GROUP_RIGHT = 57418 -const DECOLORIZE = 57419 -const DROP = 57420 -const KEEP = 57421 -const OR = 57422 -const AND = 57423 -const UNLESS = 57424 -const CMP_EQ = 57425 -const NEQ = 57426 -const LT = 57427 -const LTE = 57428 -const GT = 57429 -const GTE = 57430 -const ADD = 57431 -const SUB = 57432 -const MUL = 57433 -const DIV = 57434 -const MOD = 57435 -const POW = 57436 +const APPROX_TOPK = 57378 +const SORT = 57379 +const SORT_DESC = 57380 +const BYTES_OVER_TIME = 57381 +const BYTES_RATE = 57382 +const BOOL = 57383 +const JSON = 57384 +const REGEXP = 57385 +const LOGFMT = 57386 +const PIPE_MATCH = 57387 +const PIPE_EXACT = 57388 +const PIPE_MATCH_PATTERN = 57389 +const PIPE_NOT_MATCH_PATTERN = 57390 +const PIPE = 57391 +const LINE_FMT = 57392 +const LABEL_FMT = 57393 +const UNWRAP = 57394 +const AVG_OVER_TIME = 57395 +const SUM_OVER_TIME = 57396 +const MIN_OVER_TIME = 57397 +const MAX_OVER_TIME = 57398 +const STDVAR_OVER_TIME = 57399 +const STDDEV_OVER_TIME = 57400 +const QUANTILE_OVER_TIME = 57401 +const FIRST_OVER_TIME = 57402 +const LAST_OVER_TIME = 57403 +const ABSENT_OVER_TIME = 57404 +const BY = 57405 +const WITHOUT = 57406 +const VECTOR = 57407 +const LABEL_REPLACE = 57408 +const IP = 57409 +const UNPACK = 57410 +const PATTERN = 57411 +const OFFSET = 57412 +const BYTES_CONV = 57413 +const DURATION_CONV = 57414 +const DURATION_SECONDS_CONV = 57415 +const ON = 57416 +const IGNORING = 57417 +const GROUP_LEFT = 57418 +const GROUP_RIGHT = 57419 +const DECOLORIZE = 57420 +const DROP = 57421 +const KEEP = 57422 +const VARIANTS = 57423 +const OF = 57424 +const OR = 57425 +const AND = 57426 +const UNLESS = 57427 +const CMP_EQ = 57428 +const NEQ = 57429 +const LT = 57430 +const LTE = 57431 +const GT = 57432 +const GTE = 57433 +const ADD = 57434 +const SUB = 57435 +const MUL = 57436 +const DIV = 57437 +const MOD = 57438 +const POW = 57439 var exprToknames = [...]string{ "$end", @@ -170,6 +176,7 @@ var exprToknames = [...]string{ "STDVAR", "BOTTOMK", "TOPK", + "APPROX_TOPK", "SORT", "SORT_DESC", "BYTES_OVER_TIME", @@ -214,6 +221,8 @@ var exprToknames = [...]string{ "DECOLORIZE", "DROP", "KEEP", + "VARIANTS", + "OF", "OR", "AND", "UNLESS", @@ -237,6 +246,7 @@ const exprEofCode = 1 const exprErrCode = 2 const exprInitialStackSize = 16 + var exprExca = [...]int{ -1, 1, 1, -1, @@ -245,242 +255,263 @@ var exprExca = [...]int{ const exprPrivate = 57344 -const exprLast = 653 +const exprLast = 782 var exprAct = [...]int{ - 200, 71, 60, 59, 187, 4, 170, 5, 154, 168, - 8, 115, 6, 58, 100, 219, 50, 183, 153, 172, - 45, 46, 47, 48, 49, 50, 97, 47, 48, 49, - 50, 175, 177, 178, 79, 42, 43, 44, 51, 52, - 55, 56, 53, 54, 45, 46, 47, 48, 49, 50, - 82, 121, 2, 153, 309, 310, 305, 306, 202, 57, - 288, 289, 99, 51, 52, 55, 56, 53, 54, 45, - 46, 47, 48, 49, 50, 272, 117, 344, 118, 151, - 125, 119, 126, 42, 43, 44, 51, 52, 55, 56, - 53, 54, 45, 46, 47, 48, 49, 50, 130, 132, - 133, 202, 176, 181, 182, 179, 180, 285, 286, 160, - 357, 159, 229, 152, 151, 72, 73, 155, 173, 246, - 342, 188, 225, 193, 11, 203, 58, 226, 198, 113, - 199, 195, 196, 134, 356, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 207, - 43, 44, 51, 52, 55, 56, 53, 54, 45, 46, - 47, 48, 49, 50, 218, 188, 214, 215, 216, 131, - 243, 185, 57, 230, 333, 162, 163, 164, 70, 68, - 263, 262, 249, 228, 315, 353, 249, 227, 232, 352, - 114, 314, 270, 238, 239, 236, 99, 237, 241, 242, - 119, 235, 249, 247, 185, 351, 12, 13, 64, 65, - 66, 67, 62, 254, 256, 202, 302, 249, 72, 73, - 350, 249, 185, 301, 347, 186, 258, 249, 297, 295, - 346, 265, 261, 249, 338, 269, 341, 11, 188, 290, - 271, 273, 264, 244, 99, 99, 14, 276, 69, 280, - 274, 278, 7, 279, 15, 16, 17, 30, 31, 33, - 34, 32, 35, 36, 37, 38, 39, 40, 18, 19, - 249, 188, 294, 340, 296, 249, 298, 202, 287, 99, - 268, 202, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 202, 248, 41, 10, 336, 316, 202, 317, - 331, 233, 318, 135, 136, 192, 191, 202, 324, 326, - 98, 329, 330, 332, 328, 11, 240, 325, 249, 12, - 13, 284, 337, 339, 14, 68, 323, 327, 343, 345, - 7, 202, 15, 16, 17, 30, 31, 33, 34, 32, - 35, 36, 37, 38, 39, 40, 18, 19, 322, 249, - 257, 202, 251, 321, 64, 65, 66, 67, 62, 202, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 255, 249, 41, 10, 250, 312, 311, 189, 204, 240, - 190, 308, 307, 291, 11, 267, 194, 266, 68, 221, - 213, 212, 184, 14, 69, 68, 275, 12, 13, 120, - 124, 15, 16, 17, 30, 31, 33, 34, 32, 35, - 36, 37, 38, 39, 40, 18, 19, 64, 65, 66, - 67, 62, 123, 122, 64, 65, 66, 67, 62, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 74, - 202, 41, 10, 349, 348, 320, 319, 224, 222, 217, - 283, 282, 153, 197, 245, 206, 80, 69, 68, 201, - 205, 223, 14, 220, 69, 234, 12, 13, 7, 78, - 15, 16, 17, 30, 31, 33, 34, 32, 35, 36, - 37, 38, 39, 40, 18, 19, 68, 64, 65, 66, - 67, 62, 156, 76, 300, 299, 157, 158, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 128, 75, - 41, 10, 157, 158, 355, 64, 65, 66, 67, 62, - 161, 354, 116, 127, 335, 334, 129, 69, 313, 304, - 303, 14, 293, 292, 259, 12, 13, 120, 253, 15, - 16, 17, 30, 31, 33, 34, 32, 35, 36, 37, - 38, 39, 40, 18, 19, 69, 68, 252, 231, 211, - 210, 209, 208, 112, 277, 167, 166, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 165, 281, 41, - 10, 171, 169, 260, 156, 64, 65, 66, 67, 62, - 112, 80, 9, 77, 3, 81, 61, 63, 174, 1, - 102, 105, 101, 0, 12, 13, 0, 0, 107, 109, - 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 69, 103, 106, 0, 0, - 0, 0, 0, 0, 0, 0, 108, 110, 111, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, + 63, 207, 9, 74, 62, 177, 175, 203, 5, 194, + 161, 4, 6, 229, 53, 104, 50, 51, 52, 53, + 61, 190, 264, 179, 48, 49, 50, 51, 52, 53, + 325, 326, 284, 101, 182, 184, 185, 321, 322, 86, + 83, 45, 46, 47, 54, 55, 58, 59, 56, 57, + 48, 49, 50, 51, 52, 53, 160, 192, 125, 2, + 137, 139, 140, 103, 301, 302, 256, 60, 160, 298, + 299, 239, 167, 377, 75, 76, 123, 259, 282, 195, + 373, 119, 122, 376, 259, 121, 130, 372, 352, 129, + 331, 347, 132, 45, 46, 47, 54, 55, 58, 59, + 56, 57, 48, 49, 50, 51, 52, 53, 183, 188, + 189, 186, 187, 195, 275, 274, 192, 166, 117, 162, + 158, 180, 192, 330, 235, 195, 12, 202, 200, 236, + 210, 159, 158, 240, 138, 206, 61, 193, 205, 169, + 170, 171, 369, 337, 141, 216, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 217, 54, 55, 58, 59, 56, 57, 48, 49, 50, + 51, 52, 53, 228, 224, 225, 226, 276, 250, 209, + 118, 73, 259, 60, 195, 371, 238, 71, 259, 259, + 259, 370, 367, 366, 237, 287, 315, 242, 364, 123, + 314, 103, 248, 249, 245, 247, 251, 252, 246, 209, + 259, 13, 14, 361, 209, 257, 209, 67, 68, 69, + 70, 65, 75, 76, 266, 268, 259, 265, 362, 360, + 209, 209, 209, 358, 259, 356, 192, 300, 270, 273, + 277, 209, 259, 209, 310, 297, 209, 281, 308, 350, + 348, 344, 103, 103, 253, 283, 285, 254, 288, 72, + 342, 303, 269, 71, 291, 267, 292, 290, 46, 47, + 54, 55, 58, 59, 56, 57, 48, 49, 50, 51, + 52, 53, 259, 209, 259, 261, 307, 260, 309, 103, + 311, 209, 286, 67, 68, 69, 70, 65, 215, 319, + 196, 214, 211, 197, 318, 16, 280, 102, 258, 243, + 208, 320, 332, 199, 333, 198, 346, 334, 341, 340, + 328, 327, 324, 339, 338, 343, 345, 323, 304, 349, + 351, 296, 279, 278, 231, 72, 223, 222, 191, 103, + 128, 250, 357, 359, 355, 12, 201, 127, 363, 365, + 71, 126, 80, 77, 16, 71, 103, 368, 233, 336, + 8, 335, 17, 18, 19, 32, 33, 35, 36, 34, + 37, 38, 39, 40, 41, 42, 43, 20, 21, 234, + 67, 68, 69, 70, 65, 67, 68, 69, 70, 65, + 135, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 232, 227, 44, 11, 134, 295, 294, 136, 160, + 255, 213, 142, 143, 212, 230, 79, 12, 244, 15, + 84, 71, 72, 164, 165, 78, 16, 72, 71, 313, + 13, 14, 8, 82, 17, 18, 19, 32, 33, 35, + 36, 34, 37, 38, 39, 40, 41, 42, 43, 20, + 21, 67, 68, 69, 70, 65, 312, 375, 67, 68, + 69, 70, 65, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 163, 293, 44, 11, 164, 165, 374, + 354, 353, 329, 317, 316, 306, 305, 168, 271, 12, + 263, 15, 262, 72, 241, 221, 220, 219, 16, 218, + 72, 174, 13, 14, 124, 173, 17, 18, 19, 32, + 33, 35, 36, 34, 37, 38, 39, 40, 41, 42, + 43, 20, 21, 71, 172, 178, 176, 272, 163, 116, + 84, 289, 10, 81, 131, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 7, 3, 44, 11, 64, + 66, 181, 1, 67, 68, 69, 70, 65, 0, 0, + 0, 204, 0, 15, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 13, 14, 8, 0, 17, 18, + 19, 32, 33, 35, 36, 34, 37, 38, 39, 40, + 41, 42, 43, 20, 21, 72, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 0, 0, 44, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 116, + 0, 0, 0, 120, 0, 15, 0, 0, 0, 0, + 0, 0, 16, 0, 0, 0, 13, 14, 124, 0, + 17, 18, 19, 32, 33, 35, 36, 34, 37, 38, + 39, 40, 41, 42, 43, 20, 21, 106, 109, 105, + 0, 0, 0, 0, 0, 111, 113, 108, 0, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, + 0, 44, 11, 107, 110, 0, 0, 0, 0, 0, + 0, 0, 0, 112, 114, 115, 0, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, + 133, 85, 17, 18, 19, 32, 33, 35, 36, 34, + 37, 38, 39, 40, 41, 42, 43, 20, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 0, 0, 44, 11, 0, 0, 0, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, } var exprPact = [...]int{ - 308, -1000, -45, -1000, -1000, -1000, -1000, 308, 443, 156, - 417, -1000, 502, 486, 452, -1000, -1000, -1000, -1000, -1000, + 410, -1000, -42, -1000, -1000, -1000, -1000, -1000, 410, 413, + 159, 331, -1000, 418, 409, 330, 416, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 3, 287, 443, - -1000, -1000, 559, 124, -1000, -1000, -1000, -1000, -1000, -1000, - 515, 401, 400, 378, 308, -1000, -1000, 506, -1000, -1000, - 85, 230, -1000, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, -1000, -1000, -1000, - 33, 488, 580, -1000, 105, 572, 561, 560, -1000, 578, - 577, 577, 18, -63, 370, 202, 357, 283, 282, 380, - 377, -45, 446, 436, 355, 440, 435, -1000, -1000, 587, - 557, 556, 555, 554, 69, 369, 368, -20, -20, -64, - -64, -78, -78, -78, -78, -69, -69, -69, -69, -69, - -69, 586, 586, 586, 429, 488, 450, -1000, -1000, 429, - -1000, 367, -1000, -1000, -1000, -1000, -1000, -1000, 428, 448, - 427, 85, -1000, 427, 117, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 107, 553, -1000, 53, 278, 455, 377, - -1000, 53, 53, 310, 443, 164, 220, 434, 96, 270, - 351, -1000, -1000, 329, -1000, 552, 533, -1000, -1000, -1000, - -1000, -1000, 347, 327, 432, -2, 33, 580, 429, 504, - 529, 579, 578, 176, 577, -1000, -1000, -1000, 365, -1000, - 363, 257, -1000, 53, -1000, 169, 52, 227, -1000, -1000, - -1000, 443, 373, 541, -1000, 308, -1000, 226, -1000, 574, - -1000, -1000, 431, 430, 298, 32, 255, -15, 429, -1000, - 216, 428, -1000, -1000, 361, 427, 528, 527, -1000, -1000, - 53, 206, 53, 205, 53, 489, 471, -1000, 200, 193, - -1000, -1000, 525, 524, -19, 360, 359, -21, 354, 353, - -1000, 523, 168, 161, -1000, 53, -1000, 53, -1000, -1000, - 53, -1000, -1000, 426, 425, 331, 326, 303, 294, 305, - 292, 288, 277, 151, -1000, -1000, -1000, -1000, -1000, 520, - 519, 273, 211, -1000, 250, -1000, 213, 97, 54, -1000, - 207, -1000, 201, -1000, 424, 423, -1000, 197, -1000, 182, - -1000, -1000, -1000, 166, -1000, 162, -1000, -1000, 516, 509, - -1000, -1000, -1000, -1000, 111, 87, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + 10, 284, 413, -1000, -1000, 625, 113, -1000, -1000, -1000, + -1000, -1000, -1000, 626, 329, 325, 318, 410, -1000, -1000, + 698, 388, -1000, -1000, 47, 338, -1000, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, -1000, -1000, -1000, 48, 469, 524, -1000, 68, 519, + 500, 496, -1000, 522, 521, 521, 21, -62, 316, 114, + 280, 292, 290, 340, 482, -42, 554, 287, 279, 394, + 391, 278, -1000, 698, -1000, -1000, 526, 494, 492, 491, + 490, 184, 315, 314, 75, 75, -78, -78, -83, -83, + -83, -83, -68, -68, -68, -68, -68, -68, 525, 525, + 525, 382, 469, 402, -1000, -1000, 382, -1000, 312, -1000, + -1000, -1000, -1000, -1000, -1000, 381, 345, 359, 47, -1000, + 359, 119, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 66, 489, -1000, 11, 286, 408, 482, -1000, 11, 11, + 335, 413, 248, 234, 390, 43, 285, 264, -1000, -1000, + 262, -1000, 487, 485, -60, 698, 284, -1000, -1000, -1000, + -1000, -1000, 242, 239, 389, 36, 48, 524, 382, 415, + 483, 523, 522, 110, 521, -1000, -1000, -1000, 311, -1000, + 310, 283, -1000, 11, -1000, 55, 9, 269, -1000, -1000, + -1000, 413, 172, 508, -1000, 410, -1000, 243, -1000, 470, + -1000, -1000, 387, 386, 309, -1000, 222, -7, 214, -12, + 382, -1000, 238, 381, -1000, -1000, 306, 359, 481, 480, + -1000, -1000, 11, 225, 11, 221, 11, 450, 406, -1000, + 177, 173, -1000, -1000, 479, 478, 289, -39, 305, 300, + -46, 299, 298, -1000, 477, 100, 67, -1000, 11, -1000, + 11, -1000, -1000, 11, -1000, -1000, 341, 339, 120, 340, + 289, 297, 296, 237, 228, 294, 69, 227, 226, 65, + -1000, -1000, -1000, -1000, -1000, 476, 475, -1000, 335, 248, + 212, 210, -1000, 206, -1000, 190, 205, 175, -1000, 170, + -1000, 169, -1000, 337, 122, 172, -1000, 168, -1000, 162, + -1000, -1000, -1000, 64, -1000, 57, -1000, -1000, 474, 452, + -1000, -1000, -1000, -1000, 60, 50, -1000, -1000, } var exprPgo = [...]int{ - 0, 599, 595, 598, 51, 597, 0, 7, 596, 14, - 9, 594, 5, 12, 3, 2, 11, 4, 6, 8, - 15, 19, 593, 592, 10, 1, 520, + 0, 552, 721, 551, 58, 550, 1, 8, 549, 15, + 6, 546, 11, 12, 4, 0, 7, 9, 5, 10, + 13, 545, 534, 23, 533, 532, 2, 3, 487, } var exprR1 = [...]int{ - 0, 1, 4, 4, 4, 4, 4, 11, 11, 14, - 14, 26, 26, 26, 15, 15, 15, 15, 15, 15, + 0, 1, 4, 4, 4, 4, 4, 4, 11, 11, + 14, 14, 28, 28, 28, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 10, 10, 10, 10, 17, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, + 15, 15, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 10, 10, 10, 10, 17, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 13, 13, 13, - 18, 18, 18, 19, 19, 19, 20, 20, 20, 2, + 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 13, 13, + 13, 18, 18, 18, 19, 19, 19, 20, 20, 20, + 21, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 24, 24, 24, 22, 22, 21, 21, 21, 21, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 5, 5, 5, - 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, - 3, 6, 6, 25, 25, 25, 25, + 2, 2, 2, 2, 2, 26, 26, 26, 24, 24, + 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 5, 5, 5, 5, 5, 5, 3, 3, + 3, 3, 3, 3, 3, 3, 6, 6, 27, 27, + 27, 27, } var exprR2 = [...]int{ - 0, 1, 1, 1, 1, 1, 3, 1, 2, 1, - 2, 1, 1, 1, 1, 2, 2, 3, 4, 2, - 3, 2, 3, 6, 3, 3, 3, 2, 3, 3, - 3, 2, 5, 4, 7, 3, 3, 3, 6, 3, - 3, 3, 3, 3, 6, 3, 2, 2, 3, 3, - 4, 5, 5, 6, 2, 3, 4, 5, 6, 7, - 7, 8, 5, 6, 5, 4, 6, 7, 8, 7, - 5, 6, 12, 5, 4, 6, 7, 7, 5, 12, - 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 1, 2, 2, - 1, 1, 3, 1, 3, 3, 1, 1, 2, 0, - 1, 5, 8, 9, 8, 9, 4, 7, 8, 7, - 8, 5, 8, 9, 8, 9, 4, 7, 8, 7, - 8, 3, 3, 2, 1, 3, 3, 3, 3, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 3, 1, 2, + 1, 2, 1, 1, 1, 1, 2, 2, 3, 4, + 2, 3, 2, 3, 6, 3, 3, 3, 2, 3, + 3, 3, 2, 5, 4, 7, 3, 3, 3, 6, + 3, 3, 3, 3, 3, 6, 3, 2, 2, 3, + 3, 4, 5, 5, 6, 2, 3, 4, 5, 6, + 7, 7, 8, 5, 6, 5, 4, 6, 7, 8, + 7, 5, 6, 12, 5, 4, 6, 7, 7, 5, + 12, 4, 3, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 1, 2, + 2, 1, 1, 3, 1, 3, 3, 1, 1, 2, + 8, 1, 3, 0, 1, 5, 8, 9, 8, 9, + 4, 7, 8, 7, 8, 5, 8, 9, 8, 9, + 4, 7, 8, 7, 8, 3, 3, 2, 1, 3, + 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 4, 4, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 3, 4, 4, + 3, 3, } var exprChk = [...]int{ - -1000, -1, -4, -11, -12, -7, -13, 22, -24, -23, - 65, 7, 89, 90, 16, 24, 25, 26, 38, 39, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 27, 28, 31, 29, 30, 32, 33, 34, 35, 36, - 37, 64, 80, 81, 82, 89, 90, 91, 92, 93, - 94, 83, 84, 87, 88, 85, 86, -4, -12, -14, - -15, -8, 48, -5, 44, 45, 46, 47, 15, 84, - 22, -25, 62, 63, 22, 7, 7, -22, 17, -21, - 4, -2, 40, -2, -2, -2, -2, -2, -2, -2, - -2, -2, -2, -2, -2, -2, -2, 23, 23, -15, - -9, 43, 41, 67, 51, 42, 68, 49, 77, 50, - 78, 79, 4, 5, 66, -16, 7, -12, -7, -24, - 22, -4, 22, 22, 22, -12, -7, 17, 2, 20, - 13, 84, 14, 15, -4, 73, 74, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, 81, 80, 20, -19, -20, 4, 8, 9, -19, - 4, -26, 70, 71, 72, 5, 5, 5, -10, 4, - -18, 4, -21, -18, -3, 13, 84, 14, 15, 87, - 88, 85, 86, 80, 22, 2, 23, -17, 69, 20, - 23, 23, 23, -14, 6, -24, -16, 7, -12, -7, - -6, 23, 4, -6, 23, 20, 20, -21, 5, 5, + -1000, -1, -4, -11, -12, -7, -13, -21, 22, -26, + -25, 66, 7, 92, 93, 81, 16, 24, 25, 26, + 39, 40, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 27, 28, 31, 29, 30, 32, 33, 34, + 35, 36, 37, 38, 65, 83, 84, 85, 92, 93, + 94, 95, 96, 97, 86, 87, 90, 91, 88, 89, + -4, -12, -14, -15, -8, 49, -5, 45, 46, 47, + 48, 15, 87, 22, -27, 63, 64, 22, 7, 7, + 22, -24, 17, -23, 4, -2, 41, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, 23, 23, -15, -9, 44, 42, 68, 52, 43, + 69, 50, 78, 51, 79, 80, 4, 5, 67, -16, + 7, -12, -7, -26, 22, -4, 22, 22, 22, -12, + -7, -22, -12, 22, 17, 2, 20, 13, 87, 14, + 15, -4, 74, 75, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, 84, 83, + 20, -19, -20, 4, 8, 9, -19, 4, -28, 71, + 72, 73, 5, 5, 5, -10, 4, -18, 4, -23, + -18, -3, 13, 87, 14, 15, 90, 91, 88, 89, + 83, 22, 2, 23, -17, 70, 20, 23, 23, 23, + -14, 6, -26, -16, 7, -12, -7, -6, 23, 4, + -6, 23, 20, 20, 23, 20, -12, -23, 5, 5, 5, 5, 22, 22, -9, -9, -9, 20, -19, -20, - 13, 22, 20, 13, 20, 5, 10, -13, 66, 5, - 66, 5, -25, 23, 10, -16, -12, -7, -25, -25, + 13, 22, 20, 13, 20, 5, 10, -13, 67, 5, + 67, 5, -27, 23, 10, -16, -12, -7, -27, -27, 6, -14, -14, 6, 23, 20, 23, -17, 23, 20, - 23, 23, 5, 5, -6, 23, -6, 23, -19, 5, - 4, -10, 5, 4, 66, -18, 22, 22, 23, -25, - 23, -17, 23, -17, 23, 23, -14, 23, -12, -7, - 23, 4, 20, 20, 23, 75, 76, 23, 75, 76, - 23, 22, 5, 5, -25, 23, -25, 23, -25, 6, - 23, 23, 23, 5, 5, 75, 76, 22, 22, 75, - 76, 22, 22, 5, 23, 23, -25, -25, -25, 20, - 20, 22, 22, 23, -6, 23, -6, 22, 22, 23, - -6, 23, -6, 23, 5, 5, 23, -6, 23, -6, + 23, 23, 5, 5, 82, -12, -6, 23, -6, 23, + -19, 5, 4, -10, 5, 4, 67, -18, 22, 22, + 23, -27, 23, -17, 23, -17, 23, 23, -14, 23, + -12, -7, 23, 4, 20, 20, 22, 23, 76, 77, + 23, 76, 77, 23, 22, 5, 5, -27, 23, -27, + 23, -27, 6, 23, 23, 23, 5, 5, -16, -26, + 22, 76, 77, 22, 22, 76, 77, 22, 22, 5, + 23, 23, -27, -27, -27, 20, 20, 23, -14, -26, + 22, 22, 23, -6, 23, -6, 22, 22, 23, -6, + 23, -6, 23, 5, 5, -14, 23, -6, 23, -6, 23, 23, 23, -6, 23, -6, 23, 23, 20, 20, 23, 23, 23, 23, 5, 5, 23, 23, } var exprDef = [...]int{ - 0, -2, 1, 2, 3, 4, 5, 0, 7, 0, - 0, 97, 0, 0, 0, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 0, 3, 8, - 9, 14, 0, 0, 167, 168, 169, 170, 171, 172, - 0, 0, 0, 0, 0, 98, 99, 0, 133, 134, - 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 81, 10, - 15, 16, 19, 21, 0, 0, 0, 0, 27, 0, - 0, 0, 0, 31, 0, 0, 97, 3, 4, 7, - 0, 0, 0, 0, 0, 3, 4, 131, 132, 0, - 0, 0, 0, 0, 82, 0, 0, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 0, 0, 0, 17, 0, 103, 106, 107, 20, - 22, 0, 11, 12, 13, 24, 25, 26, 28, 0, - 29, 100, 101, 30, 0, 173, 174, 175, 176, 177, - 178, 179, 180, 0, 0, 54, 56, 0, 0, 0, - 80, 65, 74, 8, 47, 7, 0, 97, 3, 4, - 0, 185, 181, 0, 186, 0, 0, 135, 136, 137, - 138, 139, 0, 0, 39, 40, 41, 0, 18, 108, - 0, 0, 0, 0, 0, 35, 36, 37, 0, 33, - 0, 0, 62, 57, 46, 0, 3, 4, 64, 73, - 49, 48, 8, 47, 55, 0, 70, 0, 78, 0, - 183, 184, 0, 0, 0, 116, 0, 126, 105, 104, - 0, 45, 42, 43, 0, 102, 0, 0, 32, 63, - 58, 0, 66, 0, 75, 0, 48, 50, 3, 4, - 71, 182, 0, 0, 111, 0, 0, 121, 0, 0, - 23, 0, 0, 0, 59, 60, 67, 0, 76, 52, - 51, 69, 77, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 38, 34, 61, 68, 53, 0, - 0, 0, 0, 117, 0, 119, 0, 0, 0, 127, - 0, 129, 0, 44, 0, 0, 112, 0, 114, 0, - 118, 120, 122, 0, 124, 0, 128, 130, 0, 0, - 113, 115, 123, 125, 0, 0, 72, 79, + 0, -2, 1, 2, 3, 4, 5, 6, 0, 8, + 0, 0, 98, 0, 0, 0, 0, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 0, 3, 9, 10, 15, 0, 0, 172, 173, 174, + 175, 176, 177, 0, 0, 0, 0, 0, 99, 100, + 0, 0, 137, 138, 0, 0, 114, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 82, 11, 16, 17, 20, 22, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 32, 0, 0, + 98, 3, 4, 8, 0, 0, 0, 0, 0, 3, + 4, 0, 111, 0, 135, 136, 0, 0, 0, 0, + 0, 83, 0, 0, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 0, 0, + 0, 18, 0, 104, 107, 108, 21, 23, 0, 12, + 13, 14, 25, 26, 27, 29, 0, 30, 101, 102, + 31, 0, 178, 179, 180, 181, 182, 183, 184, 185, + 0, 0, 55, 57, 0, 0, 0, 81, 66, 75, + 9, 48, 8, 0, 98, 3, 4, 0, 190, 186, + 0, 191, 0, 0, 0, 0, 0, 139, 140, 141, + 142, 143, 0, 0, 40, 41, 42, 0, 19, 109, + 0, 0, 0, 0, 0, 36, 37, 38, 0, 34, + 0, 0, 63, 58, 47, 0, 3, 4, 65, 74, + 50, 49, 9, 48, 56, 0, 71, 0, 79, 0, + 188, 189, 0, 0, 0, 112, 0, 120, 0, 130, + 106, 105, 0, 46, 43, 44, 0, 103, 0, 0, + 33, 64, 59, 0, 67, 0, 76, 0, 49, 51, + 3, 4, 72, 187, 0, 0, 0, 115, 0, 0, + 125, 0, 0, 24, 0, 0, 0, 60, 61, 68, + 0, 77, 53, 52, 70, 78, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 35, 62, 69, 54, 0, 0, 110, 0, 0, + 0, 0, 121, 0, 123, 0, 0, 0, 131, 0, + 133, 0, 45, 0, 0, 0, 116, 0, 118, 0, + 122, 124, 126, 0, 128, 0, 132, 134, 0, 0, + 117, 119, 127, 129, 0, 0, 73, 80, } var exprTok1 = [...]int{ @@ -497,7 +528,7 @@ var exprTok2 = [...]int{ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, + 92, 93, 94, 95, 96, 97, } var exprTok3 = [...]int{ @@ -510,6 +541,7 @@ var exprErrorMessages = [...]struct { msg string }{} + /* parser for yacc output */ var ( @@ -865,920 +897,945 @@ exprdefault: exprVAL.Expr = exprDollar[1].LogNumberExpr } case 6: + exprDollar = exprS[exprpt-1 : exprpt+1] + { + exprVAL.Expr = exprDollar[1].LogMultiVariantExpr + } + case 7: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.Expr = newParenthesisExpr(exprDollar[2].Expr) } - case 7: + case 8: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.LogQueryExpr = newLogQueryExpr(newStreamMatcherExpr(exprDollar[1].Selector), nil) } - case 8: + case 9: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogQueryExpr = newLogQueryExpr(newStreamMatcherExpr(exprDollar[1].Selector), exprDollar[2].LogPipelineExpr) } - case 9: + case 10: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.LogPipelineExpr = LogPipelineExpr{exprDollar[1].LogStageExpr} } - case 10: + case 11: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogPipelineExpr = append(exprDollar[1].LogPipelineExpr, exprDollar[2].LogStageExpr) } - case 11: + case 12: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.ConvOp = OpConvBytes } - case 12: + case 13: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.ConvOp = OpConvDuration } - case 13: + case 14: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.ConvOp = OpConvDurationSeconds } - case 14: + case 15: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.LogStageExpr = exprDollar[1].LogFilterExpr } - case 15: + case 16: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogStageExpr = exprDollar[2].LogLabelFilterExpr } - case 16: + case 17: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogStageExpr = newLogParserExpr(ParserLogFMT, "", "") } - case 17: + case 18: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogStageExpr = newLogLabelExpr(ParserLogFMT, nil, exprDollar[3].LogParserLabels) } - case 18: + case 19: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogStageExpr = newLogLabelExpr(ParserLogFMT, exprDollar[3].LogFMTFlags, exprDollar[4].LogParserLabels) } - case 19: + case 20: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogStageExpr = newLogParserExpr(ParserJSON, "", "") } - case 20: + case 21: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogStageExpr = newLogLabelExpr(ParserJSON, nil, exprDollar[3].LogParserLabels) } - case 21: + case 22: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogStageExpr = newLogParserExpr(ParserUnpack, "", "") } - case 22: + case 23: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogStageExpr = newLogParserExpr(ParserUnwrap, exprDollar[3].str, "") } - case 23: + case 24: exprDollar = exprS[exprpt-6 : exprpt+1] { exprVAL.LogStageExpr = newLogParserExpr(ParserUnwrap, exprDollar[5].str, exprDollar[3].ConvOp) } - case 24: + case 25: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogStageExpr = newLogParserExpr(ParserRegExp, exprDollar[3].str, "") } - case 25: + case 26: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogStageExpr = newLogParserExpr(ParserPattern, exprDollar[3].str, "") } - case 26: + case 27: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogStageExpr = newLogParserExpr(ParserLineFormat, exprDollar[3].str, "") } - case 27: + case 28: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogStageExpr = newLogDecolorizeExpr() } - case 28: + case 29: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogStageExpr = exprDollar[3].LogFormatExpr } - case 29: + case 30: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogStageExpr = newLogLabelExpr(ParserDrop, nil, exprDollar[3].LogStageLabels) } - case 30: + case 31: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogStageExpr = newLogLabelExpr(ParserKeep, nil, exprDollar[3].LogStageLabels) } - case 31: + case 32: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogFilterExpr = newLogFilterExpr(exprDollar[1].Filter, "", exprDollar[2].str) } - case 32: + case 33: exprDollar = exprS[exprpt-5 : exprpt+1] { exprVAL.LogFilterExpr = newLogFilterExpr(exprDollar[1].Filter, OpIP, exprDollar[4].str) } - case 33: + case 34: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogFilterExpr = newLogFilterExpr(exprDollar[1].Filter, "", exprDollar[2].str).chain("or", newLogFilterExpr(exprDollar[1].Filter, "", exprDollar[4].str)) } - case 34: + case 35: exprDollar = exprS[exprpt-7 : exprpt+1] { exprVAL.LogFilterExpr = newLogFilterExpr(exprDollar[1].Filter, "", exprDollar[2].str).chain("or", newLogFilterExpr(exprDollar[1].Filter, OpIP, exprDollar[6].str)) } - case 35: + case 36: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogLabelFilterExpr = newLogLabelFilter(exprDollar[1].str, exprDollar[2].ComparisonOp, "", newLogLabelFilterValue(TypeText, nil, exprDollar[3].str, 0)) } - case 36: + case 37: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogLabelFilterExpr = newLogLabelFilter(exprDollar[1].str, exprDollar[2].ComparisonOp, "", newLogLabelFilterValue(TypeDuration, nil, "", exprDollar[3].duration)) } - case 37: + case 38: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogLabelFilterExpr = newLogLabelFilter(exprDollar[1].str, exprDollar[2].ComparisonOp, "", newLogLabelFilterValue(TypeNumber, &exprDollar[3].LogNumberExpr, "", 0)) } - case 38: + case 39: exprDollar = exprS[exprpt-6 : exprpt+1] { exprVAL.LogLabelFilterExpr = newLogLabelFilter(exprDollar[1].str, exprDollar[2].ComparisonOp, OpIP, newLogLabelFilterValue(TypeText, nil, exprDollar[5].str, 0)) } - case 39: + case 40: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogLabelFilterExpr = exprDollar[1].LogLabelFilterExpr.chain("and", exprDollar[3].LogLabelFilterExpr) } - case 40: + case 41: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogLabelFilterExpr = exprDollar[1].LogLabelFilterExpr.chain("or", exprDollar[3].LogLabelFilterExpr) } - case 41: + case 42: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogLabelFilterExpr = exprDollar[1].LogLabelFilterExpr.chain(",", exprDollar[3].LogLabelFilterExpr) } - case 42: + case 43: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogFormatExpr = newLogFormatExpr("", LogFormatValues{exprDollar[1].str: LogFormatValue{Value: exprDollar[3].str}}, "") } - case 43: + case 44: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogFormatExpr = newLogFormatExpr("", LogFormatValues{exprDollar[1].str: LogFormatValue{Value: exprDollar[3].str, IsIdentifier: true}}, "") } - case 44: + case 45: exprDollar = exprS[exprpt-6 : exprpt+1] { exprVAL.LogFormatExpr = newLogFormatExpr("", LogFormatValues{exprDollar[1].str: LogFormatValue{Value: OpIP + "(" + exprDollar[5].str + ")"}}, "") } - case 45: + case 46: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogFormatExpr = newLogFormatExpr(",", mergeLogFormatValues(exprDollar[1].LogFormatExpr.kv, exprDollar[3].LogFormatExpr.kv), "") } - case 46: + case 47: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogOffsetExpr = newLogOffsetExpr(exprDollar[2].duration) } - case 47: + case 48: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogRangeQueryExpr = newLogRangeQueryExpr(newLogQueryExpr(newStreamMatcherExpr(exprDollar[1].Selector), nil), exprDollar[2].str, nil, false) } - case 48: + case 49: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogRangeQueryExpr = newLogRangeQueryExpr(newLogQueryExpr(newStreamMatcherExpr(exprDollar[1].Selector), exprDollar[3].LogPipelineExpr), exprDollar[2].str, nil, false) } - case 49: + case 50: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogRangeQueryExpr = newLogRangeQueryExpr(newLogQueryExpr(newStreamMatcherExpr(exprDollar[1].Selector), exprDollar[2].LogPipelineExpr), exprDollar[3].str, nil, true) } - case 50: + case 51: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogRangeQueryExpr = newLogRangeQueryExpr(newLogQueryExpr(newStreamMatcherExpr(exprDollar[2].Selector), nil), exprDollar[3].str, nil, false) } - case 51: + case 52: exprDollar = exprS[exprpt-5 : exprpt+1] { exprVAL.LogRangeQueryExpr = newLogRangeQueryExpr(newLogQueryExpr(newStreamMatcherExpr(exprDollar[2].Selector), exprDollar[4].LogPipelineExpr), exprDollar[3].str, nil, false) } - case 52: + case 53: exprDollar = exprS[exprpt-5 : exprpt+1] { exprVAL.LogRangeQueryExpr = newLogRangeQueryExpr(newLogQueryExpr(newStreamMatcherExpr(exprDollar[2].Selector), exprDollar[3].LogPipelineExpr), exprDollar[5].str, nil, true) } - case 53: + case 54: exprDollar = exprS[exprpt-6 : exprpt+1] { exprVAL.LogRangeQueryExpr = newLogRangeQueryExpr(newLogQueryExpr(newStreamMatcherExpr(exprDollar[2].Selector), exprDollar[4].LogPipelineExpr), exprDollar[3].str, exprDollar[6].Grouping, false) } - case 55: + case 56: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogRangeQueryExpr = newParenthesisLogRangeQueryExpr(exprDollar[2].LogRangeQueryExpr) } - case 56: + case 57: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(nil, exprDollar[3].LogRangeQueryExpr, exprDollar[1].MetricOp, "", nil, false, nil, nil) } - case 57: + case 58: exprDollar = exprS[exprpt-5 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(nil, exprDollar[3].LogRangeQueryExpr, exprDollar[1].MetricOp, "", nil, false, nil, exprDollar[4].LogOffsetExpr) } - case 58: + case 59: exprDollar = exprS[exprpt-6 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(nil, exprDollar[5].LogRangeQueryExpr, exprDollar[1].MetricOp, exprDollar[3].str, nil, false, nil, nil) } - case 59: + case 60: exprDollar = exprS[exprpt-7 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(nil, exprDollar[5].LogRangeQueryExpr, exprDollar[1].MetricOp, exprDollar[3].str, exprDollar[7].Grouping, false, nil, nil) } - case 60: + case 61: exprDollar = exprS[exprpt-7 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(nil, exprDollar[5].LogRangeQueryExpr, exprDollar[1].MetricOp, exprDollar[3].str, nil, false, nil, exprDollar[6].LogOffsetExpr) } - case 61: + case 62: exprDollar = exprS[exprpt-8 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(nil, exprDollar[5].LogRangeQueryExpr, exprDollar[1].MetricOp, exprDollar[3].str, exprDollar[8].Grouping, false, nil, exprDollar[6].LogOffsetExpr) } - case 62: + case 63: exprDollar = exprS[exprpt-5 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(nil, exprDollar[3].LogRangeQueryExpr, exprDollar[1].MetricOp, "", exprDollar[5].Grouping, false, nil, nil) } - case 63: + case 64: exprDollar = exprS[exprpt-6 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(nil, exprDollar[3].LogRangeQueryExpr, exprDollar[1].MetricOp, "", exprDollar[6].Grouping, false, nil, exprDollar[4].LogOffsetExpr) } - case 64: + case 65: exprDollar = exprS[exprpt-5 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[3].LogMetricExpr, nil, exprDollar[1].MetricOp, "", exprDollar[5].Grouping, false, nil, nil) } - case 65: + case 66: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[3].LogMetricExpr, nil, exprDollar[1].MetricOp, "", nil, false, nil, nil) } - case 66: + case 67: exprDollar = exprS[exprpt-6 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[5].LogMetricExpr, nil, exprDollar[1].MetricOp, exprDollar[3].str, nil, false, nil, nil) } - case 67: + case 68: exprDollar = exprS[exprpt-7 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[5].LogMetricExpr, nil, exprDollar[1].MetricOp, exprDollar[3].str, exprDollar[7].Grouping, false, nil, nil) } - case 68: + case 69: exprDollar = exprS[exprpt-8 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[5].LogMetricExpr, nil, exprDollar[1].MetricOp, exprDollar[3].str, exprDollar[8].Grouping, false, nil, exprDollar[6].LogOffsetExpr) } - case 69: + case 70: exprDollar = exprS[exprpt-7 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[6].LogMetricExpr, nil, exprDollar[1].MetricOp, exprDollar[4].str, exprDollar[2].Grouping, true, nil, nil) } - case 70: + case 71: exprDollar = exprS[exprpt-5 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[4].LogMetricExpr, nil, exprDollar[1].MetricOp, "", exprDollar[2].Grouping, true, nil, nil) } - case 71: + case 72: exprDollar = exprS[exprpt-6 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[4].LogMetricExpr, nil, exprDollar[1].MetricOp, "", exprDollar[2].Grouping, true, nil, exprDollar[5].LogOffsetExpr) } - case 72: + case 73: exprDollar = exprS[exprpt-12 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[3].LogMetricExpr, nil, OpLabelReplace, "", nil, false, []string{exprDollar[5].str, exprDollar[7].str, exprDollar[9].str, exprDollar[11].str}, nil) } - case 73: + case 74: exprDollar = exprS[exprpt-5 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[3].LogBinaryOpExpr, nil, exprDollar[1].MetricOp, "", exprDollar[5].Grouping, false, nil, nil) } - case 74: + case 75: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[3].LogBinaryOpExpr, nil, exprDollar[1].MetricOp, "", nil, false, nil, nil) } - case 75: + case 76: exprDollar = exprS[exprpt-6 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[5].LogBinaryOpExpr, nil, exprDollar[1].MetricOp, exprDollar[3].str, nil, false, nil, nil) } - case 76: + case 77: exprDollar = exprS[exprpt-7 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[5].LogBinaryOpExpr, nil, exprDollar[1].MetricOp, exprDollar[3].str, exprDollar[7].Grouping, false, nil, nil) } - case 77: + case 78: exprDollar = exprS[exprpt-7 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[6].LogBinaryOpExpr, nil, exprDollar[1].MetricOp, exprDollar[4].str, exprDollar[2].Grouping, true, nil, nil) } - case 78: + case 79: exprDollar = exprS[exprpt-5 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[4].LogBinaryOpExpr, nil, exprDollar[1].MetricOp, "", exprDollar[2].Grouping, true, nil, nil) } - case 79: + case 80: exprDollar = exprS[exprpt-12 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(exprDollar[3].LogBinaryOpExpr, nil, OpLabelReplace, "", nil, false, []string{exprDollar[5].str, exprDollar[7].str, exprDollar[9].str, exprDollar[11].str}, nil) } - case 80: + case 81: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogMetricExpr = newLogMetricExpr(newVectorExpr(exprDollar[3].str), nil, OpTypeVector, "", nil, false, nil, nil) } - case 81: + case 82: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogMetricExpr = newParenthesisLogMetricExpr(exprDollar[2].LogMetricExpr) } - case 82: + case 83: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("or", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 83: + case 84: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("and", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 84: + case 85: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("unless", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 85: + case 86: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("+", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 86: + case 87: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("-", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 87: + case 88: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("*", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 88: + case 89: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("/", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 89: + case 90: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("%", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 90: + case 91: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("^", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 91: + case 92: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("==", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 92: + case 93: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("!=", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 93: + case 94: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr(">", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 94: + case 95: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr(">=", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 95: + case 96: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("<", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 96: + case 97: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.LogBinaryOpExpr = newLogBinaryOpExpr("<=", exprDollar[3].BinaryOpOptions, exprDollar[1].Expr, exprDollar[4].Expr) } - case 97: + case 98: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.LogNumberExpr = newLogNumberExpr(exprDollar[1].str, false) } - case 98: + case 99: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogNumberExpr = newLogNumberExpr(exprDollar[2].str, false) } - case 99: + case 100: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogNumberExpr = newLogNumberExpr(exprDollar[2].str, true) } - case 100: + case 101: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.LogStageLabels = newLogLabelList(newLogLabel(exprDollar[1].str, nil)) } - case 101: + case 102: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.LogStageLabels = newLogLabelList(newLogLabel("", exprDollar[1].Matcher)) } - case 102: + case 103: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogStageLabels = mergeLabels(exprDollar[1].LogStageLabels, exprDollar[3].LogStageLabels) } - case 103: + case 104: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.LogParserLabels = newLogLabelList(newLogLabel(exprDollar[1].str, nil)) } - case 104: + case 105: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogParserLabels = newLogLabelList(newLogLabel("", newLabelMatcher(labels.MatchEqual, exprDollar[1].str, exprDollar[3].str))) } - case 105: + case 106: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.LogParserLabels = mergeLabels(exprDollar[1].LogParserLabels, exprDollar[3].LogParserLabels) } - case 106: + case 107: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.LogFMTFlags = []string{exprDollar[1].str} } - case 107: + case 108: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.LogFMTFlags = []string{exprDollar[1].str} } - case 108: + case 109: exprDollar = exprS[exprpt-2 : exprpt+1] { exprVAL.LogFMTFlags = mergeParserFlags(exprDollar[1].LogFMTFlags, exprDollar[2].LogFMTFlags) } - case 109: + case 110: + exprDollar = exprS[exprpt-8 : exprpt+1] + { + exprVAL.LogMultiVariantExpr = newLogMultiVariantExpr(exprDollar[3].LogMetricExprs, exprDollar[7].LogRangeQueryExpr) + } + case 111: + exprDollar = exprS[exprpt-1 : exprpt+1] + { + exprVAL.LogMetricExprs = []LogMetricSampleExpr{exprDollar[1].LogMetricExpr} + } + case 112: + exprDollar = exprS[exprpt-3 : exprpt+1] + { + exprVAL.LogMetricExprs = append(exprDollar[1].LogMetricExprs, exprDollar[3].LogMetricExpr) + } + case 113: exprDollar = exprS[exprpt-0 : exprpt+1] { exprVAL.BinaryOpOptions = BinaryOpOptions{} } - case 110: + case 114: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.BinaryOpOptions = BinaryOpOptions{ReturnBool: true} } - case 111: + case 115: exprDollar = exprS[exprpt-5 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.OnOption = OnOption{Enabled: true, Labels: exprDollar[4].Labels} } - case 112: + case 116: exprDollar = exprS[exprpt-8 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.OnOption = OnOption{Enabled: true, Labels: exprDollar[4].Labels, GroupingType: GroupLeftOption} } - case 113: + case 117: exprDollar = exprS[exprpt-9 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.OnOption = OnOption{Enabled: true, Labels: exprDollar[4].Labels, GroupingType: GroupLeftOption, IncludeLabels: exprDollar[8].Labels} } - case 114: + case 118: exprDollar = exprS[exprpt-8 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.OnOption = OnOption{Enabled: true, Labels: exprDollar[4].Labels, GroupingType: GroupRightOption} } - case 115: + case 119: exprDollar = exprS[exprpt-9 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.OnOption = OnOption{Enabled: true, Labels: exprDollar[4].Labels, GroupingType: GroupRightOption, IncludeLabels: exprDollar[8].Labels} } - case 116: + case 120: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.OnOption = OnOption{Enabled: true} } - case 117: + case 121: exprDollar = exprS[exprpt-7 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.OnOption = OnOption{Enabled: true, GroupingType: GroupLeftOption} } - case 118: + case 122: exprDollar = exprS[exprpt-8 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.OnOption = OnOption{Enabled: true, GroupingType: GroupLeftOption, IncludeLabels: exprDollar[7].Labels} } - case 119: + case 123: exprDollar = exprS[exprpt-7 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.OnOption = OnOption{Enabled: true, GroupingType: GroupRightOption} } - case 120: + case 124: exprDollar = exprS[exprpt-8 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.OnOption = OnOption{Enabled: true, GroupingType: GroupRightOption, IncludeLabels: exprDollar[7].Labels} } - case 121: + case 125: exprDollar = exprS[exprpt-5 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.IgnoringOption = IgnoringOption{Enabled: true, Labels: exprDollar[4].Labels} } - case 122: + case 126: exprDollar = exprS[exprpt-8 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.IgnoringOption = IgnoringOption{Enabled: true, Labels: exprDollar[4].Labels, GroupingType: GroupLeftOption} } - case 123: + case 127: exprDollar = exprS[exprpt-9 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.IgnoringOption = IgnoringOption{Enabled: true, Labels: exprDollar[4].Labels, GroupingType: GroupLeftOption, IncludeLabels: exprDollar[8].Labels} } - case 124: + case 128: exprDollar = exprS[exprpt-8 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.IgnoringOption = IgnoringOption{Enabled: true, Labels: exprDollar[4].Labels, GroupingType: GroupRightOption} } - case 125: + case 129: exprDollar = exprS[exprpt-9 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.IgnoringOption = IgnoringOption{Enabled: true, Labels: exprDollar[4].Labels, GroupingType: GroupRightOption, IncludeLabels: exprDollar[8].Labels} } - case 126: + case 130: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.IgnoringOption = IgnoringOption{Enabled: true} } - case 127: + case 131: exprDollar = exprS[exprpt-7 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.IgnoringOption = IgnoringOption{Enabled: true, GroupingType: GroupLeftOption} } - case 128: + case 132: exprDollar = exprS[exprpt-8 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.IgnoringOption = IgnoringOption{Enabled: true, GroupingType: GroupLeftOption, IncludeLabels: exprDollar[7].Labels} } - case 129: + case 133: exprDollar = exprS[exprpt-7 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.IgnoringOption = IgnoringOption{Enabled: true, GroupingType: GroupRightOption} } - case 130: + case 134: exprDollar = exprS[exprpt-8 : exprpt+1] { exprVAL.BinaryOpOptions = exprDollar[1].BinaryOpOptions exprVAL.BinaryOpOptions.IgnoringOption = IgnoringOption{Enabled: true, GroupingType: GroupRightOption, IncludeLabels: exprDollar[7].Labels} } - case 131: + case 135: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.Selector = exprDollar[2].Matchers } - case 132: + case 136: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.Selector = exprDollar[2].Matchers } - case 133: + case 137: exprDollar = exprS[exprpt-2 : exprpt+1] { } - case 134: + case 138: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.Matchers = []*labels.Matcher{exprDollar[1].Matcher} } - case 135: + case 139: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.Matchers = append(exprDollar[1].Matchers, exprDollar[3].Matcher) } - case 136: + case 140: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.Matcher = newLabelMatcher(labels.MatchEqual, exprDollar[1].str, exprDollar[3].str) } - case 137: + case 141: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.Matcher = newLabelMatcher(labels.MatchNotEqual, exprDollar[1].str, exprDollar[3].str) } - case 138: + case 142: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.Matcher = newLabelMatcher(labels.MatchRegexp, exprDollar[1].str, exprDollar[3].str) } - case 139: + case 143: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.Matcher = newLabelMatcher(labels.MatchNotRegexp, exprDollar[1].str, exprDollar[3].str) } - case 140: + case 144: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeCount } - case 141: + case 145: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeRate } - case 142: + case 146: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeRateCounter } - case 143: + case 147: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeBytes } - case 144: + case 148: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeBytesRate } - case 145: + case 149: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeAvg } - case 146: + case 150: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeSum } - case 147: + case 151: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeMin } - case 148: + case 152: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeMax } - case 149: + case 153: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeStdvar } - case 150: + case 154: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeStddev } - case 151: + case 155: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeQuantile } - case 152: + case 156: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeFirst } - case 153: + case 157: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeLast } - case 154: + case 158: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = RangeOpTypeAbsent } - case 155: + case 159: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = VectorOpTypeSum } - case 156: + case 160: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = VectorOpTypeAvg } - case 157: + case 161: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = VectorOpTypeCount } - case 158: + case 162: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = VectorOpTypeMax } - case 159: + case 163: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = VectorOpTypeMin } - case 160: + case 164: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = VectorOpTypeStddev } - case 161: + case 165: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = VectorOpTypeStdvar } - case 162: + case 166: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = VectorOpTypeBottomK } - case 163: + case 167: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = VectorOpTypeTopK } - case 164: + case 168: + exprDollar = exprS[exprpt-1 : exprpt+1] + { + exprVAL.MetricOp = VectorOpTypeApproxTopK + } + case 169: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = VectorOpTypeSort } - case 165: + case 170: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = VectorOpTypeSortDesc } - case 166: + case 171: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.MetricOp = OpTypeVector } - case 167: + case 172: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.Filter = "|~" } - case 168: + case 173: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.Filter = "|=" } - case 169: + case 174: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.Filter = "|>" } - case 170: + case 175: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.Filter = "!>" } - case 171: + case 176: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.Filter = "!~" } - case 172: + case 177: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.Filter = "!=" } - case 173: + case 178: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.ComparisonOp = "=" } - case 174: + case 179: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.ComparisonOp = "!=" } - case 175: + case 180: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.ComparisonOp = "=~" } - case 176: + case 181: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.ComparisonOp = "!~" } - case 177: + case 182: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.ComparisonOp = ">" } - case 178: + case 183: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.ComparisonOp = ">=" } - case 179: + case 184: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.ComparisonOp = "<" } - case 180: + case 185: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.ComparisonOp = "<=" } - case 181: + case 186: exprDollar = exprS[exprpt-1 : exprpt+1] { exprVAL.Labels = []string{exprDollar[1].str} } - case 182: + case 187: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.Labels = append(exprDollar[1].Labels, exprDollar[3].str) } - case 183: + case 188: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.Grouping = &grouping{without: false, groups: exprDollar[3].Labels} } - case 184: + case 189: exprDollar = exprS[exprpt-4 : exprpt+1] { exprVAL.Grouping = &grouping{without: true, groups: exprDollar[3].Labels} } - case 185: + case 190: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.Grouping = &grouping{without: false, groups: nil} } - case 186: + case 191: exprDollar = exprS[exprpt-3 : exprpt+1] { exprVAL.Grouping = &grouping{without: true, groups: nil} diff --git a/logql/v2/lexer.go b/logql/v2/lexer.go index d0232973c..0a9cc274d 100644 --- a/logql/v2/lexer.go +++ b/logql/v2/lexer.go @@ -13,17 +13,18 @@ import ( ) const ( - VectorOpTypeSum = "sum" - VectorOpTypeAvg = "avg" - VectorOpTypeMax = "max" - VectorOpTypeMin = "min" - VectorOpTypeCount = "count" - VectorOpTypeStddev = "stddev" - VectorOpTypeStdvar = "stdvar" - VectorOpTypeBottomK = "bottomk" - VectorOpTypeTopK = "topk" - VectorOpTypeSort = "sort" - VectorOpTypeSortDesc = "sort_desc" + VectorOpTypeSum = "sum" + VectorOpTypeAvg = "avg" + VectorOpTypeMax = "max" + VectorOpTypeMin = "min" + VectorOpTypeCount = "count" + VectorOpTypeStddev = "stddev" + VectorOpTypeStdvar = "stdvar" + VectorOpTypeBottomK = "bottomk" + VectorOpTypeTopK = "topk" + VectorOpTypeApproxTopK = "approx_topk" + VectorOpTypeSort = "sort" + VectorOpTypeSortDesc = "sort_desc" ParserLogFMT = "logfmt" ParserJSON = "json" @@ -122,6 +123,8 @@ var tokens = map[string]int{ OpConvDurationSeconds: DURATION_SECONDS_CONV, OpLogFMTStrict: LOGFMTSTRICT, OpLogFMTKeepEmpty: LOGFMTKEEPEMPTY, + "variants": VARIANTS, + "of": OF, } var funcTokens = map[string]int{ @@ -144,17 +147,18 @@ var funcTokens = map[string]int{ OpTypeVector: VECTOR, // vector ops - VectorOpTypeSum: SUM, - VectorOpTypeAvg: AVG, - VectorOpTypeMax: MAX, - VectorOpTypeMin: MIN, - VectorOpTypeCount: COUNT, - VectorOpTypeStddev: STDDEV, - VectorOpTypeStdvar: STDVAR, - VectorOpTypeBottomK: BOTTOMK, - VectorOpTypeTopK: TOPK, - VectorOpTypeSort: SORT, - VectorOpTypeSortDesc: SORT_DESC, + VectorOpTypeSum: SUM, + VectorOpTypeAvg: AVG, + VectorOpTypeMax: MAX, + VectorOpTypeMin: MIN, + VectorOpTypeCount: COUNT, + VectorOpTypeStddev: STDDEV, + VectorOpTypeStdvar: STDVAR, + VectorOpTypeBottomK: BOTTOMK, + VectorOpTypeTopK: TOPK, + VectorOpTypeApproxTopK: APPROX_TOPK, + VectorOpTypeSort: SORT, + VectorOpTypeSortDesc: SORT_DESC, OpLabelReplace: LABEL_REPLACE, OpIP: IP, diff --git a/logql/v2/parser_test.go b/logql/v2/parser_test.go index 016176b22..0fc82c300 100644 --- a/logql/v2/parser_test.go +++ b/logql/v2/parser_test.go @@ -1467,6 +1467,30 @@ func TestParseExpr(t *testing.T) { }, }, }, + { + input: `approx_topk(3,rate({foo="bar"}[5m]))`, + expr: &LogMetricExpr{ + metricOp: "approx_topk", + preamble: "3", + Expr: &LogMetricExpr{ + metricOp: "rate", + left: &LogRangeQueryExpr{ + rng: "[5m]", + left: &LogQueryExpr{ + left: &StreamMatcherExpr{ + matchers: []*labels.Matcher{ + { + Type: labels.MatchEqual, + Name: "foo", + Value: "bar", + }, + }, + }, + }, + }, + }, + }, + }, { input: `max without(value) (count_over_time({first="value"}[10h]))`, expr: &LogMetricExpr{ @@ -2087,6 +2111,99 @@ func TestParseExpr(t *testing.T) { }, }, }, + { + input: `variants(count_over_time({foo="bar"}[5m])) of ({foo="bar"}[5m])`, + expr: &LogMultiVariantExpr{ + logRange: &LogRangeQueryExpr{ + left: &LogQueryExpr{ + left: &StreamMatcherExpr{ + matchers: []*labels.Matcher{ + { + Name: "foo", + Value: "bar", + Type: labels.MatchEqual, + }, + }, + }, + }, + rng: "[5m]", + }, + variants: []LogMetricSampleExpr{ + &LogMetricExpr{ + left: &LogRangeQueryExpr{ + left: &LogQueryExpr{ + left: &StreamMatcherExpr{ + matchers: []*labels.Matcher{ + { + Name: "foo", + Value: "bar", + Type: labels.MatchEqual, + }, + }, + }, + }, + rng: "[5m]", + }, + metricOp: RangeOpTypeCount, + }, + }, + }, + }, + { + input: `variants(count_over_time({foo="bar"}[5m]), rate({foo="bar"}[5m])) of ({foo="bar"}[5m])`, + expr: &LogMultiVariantExpr{ + logRange: &LogRangeQueryExpr{ + left: &LogQueryExpr{ + left: &StreamMatcherExpr{ + matchers: []*labels.Matcher{ + { + Name: "foo", + Value: "bar", + Type: labels.MatchEqual, + }, + }, + }, + }, + rng: "[5m]", + }, + variants: []LogMetricSampleExpr{ + &LogMetricExpr{ + left: &LogRangeQueryExpr{ + left: &LogQueryExpr{ + left: &StreamMatcherExpr{ + matchers: []*labels.Matcher{ + { + Name: "foo", + Value: "bar", + Type: labels.MatchEqual, + }, + }, + }, + }, + rng: "[5m]", + }, + metricOp: RangeOpTypeCount, + }, + &LogMetricExpr{ + left: &LogRangeQueryExpr{ + left: &LogQueryExpr{ + left: &StreamMatcherExpr{ + matchers: []*labels.Matcher{ + { + Name: "foo", + Value: "bar", + Type: labels.MatchEqual, + }, + }, + }, + }, + rng: "[5m]", + }, + metricOp: RangeOpTypeRate, + }, + }, + }, + }, } for _, tc := range tc { //nolint:paralleltest t.Run(tc.input, func(t *testing.T) {