Skip to content

Commit 834ea5f

Browse files
authored
feat: add support for limitk and limit_ratio (#141)
1 parent e692489 commit 834ea5f

3 files changed

Lines changed: 41 additions & 2 deletions

File tree

src/parser/parse.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1256,6 +1256,32 @@ mod tests {
12561256
let ex = Expr::from(VectorSelector::from("sum"));
12571257
Expr::new_aggregate_expr(token::T_SUM, None, FunctionArgs::new_args(ex))
12581258
}),
1259+
("limitk by (group) (-1, http_requests)", {
1260+
let ex = Expr::from(VectorSelector::from("http_requests"));
1261+
let modifier = LabelModifier::include(vec!["group"]);
1262+
let param = Expr::from(-1.0);
1263+
let args = FunctionArgs::new_args(param).append_args(ex);
1264+
Expr::new_aggregate_expr(token::T_LIMITK, Some(modifier), args)
1265+
}),
1266+
("limitk by (group) (1, http_requests)", {
1267+
let ex = Expr::from(VectorSelector::from("http_requests"));
1268+
let modifier = LabelModifier::include(vec!["group"]);
1269+
let param = Expr::from(1.0);
1270+
let args = FunctionArgs::new_args(param).append_args(ex);
1271+
Expr::new_aggregate_expr(token::T_LIMITK, Some(modifier), args)
1272+
}),
1273+
("limit_ratio(-1.1, http_requests)", {
1274+
let ex = Expr::from(VectorSelector::from("http_requests"));
1275+
let param = Expr::from(-1.1);
1276+
let args = FunctionArgs::new_args(param).append_args(ex);
1277+
Expr::new_aggregate_expr(token::T_LIMIT_RATIO, None, args)
1278+
}),
1279+
("limit_ratio(0.2, http_requests)", {
1280+
let ex = Expr::from(VectorSelector::from("http_requests"));
1281+
let param = Expr::from(0.2);
1282+
let args = FunctionArgs::new_args(param).append_args(ex);
1283+
Expr::new_aggregate_expr(token::T_LIMIT_RATIO, None, args)
1284+
}),
12591285
];
12601286
assert_cases(Case::new_result_cases(cases));
12611287

src/parser/promql.y

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ START_METRIC_SELECTOR
118118

119119
%expect-unused 'BLANK' 'COMMENT' 'ERROR' 'SEMICOLON' 'SPACE' 'TIMES' 'OPEN_HIST' 'CLOSE_HIST'
120120
%expect-unused 'OPERATORS_START' 'OPERATORS_END' 'AGGREGATORS_START' 'AGGREGATORS_END'
121-
%expect-unused 'LIMITK' 'LIMIT_RATIO' 'KEYWORDS_START' 'KEYWORDS_END' 'PREPROCESSOR_START' 'PREPROCESSOR_END'
121+
%expect-unused 'KEYWORDS_START' 'KEYWORDS_END' 'PREPROCESSOR_START' 'PREPROCESSOR_END'
122122
%expect-unused 'STEP' 'STARTSYMBOLS_START'
123123
%expect-unused 'START_METRIC' 'START_SERIES_DESCRIPTION' 'START_EXPRESSION' 'START_METRIC_SELECTOR' 'STARTSYMBOLS_END'
124124
%expect-unused 'SMOOTHED' 'ANCHORED'
@@ -572,6 +572,8 @@ metric_identifier -> Result<Token, String>:
572572
| STDVAR { lexeme_to_token($lexer, $1) }
573573
| SUM { lexeme_to_token($lexer, $1) }
574574
| TOPK { lexeme_to_token($lexer, $1) }
575+
| LIMITK { lexeme_to_token($lexer, $1) }
576+
| LIMIT_RATIO { lexeme_to_token($lexer, $1) }
575577
| WITHOUT { lexeme_to_token($lexer, $1) }
576578
| START { lexeme_to_token($lexer, $1) }
577579
| END { lexeme_to_token($lexer, $1) }
@@ -598,6 +600,8 @@ aggregate_op -> Result<Token, String>:
598600
| STDVAR { lexeme_to_token($lexer, $1) }
599601
| SUM { lexeme_to_token($lexer, $1) }
600602
| TOPK { lexeme_to_token($lexer, $1) }
603+
| LIMITK { lexeme_to_token($lexer, $1) }
604+
| LIMIT_RATIO { lexeme_to_token($lexer, $1) }
601605
;
602606

603607
// inside of grouping options label names can be recognized as keywords by the lexer.
@@ -630,6 +634,8 @@ maybe_label -> Result<Token, String>:
630634
| STDVAR { lexeme_to_token($lexer, $1) }
631635
| SUM { lexeme_to_token($lexer, $1) }
632636
| TOPK { lexeme_to_token($lexer, $1) }
637+
| LIMITK { lexeme_to_token($lexer, $1) }
638+
| LIMIT_RATIO { lexeme_to_token($lexer, $1) }
633639
| START { lexeme_to_token($lexer, $1) }
634640
| END { lexeme_to_token($lexer, $1) }
635641
| ATAN2 { lexeme_to_token($lexer, $1) }

src/parser/token.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,10 @@ impl TokenType {
230230
}
231231

232232
pub fn is_aggregator_with_param(&self) -> bool {
233-
matches!(self.0, T_TOPK | T_BOTTOMK | T_COUNT_VALUES | T_QUANTILE)
233+
matches!(
234+
self.0,
235+
T_TOPK | T_BOTTOMK | T_COUNT_VALUES | T_QUANTILE | T_LIMITK | T_LIMIT_RATIO
236+
)
234237
}
235238

236239
pub fn is_comparison_operator(&self) -> bool {
@@ -408,6 +411,8 @@ mod tests {
408411
assert!(TokenType(T_BOTTOMK).is_aggregator_with_param());
409412
assert!(TokenType(T_COUNT_VALUES).is_aggregator_with_param());
410413
assert!(TokenType(T_QUANTILE).is_aggregator_with_param());
414+
assert!(TokenType(T_LIMITK).is_aggregator_with_param());
415+
assert!(TokenType(T_LIMIT_RATIO).is_aggregator_with_param());
411416

412417
assert!(!TokenType(T_MAX).is_aggregator_with_param());
413418
assert!(!TokenType(T_MIN).is_aggregator_with_param());
@@ -479,6 +484,8 @@ mod tests {
479484
assert!(TokenType(T_STDVAR).is_aggregator());
480485
assert!(TokenType(T_SUM).is_aggregator());
481486
assert!(TokenType(T_TOPK).is_aggregator());
487+
assert!(TokenType(T_LIMITK).is_aggregator());
488+
assert!(TokenType(T_LIMIT_RATIO).is_aggregator());
482489

483490
assert!(!TokenType(T_LOR).is_aggregator());
484491
assert!(!TokenType(T_ADD).is_aggregator());

0 commit comments

Comments
 (0)