JSqlParser - 漂亮的打印 where 子句

2024-01-07

我已经开始使用 JSqlParser,我可以解析Where 子句,但我无法进一步使用它。

JSqlParser github 链接 https://github.com/JSQLParser/JSqlParser

事实上,我曾尝试覆盖访问方法,但不明白如何实现我的目标。

假设我有:(a=1 AND (b=2 OR (c=3 AND d=4))) OR e=2作为输入,我想要作为输出:

 -> a=1
 -> AND
 --> b=2 
 --> OR
 ---> c=3
 ---> AND
 ---> d=4
 -> OR
 -> e=5

我的最终目标不是漂亮的打印,而是了解如何知道给定状态下打印的当前深度。为了按照我想要的方式在树上挖洞。

我开始了一段代码,解析 where 子句:

Expression expr = CCJSqlParserUtil.parseCondExpression("(a=1 AND (b=2 OR >(c=3 AND d=4))) OR e=2");
expr.accept(new ExpressionVisitorAdapter() {

    @Override
    public void visit(ExpressionClassToChoose expr) {
      some code here...
    }

});

你能告诉我如何开始这种事情吗?我必须使用访问方法还是我错了?

谢谢 !


访客方式始终是一种方式。如果你想获得括号深度,你可以坚持:

public void visit(Parenthesis parenthesis)

要获得你想要的输出,有点棘手。我实现了一个简单的示例,仅考虑 AND 和 OR。我不使用ExpressionVisitorAdapter,而是使用负责表达式打印的ExpressionDeParser。这样您就可以根据需要修改生成的输出。

public static void main(String args[]) throws JSQLParserException {
    Expression expr = CCJSqlParserUtil.parseCondExpression("(a=1 AND (b=2 OR (c=3 AND d=4))) OR e=2");
    StringBuilder b = new StringBuilder();
    expr.accept(new ExpressionDeParser(null, b) {
        int depth = 0;

        @Override
        public void visit(Parenthesis parenthesis) {
            if (parenthesis.isNot()) {
                getBuffer().append("NOT");
            }

            depth++;
            parenthesis.getExpression().accept(this);
            depth--;
        }

        @Override
        public void visit(OrExpression orExpression) {
            visitBinaryExpr(orExpression, "OR");
        }

        @Override
        public void visit(AndExpression andExpression) {
            visitBinaryExpr(andExpression, "AND");
        }

        private void visitBinaryExpr(BinaryExpression expr, String operator) {
            if (expr.isNot()) {
                getBuffer().append("NOT");
            }
            if (!(expr.getLeftExpression() instanceof OrExpression) 
                    && !(expr.getLeftExpression() instanceof AndExpression) 
                    && !(expr.getLeftExpression() instanceof Parenthesis)) {
                getBuffer().append(StringUtils.repeat("-", depth)).append(">");
            }
            expr.getLeftExpression().accept(this);
            getBuffer().append("\n").append(StringUtils.repeat("-", depth)).append(">");
            getBuffer().append(operator).append("\n");
            if (!(expr.getRightExpression() instanceof OrExpression) 
                    && !(expr.getRightExpression() instanceof AndExpression) 
                    && !(expr.getRightExpression() instanceof Parenthesis)) {
                getBuffer().append(StringUtils.repeat("-", depth)).append(">");
            }
            expr.getRightExpression().accept(this);
        }
    });

    System.out.println(b);
}

正如您所看到的,括号访问者改变了深度。困难的部分就在里面visitBinaryExpression。复杂的实例逻辑源自使用 And/OrExpression 进行输出。由于对于一个文本行多次调用visitBinaryExpression可能会发生这种情况,缩进必须从最外面的部分开始。

