iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >ApacheCalcite进行SQL解析(java代码实例)
  • 622
分享到

ApacheCalcite进行SQL解析(java代码实例)

2024-04-02 19:04:59 622人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

背景 当一个项目分了很多模块,很多个服务的时候,一些公共的配置就需要统一管理了,于是就有了元数据驱动! 简介 什么是Calcite?是一款开源sql解析工具, 可以将各种SQL语句解

背景

当一个项目分了很多模块,很多个服务的时候,一些公共的配置就需要统一管理了,于是就有了元数据驱动!

简介

什么是Calcite?
是一款开源sql解析工具, 可以将各种SQL语句解析成抽象语法树AST(Abstract Syntax Tree), 之后通过操作AST就可以把SQL中所要表达的算法与关系体现在具体代码之中。
Calcite能做啥?

  • SQL 解析
  • SQL 校验
  • 查询优化
  • SQL 生成器
  • 数据连接

实例

今天主要是贴出一个java代码实例,实现了:解析SQL语句中的表名
上代码:
SQL语句转化:

public static Sqlnode parseStatement(String sql) {
        SqlParser parser = SqlParser.create(sql, config.getParserConfig());
        try {
            return parser.parseQuery();
        } catch (Exception e) {
            e.printStackTrace();
            throw new UnsupportedOperationException("operation not allowed");
        }
    }

解析Select中的表名:

