开发者社区> 问答> 正文

在上面的示例代码中,FunctionExtractor 类是如何工作的?

在上面的示例代码中,FunctionExtractor 类是如何工作的?

java
import org.apache.calcite.sql.SqlCall;  
import org.apache.calcite.sql.SqlFunction;  
import org.apache.calcite.sql.SqlNode;  
import org.apache.calcite.sql.parser.SqlParseException;  
import org.apache.calcite.sql.parser.SqlParser;  
import org.apache.calcite.sql.util.SqlBasicVisitor;  

import java.util.ArrayList;  
import java.util.List;  

public class CalciteTest {  

    public static void main(String[] args) throws SqlParseException {  
        String sql = "select concat('test-', upper(name)) from test limit 3";  
        SqlParser parser = SqlParser.create(sql);  
        SqlNode stmt = parser.parseStmt();  
        FunctionExtractor functionExtractor = new FunctionExtractor();  
        stmt.accept(functionExtractor);  
        System.out.println(functionExtractor.getFunctions()); // 输出 [CONCAT, UPPER]  
    }  

    private static class FunctionExtractor extends SqlBasicVisitor<Void> {  

        private final List<String> functions = new ArrayList<>();  

        @Override  
        public Void visit(SqlCall call) {  
            if (call.getOperator() instanceof SqlFunction) {  
                functions.add(call.getOperator().getName());  
            }  
            return super.visit(call);  
        }  

        public List<String> getFunctions() {  
            return functions;  
        }  
    }  
}

展开
收起
不吃核桃 2024-07-31 13:04:43 14 0
1 条回答
写回答
取消 提交回答
  • 在上面的示例代码中,FunctionExtractor 类继承自 SqlBasicVisitor 并重写了 visit(SqlCall call) 方法。当 SqlNode 树的遍历过程中遇到 SqlCall 节点时,会调用此方法。在方法中,首先检查 SqlCall 的操作符是否为 SqlFunction,如果是,则将函数名添加到 functions 列表中。最后,通过 getFunctions() 方法可以获取到所有收集到的函数名。

    2024-07-31 13:44:15
    赞同 3 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载