如果您想改进 JSqlParser 解析语句的打印,您的更新应该转到解析器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSqlParser - 漂亮的打印 where 子句 的相关文章

  • 树形表的sql查询

    我有一个树形结构的表 id parentId name 1 0 Category1 2 0 Category2 3 1 Category3 4 2 Category4 5 1 Category5 6 2 Category6 7 3 Cate
  • SQL链接服务器查询非常非常慢

    我正在通过链接服务器从视图中提取大量数据 我使用的是 SQL Server 2012 链接服务器是 SQL Server 2008 我的选择语句是 SELECT INTO MY LOCAL TABLE FROM SELECT FROM LI
  • android listviews:页眉和页脚视图

    在我的 ListActivity 中 我需要页眉和页脚视图 位于列表的顶部和底部 分别用作列表上的上一页和下一页按钮 因为我只想一次仅显示 20 个项目 我通过执行以下操作来设置头视图和脚视图 getListView addHeaderVi
  • Java中如何存储profile?

    我仍在学习 Java 的诀窍 如果有一个明显的答案 我很抱歉 我有一个占用大量内存的程序 我想找到一种方法来减少其使用 但是在阅读了许多 SO 问题后 我认为在开始优化它之前我需要证明问题出在哪里 这就是我所做的 我在程序的开头添加了一个断
  • 为什么在 Java 7 中使用方法重载时,自动装箱不会推翻可变参数?

    我们的 Java 项目中有一个 LogManager 类 如下所示 public class LogManager public void log Level logLevel Object args do something public
  • 如何按照最初给出的时区存储和显示日期?

    我有一台服务器正在从不同时区的客户端提供数据 数据源包含人物 他们的出生日期和其他事件日期 出于我们的目的 如果我们可以将日期存储为给我们的日期 那就很方便了 例如 如果客户位于加利福尼亚州 并且告诉我们该人的出生日期是 5 月 31 日
  • 如何将多种语言设置放入单个 .clang-format 文件中

    我想为 java javascript 和 c 创建一个 clang 格式 我知道如何转储单一语言的示例配置 但不知道如何合并这 3 个配置文件 有关如何将多种语言配置放入单个文件中的示例 BasedOnStyle LLVM IndentW
  • 选择出现多次的行

    TableOne PersonId PersonScore 1 10 1 20 2 99 2 40 3 45 我只需要获取 PersonId 多次出现的那些行 例如以下是我想要实现的结果集 PersonId PersonScore 1 10
  • sql server中的str_to_date函数?

    MySQL有一个函数叫STR TO DATE 将字符串转换为日期 http dev mysql com doc refman 5 1 en date and time functions html function str to date
  • 基本的 Swing 库? JGoodies,JFreeChart [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Hibernate添加带有子实体id的实体

    我的对象 状态 java Entity Table name STATE public class State Id GeneratedValue strategy GenerationType AUTO private Long id C
  • java.util.Prefs 抛出 BackingStoreException - 为什么?

    我有一个系统可以缓存启动时 SOAP 调用的微小 简单结果 我需要实例能够在启动时重新加载其缓存 以防 SOAP 服务失效 并且还需要处理使用此缓存文件的多个实例的可能性 我选择使用java util prefs但是 Java 的内置自动同
  • 在抽象类上使用 Lombok @SuperBuilder 注释和 toBuilder ?

    我有以下课程 SuperBuilder toBuilder true public abstract class Parent SuperBuilder toBuilder true public class Child extends P
  • JAXB 将不需要的命名空间声明附加到标签

    我正在实现 XMPP 的自制子协议 并且使用 StAX 和 JAXB 的组合来解析 编组消息 当我整理一条消息时 我最终会得到大量不需要的命名空间声明
  • Hibernate:单表中的父/子关系

    我几乎没有看到任何关于以下与 Hibernate 相关问题的提示 这涉及使用具有父子关系的单个数据库表来实现继承 与自身的关系 例如 CREATE TABLE Employee empId BIGINT NOT NULL AUTO INCR
  • SQL 查询运行时间太长,asp.net 停止响应

    我有一个 SQL 查询 大约需要 10 分钟才能完成 该查询的结果显示在 asp net 网页上 这里的问题是 当我在 SQL Server 上运行查询时 它工作正常 但是当从网页触发查询时 网页上不会显示任何结果 数据库大小约为9 GB
  • Java swing:为 JComboBox 实现我的 Combobox 模型

    我需要我的组合框包含组织的简称 问题是我can在下拉列表中查看组织名称 但是cant实际上选择它 我的错误在哪里 public class ToComboBoxModel extends AbstractListModel implemen
  • 如何使用 NetBeans 导入 Jackson Core JacksonFactory?

    请参阅固定导入声明的链接问题 我将在尝试 Netbeans 后更新这个问题 下面使用 Netbeans 一切应该建立 https github com NICKSAUNDERS sheets 然而 这个问题是针对 Netbeans 的 寻找
  • 如何在 spring-ws 中解析 SoapFaultClientException

    我正在使用 spring ws 2 3 1 在为 Web 服务创建客户端时 有时我得到SoapFaultClientException像下面这样
  • 多个事件分派线程

    我是 Java Swing 新手 我的问题与事件队列和调度线程相关 我读到可以有多个事件队列 每个队列应用上下文 http www java2s com Open Source Java Document 6 0 JDK Modules s

随机推荐

  • 从磁盘加载存储的 RSA 公钥/私钥?

    独立于私钥应该加密的事实 这与这个问题无关 我使用以下代码生成 RSA 密钥对 KeyPairGenerator kpg KeyPairGenerator getInstance RSA kpg initialize 2048 KeyPai
  • MVC 是否定义一个控制器应如何与另一个控制器通信?

    我指的是一般的 MVC 设计模式 如维基百科 http en wikipedia org wiki Model E2 80 93view E2 80 93controller 在进行 GUI 密集型应用程序时 我通常会拥有许多控制器 有时一
  • r 值参考铸造和临时物化

    以下代码的输出结果为 void doit const T1 const T2 T1 unsigned long T2 int t1 t2 t1 T1 t2 t1 T1 t2 t1 T1 t2 据我了解 t1 t2案例简直就是积分促销 第二种
  • 哪些文件在压缩后不会减少其大小[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我写了一个java程序用于压缩 我压缩了一些文本文件 压缩后文件大小减小 但是当我尝试压缩PDF文件时 压缩后我没有看到文件大小有任何
  • 在Python中找到第n个素数

    我用 Python 编写了以下代码段来查找第 n 个数字 我不明白为什么它不起作用 您能否只给我一个提示或指出到底是哪一点弄乱了它 而不是一个完整的解决方案 term int input What prime do you want to
  • 每个子类带有表的 Hibernate 鉴别器列

    现在我正在使用每个子类一个表的方法来建模我的数据 我的层次结构的简化是 abstract class Abstract common data stored in abstract class ConcreteTypeA1 extends
  • Oracle 连接运算符

    如何重写这个 select tab1 id tab2 id tab3 id from tab1 tab2 tab3 where tab1 col1 tab2 col1 and tab2 col2 tab3 col2 使用 OUTER JOI
  • relatedObjectDoesNotExist at /admin/login/ 用户没有个人资料

    学习 django 并创建了一个新项目 通过登录管理页面http 127 0 0 1 8000 admin http 127 0 0 1 8000 admin但是在为每个用户添加配置文件代码后 我收到以下错误 Error 用户 模型 py
  • 如何使用react hook实现多个复选框

    我想使用react hook 在我的HTML 页面上实现多个复选框 我尝试使用这个 URL 来实现 https medium com Zh0uzi my concerns with react hooks 6afda0acc672 http
  • 使用 WMI 查询时出现 perfmon 计数器值问题

    我正在构建 EXE 并通过它获取应用程序的 perfmon 计数器以使用 WMI 查询进行监控 我正在使用本地计算机对其进行测试 似乎我的代码逻辑为我提供了一些计数器的错误值 Below is my code for one of the
  • 使用 request 和 multiparty 进行 multipart/form-data 时,出现错误:uncaughtException:source.on 不是函数

    我正在尝试将数据从我的节点应用程序发送到第 3 方 HTTP 端点 我正在使用多方模块解析来自客户端的请求对象上的数据 并通过请求模块发送数据 我收到错误 错误 uncaughtException source on 不是函数 var re
  • Microsoft.SqlServer.Types 程序集会导致地理数据类型出现问题。怎么修?

    将我的项目升级并更改为目标网络 NET 4 8 并将使用的 Nuget 包升级到包管理器中的最新版本后 这带来了一系列问题 最紧迫的是无法在 DataReader 和实体框架中使用地理数据类型 数据读取组件的错误是 System Inval
  • WCF 服务库与类库项目类型

    WCF 服务库有哪些常规类库不具备的功能 编辑 我发布了我自己的答案 我错过了什么吗 它们从根本上来说只是添加了一些模板类的类库吗 我创建了两者并进行了比较 这就是我发现的 WCF服务库 添加对的引用System Runtime Seria
  • XSLT命名空间和默认命名空间问题[重复]

    这个问题在这里已经有答案了 我是 XSLT 转换的新手 我的输出 xml 中存在名称空间映射问题 输入 XML 是
  • 无法解析的标识符 NavigationButton 错误

    我是 swiftUI 的新手 只是想了解基础知识 我只是想创建一个新视图和一个将移动到该视图的按钮 当我使用下面的代码时 会出现错误 使用未解析的标识符 NavigationButton 尽管该错误是由 Xcode 生成的 import S
  • 在 SwiftUI 中使用选项卡栏弹出到根视图

    在 SwiftUI 中 有没有办法像大多数 iOS 应用程序一样通过点击选项卡栏来弹出到根视图 这是一个example https i stack imgur com RBEvL gif的预期行为 我尝试使用以编程方式弹出视图simulta
  • 搜索并突出显示 UIView 中呈现的 PDF 中的文本

    我用过眉叶 67b10ed https nodeload github com brow leaves zipball master在 UIView 中渲染 PDF 现在我的需要是搜索并突出显示文本 我已经设法获得 UIView 上文本的确
  • 代码签名错误

    我工作的公司有一个基础应用程序 他们重新设计并出售给不同的企业 我重新设计了该应用程序 并尝试将其上传到他们的帐户 但得到 BEROR Code Sign error The identity iPhone Distribution doe
  • 使用cucumber测试时sql错误无法在事务内启动事务

    我是黄瓜新手 正在学习 BDD 当我尝试填写表单并创建记录时 会显示此 sqlite 错误 尽管当我在浏览器中手动尝试代码时没有错误 我正在使用 Rails 4 这是我的控制器代码 class Admin ItemsController l
  • JSqlParser - 漂亮的打印 where 子句

    我已经开始使用 JSqlParser 我可以解析Where 子句 但我无法进一步使用它 JSqlParser github 链接 https github com JSQLParser JSqlParser 事实上 我曾尝试覆盖访问方法 但