2017-05-10 1 views
2

JSqlParser를 사용하기 시작 했으므로 Where 절을 구문 분석 할 수 있지만 더 이상 진행하지는 않습니다.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 

내 최종 목표는 꽤 인쇄 아니라, 주어진에서 인쇄의 현재의 깊이를 알고하는 방법을 이해하는 상태. 내가 원하는대로 나무를 파 내기 위해서.

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... 
    } 

}); 

당신이 내게 이런 종류의 일을 시작하는 방법 보여줄 수 :

나는 where 절을 구문 분석, 코드의 조각을 시작했다? 방문 방법으로 작업해야합니까, 아니면 잘못 되었습니까?

감사합니다.

답변

0

방문객 길은 언제나 한 가지 방법입니다. 당신은 괄호 깊이를 얻고 싶은 경우에, 당신이 스틱 수 : 당신이 원하는 OUPUT를 얻으려면

public void visit(Parenthesis parenthesis) 

, 조금 까다 롭습니다. AND와 OR 만 고려한 간단한 예제를 구현했습니다. ExpressionVisitorAdapter를 사용하지 않고 Expression 인쇄를 담당하는 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 구문 분석문의 인쇄를 향상 시키려면 업데이트가 deparsers로 가야합니다.

+0

이 답변으로 도움이 되었습니까? 투표 해주세요. – wumpz