From 2987ad0941b6905c02737b98d7dadaae11ecddad Mon Sep 17 00:00:00 2001 From: Dennis Zhuang Date: Sat, 17 Oct 2026 15:50:19 +0800 Subject: [PATCH] refactor(promql): take RangeFunction in RangeEvaluator::try_new and keep kernels crate-private Signed-off-by: Dennis Zhuang --- src/promql/src/range_eval.rs | 15 ++++++++++++--- src/promql/src/range_eval/function.rs | 2 +- src/promql/src/range_eval/tests.rs | 24 ++++++++++++------------ 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/promql/src/range_eval.rs b/src/promql/src/range_eval.rs index e160143b351..6e0ffb4735d 100644 --- a/src/promql/src/range_eval.rs +++ b/src/promql/src/range_eval.rs @@ -43,7 +43,7 @@ pub struct RangeWindow { } /// The valid samples of one field inside one window, in source order. -pub struct FloatWindow<'a> { +pub(crate) struct FloatWindow<'a> { /// Sample timestamps shifted by the offset onto the evaluation timeline; non-empty. pub timestamps: &'a [i64], pub values: &'a [f64], @@ -53,7 +53,7 @@ pub struct FloatWindow<'a> { } /// Computes one window result; `None` means the window has no result. -pub type WindowKernel = Box) -> Option + Send>; +pub(crate) type WindowKernel = Box) -> Option + Send>; /// Evaluates range windows over raw float series, one series at a time. /// @@ -89,8 +89,17 @@ struct FieldSamples { } impl RangeEvaluator { - /// Creates an evaluator for raw series of `input` onto `grid`. + /// Creates an evaluator of `function` for raw series of `input` onto `grid`. pub fn try_new( + input: &SeriesSchema, + grid: Arc, + window: RangeWindow, + function: RangeFunction, + ) -> Result { + Self::with_kernel(input, grid, window, function.kernel()) + } + + pub(crate) fn with_kernel( input: &SeriesSchema, grid: Arc, window: RangeWindow, diff --git a/src/promql/src/range_eval/function.rs b/src/promql/src/range_eval/function.rs index b9873e270d0..d6254d4903e 100644 --- a/src/promql/src/range_eval/function.rs +++ b/src/promql/src/range_eval/function.rs @@ -29,7 +29,7 @@ pub enum RangeFunction { impl RangeFunction { /// Returns the kernel computing this function over one window. - pub fn kernel(self) -> WindowKernel { + pub(crate) fn kernel(self) -> WindowKernel { match self { Self::Rate => Box::new(extrapolated::), Self::Increase => Box::new(extrapolated::), diff --git a/src/promql/src/range_eval/tests.rs b/src/promql/src/range_eval/tests.rs index 038d1816bd0..dd61da46c85 100644 --- a/src/promql/src/range_eval/tests.rs +++ b/src/promql/src/range_eval/tests.rs @@ -93,7 +93,7 @@ fn metric(host: u64) -> MetricName { fn probe_evaluator(fields: usize, grid: Arc, window: RangeWindow) -> RangeEvaluator { let kernel: WindowKernel = Box::new(probe); - RangeEvaluator::try_new(&raw_schema(fields), grid, window, kernel).unwrap() + RangeEvaluator::with_kernel(&raw_schema(fields), grid, window, kernel).unwrap() } /// Builds a chunk whose timestamp and value arrays are slices at a nonzero offset. @@ -392,13 +392,9 @@ fn functions_match_range_udfs() { let mut rng = StdRng::seed_from_u64(seed); let fields = rng.random_range(1..=3); let (grid, window) = random_window(&mut rng); - let mut evaluator = RangeEvaluator::try_new( - &raw_schema(fields), - grid.clone(), - window, - function.kernel(), - ) - .unwrap(); + let mut evaluator = + RangeEvaluator::try_new(&raw_schema(fields), grid.clone(), window, function) + .unwrap(); for host in 0..3 { let rows = random_rows(&mut rng, fields); let expected = udf_reference(function, &rows, &grid, window, fields); @@ -420,7 +416,7 @@ fn overlapping_window_spans_chunks() { }; let kernel: WindowKernel = Box::new(sum); let mut evaluator = - RangeEvaluator::try_new(&raw_schema(1), grid(10, 10, 3), window, kernel).unwrap(); + RangeEvaluator::with_kernel(&raw_schema(1), grid(10, 10, 3), window, kernel).unwrap(); let first = chunk(&[(5, vec![Some(1.0)]), (12, vec![Some(2.0)])], 1, 0, false); let second = chunk(&[(18, vec![Some(4.0)]), (25, vec![Some(8.0)])], 1, 0, true); assert!(evaluator.push(&first).unwrap().is_none()); @@ -448,13 +444,17 @@ fn empty_input_and_series_without_results() { #[test] fn rejects_invalid_parameters() { - let kernel = || -> WindowKernel { Box::new(probe) }; let zero_range = RangeWindow { range_ms: 0, offset_ms: 0, }; assert!(matches!( - RangeEvaluator::try_new(&raw_schema(1), grid(0, 10, 4), zero_range, kernel()), + RangeEvaluator::try_new( + &raw_schema(1), + grid(0, 10, 4), + zero_range, + RangeFunction::Rate + ), Err(DataFusionError::Plan(_)) )); @@ -465,7 +465,7 @@ fn rejects_invalid_parameters() { offset_ms: 0, }; assert!(matches!( - RangeEvaluator::try_new(&evaluated, grid(0, 10, 4), window, kernel()), + RangeEvaluator::try_new(&evaluated, grid(0, 10, 4), window, RangeFunction::Rate), Err(DataFusionError::Plan(_)) )); }