首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JSqlParser -漂亮的打印where子句

JSqlParser -漂亮的打印where子句
EN

Stack Overflow用户
提问于 2017-05-11 04:26:16
回答 1查看 1.1K关注 0票数 2

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

JSqlParser github link

事实上,我已经尝试过重写访问方法,但不知道如何实现我的目标。

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

代码语言:javascript
运行
复制
 -> a=1
 -> AND
 --> b=2 
 --> OR
 ---> c=3
 ---> AND
 ---> d=4
 -> OR
 -> e=5

我的最终目标不是一个漂亮的打印,而是理解如何知道给定状态下打印的当前深度。才能像我想的那样在树上挖洞。

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

代码语言:javascript
运行
复制
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...
    }

});

你能告诉我怎么启动这类东西吗?我必须使用访问方法,还是我错了?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-05-15 20:03:09

访问者的方式是一如既往的方式。如果你想得到括号的深度,你可以坚持使用:

代码语言:javascript
运行
复制
public void visit(Parenthesis parenthesis)

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

代码语言:javascript
运行
复制
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中。复杂的instanceof逻辑源于使用And/OrExpression进行输出。由于对于一个文本行,可能会发生多个对visitBinaryExpression的调用,因此缩进必须从最外面的部分开始。

如果您想改进JSqlParser解析语句的打印,您的更新应该提交给离职者。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43902141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档