Java JSqlParser-Pretty print where子句

Java JSqlParser-Pretty print where子句,java,sql,where-clause,jsqlparser,Java,Sql,Where Clause,Jsqlparser,我已经开始使用JSqlParser,我可以解析Where子句,但我无法进一步使用它 事实上,我曾试图推翻访问方法,但不知道如何实现我的目标 假设我有:(a=1和(b=2或(c=3和d=4))或e=2作为输入,我想作为输出: -> a=1 -> AND --> b=2 --> OR ---> c=3 ---> AND ---> d=4 -> OR -> e=5 我的最终目标不是漂亮的打印,而是了解如何知道给定状态下打印的

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

事实上,我曾试图推翻访问方法,但不知道如何实现我的目标

假设我有:
(a=1和(b=2或(c=3和d=4))或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和ORs的简单示例。我不使用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);
}
如您所见,括号visitor改变了深度。最难的部分在
visitBinaryExpression
中。逻辑的复杂实例源于对输出使用And/OrExpression。由于对于一个文本行,可能会发生对
visitBinaryExpression
的多次调用,因此必须从最外层进行缩进

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