pub struct PromPlanner {
table_provider: DfTableSourceProvider,
ctx: PromPlannerContext,
}
Fields§
§table_provider: DfTableSourceProvider
§ctx: PromPlannerContext
Implementations§
source§impl PromPlanner
impl PromPlanner
pub async fn stmt_to_plan( table_provider: DfTableSourceProvider, stmt: &EvalStmt, session_state: &SessionState, ) -> Result<LogicalPlan, Error>
pub fn prom_expr_to_plan<'life0, 'life1, 'life_self, 'async_recursion>(
&'life_self mut self,
prom_expr: &'life0 PromExpr,
session_state: &'life1 SessionState,
) -> Pin<Box<dyn Future<Output = Result<LogicalPlan, Error>> + Send + 'async_recursion>>where
'life0: 'async_recursion,
'life1: 'async_recursion,
'life_self: 'async_recursion,
async fn prom_aggr_expr_to_plan( &mut self, session_state: &SessionState, aggr_expr: &AggregateExpr, ) -> Result<LogicalPlan, Error>
async fn prom_unary_expr_to_plan( &mut self, session_state: &SessionState, unary_expr: &UnaryExpr, ) -> Result<LogicalPlan, Error>
async fn prom_binary_expr_to_plan( &mut self, session_state: &SessionState, binary_expr: &PromBinaryExpr, ) -> Result<LogicalPlan, Error>
fn prom_number_lit_to_plan( &mut self, number_literal: &NumberLiteral, ) -> Result<LogicalPlan, Error>
fn prom_string_lit_to_plan( &mut self, string_literal: &StringLiteral, ) -> Result<LogicalPlan, Error>
async fn prom_vector_selector_to_plan( &mut self, vector_selector: &VectorSelector, ) -> Result<LogicalPlan, Error>
async fn prom_matrix_selector_to_plan( &mut self, matrix_selector: &MatrixSelector, ) -> Result<LogicalPlan, Error>
async fn prom_call_expr_to_plan( &mut self, session_state: &SessionState, call_expr: &Call, ) -> Result<LogicalPlan, Error>
async fn prom_ext_expr_to_plan( &mut self, session_state: &SessionState, ext_expr: &Extension, ) -> Result<LogicalPlan, Error>
sourcefn preprocess_label_matchers(
&mut self,
label_matchers: &Matchers,
name: &Option<String>,
) -> Result<Matchers, Error>
fn preprocess_label_matchers( &mut self, label_matchers: &Matchers, name: &Option<String>, ) -> Result<Matchers, Error>
Extract metric name from __name__
matcher and set it into PromPlannerContext.
Returns a new [Matchers] that doesn’t contain metric name matcher.
Each call to this function means new selector is started. Thus, the context will be reset at first.
Name rule:
- if
name
is some, then the matchers MUST NOT contain__name__
matcher. - if
name
is none, then the matchers MAY contain NONE OR MULTIPLE__name__
matchers.
async fn selector_to_series_normalize_plan( &mut self, offset: &Option<Offset>, label_matchers: Matchers, is_range_selector: bool, ) -> Result<LogicalPlan, Error>
sourcefn agg_modifier_to_col(
&mut self,
input_schema: &DFSchemaRef,
modifier: &Option<LabelModifier>,
) -> Result<Vec<DfExpr>, Error>
fn agg_modifier_to_col( &mut self, input_schema: &DFSchemaRef, modifier: &Option<LabelModifier>, ) -> Result<Vec<DfExpr>, Error>
Convert [LabelModifier] to [Column] exprs for aggregation. Timestamp column and tag columns will be included.
§Side effect
This method will also change the tag columns in ctx.
fn matchers_to_expr( &self, label_matchers: Matchers, ) -> Result<Vec<DfExpr>, Error>
fn table_ref(&self) -> Result<TableReference, Error>
fn build_time_index_filter( &self, offset_duration: i64, ) -> Result<Option<DfExpr>, Error>
sourceasync fn create_table_scan_plan(
&mut self,
table_ref: TableReference,
filter: Vec<DfExpr>,
) -> Result<LogicalPlan, Error>
async fn create_table_scan_plan( &mut self, table_ref: TableReference, filter: Vec<DfExpr>, ) -> Result<LogicalPlan, Error>
sourceasync fn setup_context(&mut self) -> Result<(), Error>
async fn setup_context(&mut self) -> Result<(), Error>
Setup PromPlannerContext’s state fields.
fn create_function_args( &self, args: &[Box<PromExpr>], ) -> Result<FunctionArgs, Error>
sourcefn create_function_expr(
&mut self,
func: &Function,
other_input_exprs: Vec<DfExpr>,
session_state: &SessionState,
) -> Result<Vec<DfExpr>, Error>
fn create_function_expr( &mut self, func: &Function, other_input_exprs: Vec<DfExpr>, session_state: &SessionState, ) -> Result<Vec<DfExpr>, Error>
§Side Effects
This method will update PromPlannerContext’s value fields.
fn create_time_index_column_expr(&self) -> Result<DfExpr, Error>
fn create_tag_column_exprs(&self) -> Result<Vec<DfExpr>, Error>
fn create_tag_and_time_index_column_sort_exprs( &self, ) -> Result<Vec<DfExpr>, Error>
fn create_empty_values_filter_expr(&self) -> Result<DfExpr, Error>
sourcefn create_aggregate_exprs(
&mut self,
op: TokenType,
input_plan: &LogicalPlan,
) -> Result<Vec<DfExpr>, Error>
fn create_aggregate_exprs( &mut self, op: TokenType, input_plan: &LogicalPlan, ) -> Result<Vec<DfExpr>, Error>
Create [DfExpr::AggregateFunction] expr for each value column with given aggregate function.
§Side effect
This method will update value columns in context to the new value columns created by aggregate function.
sourceasync fn create_histogram_plan(
&mut self,
args: &PromFunctionArgs,
session_state: &SessionState,
) -> Result<LogicalPlan, Error>
async fn create_histogram_plan( &mut self, args: &PromFunctionArgs, session_state: &SessionState, ) -> Result<LogicalPlan, Error>
Create a SPECIAL_HISTOGRAM_QUANTILE plan.
sourceasync fn create_vector_plan(
&mut self,
args: &PromFunctionArgs,
) -> Result<LogicalPlan, Error>
async fn create_vector_plan( &mut self, args: &PromFunctionArgs, ) -> Result<LogicalPlan, Error>
Create a SPECIAL_VECTOR_FUNCTION plan
sourceasync fn create_scalar_plan(
&mut self,
args: &PromFunctionArgs,
session_state: &SessionState,
) -> Result<LogicalPlan, Error>
async fn create_scalar_plan( &mut self, args: &PromFunctionArgs, session_state: &SessionState, ) -> Result<LogicalPlan, Error>
Create a SCALAR_FUNCTION plan
sourcefn try_build_literal_expr(expr: &PromExpr) -> Option<DfExpr>
fn try_build_literal_expr(expr: &PromExpr) -> Option<DfExpr>
Try to build a DataFusion Literal Expression from PromQL Expr, return
None
if the input is not a literal expression.
fn try_build_special_time_expr( expr: &PromExpr, time_index_col: &str, ) -> Option<DfExpr>
sourcefn try_build_float_literal(expr: &PromExpr) -> Option<f64>
fn try_build_float_literal(expr: &PromExpr) -> Option<f64>
Try to build a f64 from [PromExpr].
sourcefn prom_token_to_binary_expr_builder(
token: TokenType,
) -> Result<Box<dyn Fn(DfExpr, DfExpr) -> Result<DfExpr, Error>>, Error>
fn prom_token_to_binary_expr_builder( token: TokenType, ) -> Result<Box<dyn Fn(DfExpr, DfExpr) -> Result<DfExpr, Error>>, Error>
Return a lambda to build binary expression from token.
Because some binary operator are function in DataFusion like atan2
or ^
.
sourcefn is_token_a_comparison_op(token: TokenType) -> bool
fn is_token_a_comparison_op(token: TokenType) -> bool
Check if the given op is a comparison operator.
sourcefn is_token_a_set_op(token: TokenType) -> bool
fn is_token_a_set_op(token: TokenType) -> bool
Check if the given op is a set operator (UNION, INTERSECT and EXCEPT in SQL).
sourcefn join_on_non_field_columns(
&self,
left: LogicalPlan,
right: LogicalPlan,
left_table_ref: TableReference,
right_table_ref: TableReference,
only_join_time_index: bool,
) -> Result<LogicalPlan, Error>
fn join_on_non_field_columns( &self, left: LogicalPlan, right: LogicalPlan, left_table_ref: TableReference, right_table_ref: TableReference, only_join_time_index: bool, ) -> Result<LogicalPlan, Error>
Build a inner join on time index column and tag columns to concat two logical plans.
When only_join_time_index == true
we only join on the time index, because these two plan may not have the same tag columns
sourcefn set_op_on_non_field_columns(
&mut self,
left: LogicalPlan,
right: LogicalPlan,
left_context: PromPlannerContext,
right_context: PromPlannerContext,
op: TokenType,
modifier: &Option<BinModifier>,
) -> Result<LogicalPlan, Error>
fn set_op_on_non_field_columns( &mut self, left: LogicalPlan, right: LogicalPlan, left_context: PromPlannerContext, right_context: PromPlannerContext, op: TokenType, modifier: &Option<BinModifier>, ) -> Result<LogicalPlan, Error>
Build a set operator (AND/OR/UNLESS)
fn or_operator( &mut self, left: LogicalPlan, right: LogicalPlan, left_tag_cols_set: HashSet<String>, right_tag_cols_set: HashSet<String>, left_context: PromPlannerContext, right_context: PromPlannerContext, modifier: &Option<BinModifier>, ) -> Result<LogicalPlan, Error>
sourcefn projection_for_each_field_column<F>(
&mut self,
input: LogicalPlan,
name_to_expr: F,
) -> Result<LogicalPlan, Error>
fn projection_for_each_field_column<F>( &mut self, input: LogicalPlan, name_to_expr: F, ) -> Result<LogicalPlan, Error>
Build a projection that project and perform operation expr for every value columns. Non-value columns (tag and timestamp) will be preserved in the projection.
§Side effect
This function will update the value columns in the context. Those new column names don’t contains qualifier.
sourcefn filter_on_field_column<F>(
&self,
input: LogicalPlan,
name_to_expr: F,
) -> Result<LogicalPlan, Error>
fn filter_on_field_column<F>( &self, input: LogicalPlan, name_to_expr: F, ) -> Result<LogicalPlan, Error>
Build a filter plan that filter on value column. Notice that only one value column is expected.
sourcefn date_part_on_time_index(&self, date_part: &str) -> Result<DfExpr, Error>
fn date_part_on_time_index(&self, date_part: &str) -> Result<DfExpr, Error>
Generate an expr like date_part("hour", <TIME_INDEX>)
. Caller should ensure the
time index column in context is set
Auto Trait Implementations§
impl Freeze for PromPlanner
impl !RefUnwindSafe for PromPlanner
impl Send for PromPlanner
impl Sync for PromPlanner
impl Unpin for PromPlanner
impl !UnwindSafe for PromPlanner
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T, V> Convert<T> for Vwhere
V: Into<T>,
impl<T, V> Convert<T> for Vwhere
V: Into<T>,
fn convert(value: Self) -> T
fn convert_box(value: Box<Self>) -> Box<T>
fn convert_vec(value: Vec<Self>) -> Vec<T>
fn convert_vec_box(value: Vec<Box<Self>>) -> Vec<Box<T>>
fn convert_matrix(value: Vec<Vec<Self>>) -> Vec<Vec<T>>
fn convert_option(value: Option<Self>) -> Option<T>
fn convert_option_box(value: Option<Box<Self>>) -> Option<Box<T>>
fn convert_option_vec(value: Option<Vec<Self>>) -> Option<Vec<T>>
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.