private static Set<String> extractSourceTableInSelectSql(SqlNode sqlNode, boolean fromOrJoin) {
        if (sqlNode == null) {
            return new HashSet<>();
        }
        final SqlKind sqlKind = sqlNode.getKind();
        if (SqlKind.SELECT.equals(sqlKind)) {
            SqlSelect selectNode = (SqlSelect) sqlNode;
            Set<String> selectList = new HashSet<>(extractSourceTableInSelectSql(selectNode.getFrom(), true));
            selectNode.getSelectList().getList().stream().filter(node -> node instanceof SqlCall)
                .forEach(node -> selectList.addAll(extractSourceTableInSelectSql(node, false)));
            selectList.addAll(extractSourceTableInSelectSql(selectNode.getWhere(), false));
            selectList.addAll(extractSourceTableInSelectSql(selectNode.getHaving(), false));
            return selectList;
        if (SqlKind.JOIN.equals(sqlKind)) {
            SqlJoin sqlJoin = (SqlJoin) sqlNode;
            Set<String> joinList = new HashSet<>();
            joinList.addAll(extractSourceTableInSelectSql(sqlJoin.getLeft(), true));
            joinList.addAll(extractSourceTableInSelectSql(sqlJoin.getRight(), true));
            return joinList;

        if (SqlKind.AS.equals(sqlKind)) {
            SqlCall sqlCall = (SqlCall) sqlNode;
            return extractSourceTableInSelectSql(sqlCall.getOperandList().get(0), fromOrJoin);
        if (SqlKind.IDENTIFIER.equals(sqlKind)) {
            Set<String> identifierList = new HashSet<>();
            if (fromOrJoin) {
                SqlIdentifier sqlIdentifier = (SqlIdentifier) sqlNode;
                identifierList.add(sqlIdentifier.toString());
            }
            return identifierList;
        Set<String> defaultList = new HashSet<>();
        if (sqlNode instanceof SqlCall) {
            SqlCall call = (SqlCall) sqlNode;
            call.getOperandList()
                .forEach(node -> defaultList.addAll(extractSourceTableInSelectSql(node, false)));
        return defaultList;
    }

解析Insert语句中的表名:

private static Set<String> extractSourceTableInInsertSql(SqlNode sqlNode, boolean fromOrJoin) {
        SqlInsert sqlInsert = (SqlInsert) sqlNode;
        Set<String> insertList = new HashSet<>(extractSourceTableInSelectSql(sqlInsert.getSource(), false));
        final SqlNode targetTable = sqlInsert.getTargetTable();
        if (targetTable instanceof SqlIdentifier) {
            insertList.add(((SqlIdentifier) targetTable).toString());
        }
        return insertList;
    }

执行效果

private static final String sql0 = "SELECT MIN(relation_id) FROM tableA JOIN TableB  GROUP BY account_instance_id, follow_account_instance_id HAVING COUNT(*)>1";

private static final String sql1 = "SELECT * FROM blog_user_relation a WHERE (a.account_instance_id,a.follow_account_instance_id) IN (SELECT account_instance_id,follow_account_instance_id FROM Blogs_info GROUP BY account_instance_id, follow_account_instance_id HAVING COUNT(*) > 1)";
private static final String sql2 = "select name from (select * from student)";
private static final String sql3 = "SELECT * FROM Student LEFT JOIN Grade ON Student.sID = Grade.gID\n" +
            "UNION\n" +
            "SELECT * FROM Student RIGHT JOIN Grade ON Student.sID = Grade.gID";
private static final String sql4 = "SELECT *\n" +
            "FROM teacher\n" +
            "WHERE birth = (SELECT MIN(birth)\n" +
            "               FROM employee)";
private static final String sql5 = "SELECT sName\n" +
            "FROM Student\n" +
            "WHERE '450' NOT IN (SELECT courseID\n" +
            "                    FROM Course\n" +
            "                    WHERE sID = Student.sID)";
final SqlNode sqlNode0 = parseStatement(sql0);
System.out.println("sqlNode0: " + extractSourceTableInSelectSql(sqlNode0, false));

结果为:

到此这篇关于Apache Calcite进行SQL解析的文章就介绍到这了,更多相关Apache Calcite解析内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: ApacheCalcite进行SQL解析(java代码实例)

本文链接: https://www.lsjlt.com/news/163812.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ApacheCalcite进行SQL解析(java代码实例)
    背景 当一个项目分了很多模块,很多个服务的时候,一些公共的配置就需要统一管理了,于是就有了元数据驱动! 简介 什么是Calcite?是一款开源SQL解析工具, 可以将各种SQL语句解...
    99+
    2024-04-02
  • java代码实例分析
    这篇文章主要介绍“java代码实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java代码实例分析”文章能帮助大家解决问题。一、几个坑爹代码的目录这样使用 StringBuffer 的方法有什...
    99+
    2023-06-16
  • Java中IO流解析及代码实例
    目录I/O简介字节流和字符流常用API字节字符流相关操作字节流读取文本内容字符流读取文本内容字节流读取文件到输出到指定位置字符流读取文件到输出到指定位置缓冲流BufferedInpu...
    99+
    2024-04-02
  • vue Proxy数据代理进行校验部分源码实例解析
    目录initProxy触发代理数据过滤总结 initProxy 数据拦截的思想除了为构建响应式系统准备,它也可以为数据进行筛选过滤,我们接着往下看初始化的代码,在合并选项后...
    99+
    2024-04-02
  • Java中IO流解析及代码实例详解
    目录1、IO流1.流和流的分类什么是IO流?IO流的分类?java.io包下需要掌握的流有16个:2.如何使用流1、输入流(读文件):FileInputStream2、输出流(写文件...
    99+
    2024-04-02
  • MyBatis特殊SQL的执行实例代码
    目录1.模糊查询2.批量删除3.动态设置表名  4.添加功能获取自增的主键总结1.模糊查询 接口: public interface SelectMapper {...
    99+
    2023-01-30
    mybatis特殊sql执行 mybatis 特殊sql
  • PHP和Java代码实例分析
    这篇文章主要介绍“PHP和Java代码实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP和Java代码实例分析”文章能帮助大家解决问题。命名案例1function getGood...
    99+
    2023-06-16
  • Java代理模式实例代码分析
    今天小编给大家分享一下Java代理模式实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、动态代理模式动态代理的特...
    99+
    2023-06-29
  • Java之Spring注解配置bean实例代码解析
    前面几篇均是使用xml配置bean,如果有上百个bean,这是不可想象的。故而,请使用注解配置bean !!!【1】注解类别@Component : 基本注解, 标识了一个受 Spring(点击这里可以下载《Spring应用开发完全手册》)...
    99+
    2023-05-31
    java spring bean
  • 如何进行Kafka 1.0.0 d代码示例分析
    这篇文章将为大家详细讲解有关如何进行Kafka 1.0.0 d代码示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。package kafka.demo;import ...
    99+
    2023-06-02
  • 如何对Python代码进行全解析
    今天就跟大家聊聊有关如何对Python代码进行全解析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python代码可以使用户避免过分的语法的羁绊而将精力主要集中到所要实现的程序任务上...
    99+
    2023-06-17
  • java实现MapReduce对文件进行切分的示例代码
    比如有海量的文本文件,如订单,页面点击事件的记录,量特别大,很难搞定。那么我们该怎样解决海量数据的计算? 1、获取总行数2、计算每个文件中存多少数据3、split切分文件4、redu...
    99+
    2024-04-02
  • Java 普通代码块静态代码块执行顺序(实例讲解)
    如下所示:class B { public B() { super(); System.out.println("构造器B"); } { System.out.println("普通的代码块B"); } static{ System...
    99+
    2023-05-31
    静态代码块 执行顺序 java
  • Java/JavaScript/ABAP代码重构实例分析
    本篇内容介绍了“Java/JavaScript/ABAP代码重构实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在方法里引入一个布尔类...
    99+
    2023-06-05
  • Java代码编写技巧实例分析
    这篇文章主要讲解了“Java代码编写技巧实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java代码编写技巧实例分析”吧!开发工具不知道有多少”老”程序员还在使用 Eclipse,这些...
    99+
    2023-06-30
  • Java的位运算实例代码分析
    今天小编给大家分享一下Java的位运算实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。位运算很久以前学习过位运算,...
    99+
    2023-07-06
  • Java注解入门案例代码分析
    这篇文章主要介绍“Java注解入门案例代码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java注解入门案例代码分析”文章能帮助大家解决问题。Talk is cheap, show me the...
    99+
    2023-07-05
  • Node中的进程与子进程实例代码分析
    本篇内容主要讲解“Node中的进程与子进程实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node中的进程与子进程实例代码分析”吧!进程:proces...
    99+
    2024-04-02
  • SQL对数据进行按月统计或对数据进行按星期统计的实例代码
     对于所有的需求,当你不知道怎么处理的时候,你就先用最简单的方法,或者说的明白一点,用最原始的方法,先实现业务需求再说。   一、对提现队列数据表“ims_checkout_task”进行汇总统计,按月汇总...
    99+
    2024-04-02
  • laravel的执行流程实例代码分析
    这篇文章主要讲解了“laravel的执行流程实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“laravel的执行流程实例代码分析”吧!1.index.php$app =&...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作