我已经开始使用JSqlParser,我可以解析Where子句,但是我无法继续使用它。

JSqlParser github link

确实,我试图覆盖访问方法,但不了解如何实现我的目标。

假设我有:(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解析语句的打印,则更新应交给解析器。

关于java - JSqlParser- pretty-print where子句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43902141/

10-13 03:36