在上面的示例代码中,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;
}
}
}
在上面的示例代码中,FunctionExtractor 类继承自 SqlBasicVisitor 并重写了 visit(SqlCall call) 方法。当 SqlNode 树的遍历过程中遇到 SqlCall 节点时,会调用此方法。在方法中,首先检查 SqlCall 的操作符是否为 SqlFunction,如果是,则将函数名添加到 functions 列表中。最后,通过 getFunctions() 方法可以获取到所有收集到的函数名。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。