3

JSqlParser を使用して SQL where 句を完全かつ簡潔に解析したいと思います。そのように個々の条件文に解析するのは簡単です

String whereClause = "a=3 AND b=4 AND c=5";
Expression expr = CCJSqlParserUtil.parseCondExpression(whereClause);
expr.accept(new ExpressionVisitorAdapter() {

    @Override
    public void visit(AndExpression expr) {
        if (expr.getLeftExpression() instanceof AndExpression) {
            expr.getLeftExpression().accept(this);
        } else if ((expr.getLeftExpression() instanceof EqualsTo)){
            System.out.println(expr.getLeftExpression());
        }
        System.out.println(expr.getRightExpression());
    }
 });

次の出力が生成されます。

a=3
b=4
c=5

私が望むのは、個々の式の左辺、演算子、および右辺を取得して、既存のフィルター オブジェクトに値を入れることができるようにすることです。

次のように、すべてのタイプの演算子の訪問機能をオーバーライドできることを知っています。

expr.accept(new ExpressionVisitorAdapter() {

@Override
public void visit(AndExpression expr) {
    if (expr.getLeftExpression() instanceof AndExpression) {
        expr.getLeftExpression().accept(this);
    } else if ((expr.getLeftExpression() instanceof EqualsTo)){
        expr.getLeftExpression().accept(this);
        System.out.println(expr.getLeftExpression());
    }
    expr.getRightExpression().accept(this);
    System.out.println(expr.getRightExpression());
}
@Override
public void visit(EqualsTo expr) {
    System.out.println(expr.getLeftExpression());
    System.out.println(expr.getStringExpression());
    System.out.println(expr.getRightExpression());
}

});

次の出力が得られます。

a
=
3
a=3
b
=
4
b=4
c
=
5
c=5

ただし、これは AND で結合された EqualsTo 条件ステートメントのみを対象としています。ご覧のとおり、論理演算子ごとに if ステートメントを作成し、比較演算子ごとに visit() 関数をオーバーライドする必要があります。これを行う簡単な方法はありますか?

4

2 に答える 2