risingwave_frontend/optimizer/plan_node/
logical_mssql_query.rs1use pretty_xmlish::XmlNode;
16use risingwave_common::bail;
17use risingwave_common::catalog::Schema;
18
19use super::generic::GenericPlanRef;
20use super::utils::{Distill, childless_record};
21use super::{
22 BatchMssqlQuery, ColPrunable, ExprRewritable, Logical, LogicalPlanRef as PlanRef,
23 LogicalProject, PlanBase, PredicatePushdown, ToBatch, ToStream, generic,
24};
25use crate::OptimizerContextRef;
26use crate::error::Result;
27use crate::optimizer::plan_node::expr_visitable::ExprVisitable;
28use crate::optimizer::plan_node::utils::column_names_pretty;
29use crate::optimizer::plan_node::{
30 ColumnPruningContext, LogicalFilter, PredicatePushdownContext, RewriteStreamContext,
31 ToStreamContext,
32};
33use crate::utils::{ColIndexMapping, Condition};
34
35#[derive(Debug, Clone, PartialEq, Eq, Hash)]
38pub struct LogicalMssqlQuery {
39 pub base: PlanBase<Logical>,
40 pub core: generic::MssqlQuery,
41}
42
43impl LogicalMssqlQuery {
44 pub fn new(
52 ctx: OptimizerContextRef,
53 schema: Schema,
54 connection: generic::MssqlConnection,
55 query: String,
56 ) -> Self {
57 let core = generic::MssqlQuery {
58 schema,
59 connection,
60 query,
61 ctx,
62 };
63
64 let base = PlanBase::new_logical_with_core(&core);
65
66 LogicalMssqlQuery { base, core }
67 }
68}
69
70impl_plan_tree_node_for_leaf! { Logical, LogicalMssqlQuery}
71impl Distill for LogicalMssqlQuery {
72 fn distill<'a>(&self) -> XmlNode<'a> {
75 let fields = vec![("columns", column_names_pretty(self.schema()))];
76 childless_record("LogicalMssqlQuery", fields)
77 }
78}
79
80impl ColPrunable for LogicalMssqlQuery {
81 fn prune_col(&self, required_cols: &[usize], _ctx: &mut ColumnPruningContext) -> PlanRef {
85 LogicalProject::with_out_col_idx(self.clone().into(), required_cols.iter().cloned()).into()
86 }
87}
88
89impl ExprRewritable<Logical> for LogicalMssqlQuery {}
90
91impl ExprVisitable for LogicalMssqlQuery {}
92
93impl PredicatePushdown for LogicalMssqlQuery {
94 fn predicate_pushdown(
98 &self,
99 predicate: Condition,
100 _ctx: &mut PredicatePushdownContext,
101 ) -> PlanRef {
102 LogicalFilter::create(self.clone().into(), predicate)
104 }
105}
106
107impl ToBatch for LogicalMssqlQuery {
108 fn to_batch(&self) -> Result<crate::optimizer::plan_node::BatchPlanRef> {
111 Ok(BatchMssqlQuery::new(self.core.clone()).into())
112 }
113}
114
115impl ToStream for LogicalMssqlQuery {
116 fn to_stream(
120 &self,
121 _ctx: &mut ToStreamContext,
122 ) -> Result<crate::optimizer::plan_node::StreamPlanRef> {
123 bail!("mssql_query function is not supported in streaming mode")
124 }
125
126 fn logical_rewrite_for_stream(
128 &self,
129 _ctx: &mut RewriteStreamContext,
130 ) -> Result<(PlanRef, ColIndexMapping)> {
131 bail!("mssql_query function is not supported in streaming mode")
132 }
133}