risingwave_frontend/expr/
expr_mutator.rs

1// Copyright 2022 RisingWave Labs
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use super::{
16    AggCall, CorrelatedInputRef, ExprImpl, FunctionCall, FunctionCallWithLambda, InputRef, Literal,
17    Now, Parameter, SecretRef, Subquery, TableFunction, UserDefinedFunction, WindowFunction,
18};
19
20/// with the same visit logic of `ExprVisitor`, but mutable.
21pub trait ExprMutator {
22    fn visit_expr(&mut self, expr: &mut ExprImpl) {
23        match expr {
24            ExprImpl::InputRef(inner) => self.visit_input_ref(inner),
25            ExprImpl::Literal(inner) => self.visit_literal(inner),
26            ExprImpl::FunctionCall(inner) => self.visit_function_call(inner),
27            ExprImpl::FunctionCallWithLambda(inner) => self.visit_function_call_with_lambda(inner),
28            ExprImpl::AggCall(inner) => self.visit_agg_call(inner),
29            ExprImpl::Subquery(inner) => self.visit_subquery(inner),
30            ExprImpl::CorrelatedInputRef(inner) => self.visit_correlated_input_ref(inner),
31            ExprImpl::TableFunction(inner) => self.visit_table_function(inner),
32            ExprImpl::WindowFunction(inner) => self.visit_window_function(inner),
33            ExprImpl::UserDefinedFunction(inner) => self.visit_user_defined_function(inner),
34            ExprImpl::Parameter(inner) => self.visit_parameter(inner),
35            ExprImpl::Now(inner) => self.visit_now(inner),
36            ExprImpl::SecretRef(inner) => self.visit_secret_ref(inner),
37        }
38    }
39    fn visit_function_call(&mut self, func_call: &mut FunctionCall) {
40        func_call
41            .inputs_mut()
42            .iter_mut()
43            .for_each(|expr| self.visit_expr(expr))
44    }
45
46    fn visit_function_call_with_lambda(&mut self, func_call: &mut FunctionCallWithLambda) {
47        self.visit_function_call(func_call.base_mut())
48    }
49
50    fn visit_agg_call(&mut self, agg_call: &mut AggCall) {
51        agg_call
52            .args_mut()
53            .iter_mut()
54            .for_each(|expr| self.visit_expr(expr));
55        agg_call.order_by_mut().visit_expr_mut(self);
56        agg_call.filter_mut().visit_expr_mut(self);
57    }
58    fn visit_literal(&mut self, _: &mut Literal) {}
59    fn visit_parameter(&mut self, _: &mut Parameter) {}
60    fn visit_input_ref(&mut self, _: &mut InputRef) {}
61    fn visit_subquery(&mut self, _: &mut Subquery) {}
62    fn visit_correlated_input_ref(&mut self, _: &mut CorrelatedInputRef) {}
63    fn visit_table_function(&mut self, func_call: &mut TableFunction) {
64        func_call
65            .args
66            .iter_mut()
67            .for_each(|expr| self.visit_expr(expr))
68    }
69    fn visit_window_function(&mut self, func_call: &mut WindowFunction) {
70        func_call
71            .args
72            .iter_mut()
73            .for_each(|expr| self.visit_expr(expr));
74    }
75    fn visit_user_defined_function(&mut self, func_call: &mut UserDefinedFunction) {
76        func_call
77            .args
78            .iter_mut()
79            .for_each(|expr| self.visit_expr(expr));
80    }
81    fn visit_now(&mut self, _: &mut Now) {}
82    fn visit_secret_ref(&mut self, _: &mut SecretRef) {}
83}