2017-05-10 1 views
2

JSqlParserの使用を開始しましたが、Where句を解析できますが、それ以上は進めません。JSqlParser - きれいなprint 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... 
    } 

}); 

は、あなたは私にこの種のものを開始する方法を示してもらえますか?私は訪問方法で作業しなければならないのですか、間違っていますか?

ありがとうございます!

答えて

0

訪問者のやり方はいつもと同じ方法です。あなたは括弧の深さを取得したい場合は、あなたがにこだわることができます:あなたが望む出力に含まを取得するには

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を使用することから得られます。 1つのテキスト行に対してvisitBinaryExpressionへの複数の呼び出しが行われる可能性があるため、最も外側の部分からインデントを行う必要があります。

JSqlParser解析文の印刷を改善したい場合は、更新はデパーサに送られます。

+0

この回答が役に立ったとしますか?それに投票してください。 – wumpz