class BooleanExpressionVisitor extends ExpressionVisitorBase<Boolean> {

    @Override
    public Boolean visitExpression(Expression e) {
        return true;
    }

    @Override
    public Boolean visitAlias(Alias e) {
        return e.getNonAliasExpression().accept(this);
    }

    @Override
    public Boolean visitExpressionColumn(ExpressionColumn e) {
        return true;
    }

    @Override
    public Boolean visitExpressionList(ExpressionList e) {
        for (Expression e2 : e.getList()) {
            if (!e2.accept(this))
                return false;
        }
        return true;
    }

    @Override
    public Boolean visitOperation(Operation e) {
        return e.getLeft().accept(this) && (e.getRight() == null || e.getRight().accept(this));
    }

    @Override
    public Boolean visitParameter(Parameter e) {
        return true;
    }

    @Override
    public Boolean visitRownum(Rownum e) {
        return true;
    }

    @Override
    public Boolean visitSequenceValue(SequenceValue e) {
        return true;
    }

    @Override
    public Boolean visitSubQuery(SubQuery e) {
        return visitQuery(e.getQuery());
    }

    protected Boolean visitQuery(Query query) {
        return query.accept(this);
    }

    @Override
    public Boolean visitValueExpression(ValueExpression e) {
        return true;
    }

    @Override
    public Boolean visitVariable(Variable e) {
        return true;
    }

    @Override
    public Boolean visitWildcard(Wildcard e) {
        return true;
    }

    @Override
    public Boolean visitCompareLike(CompareLike e) {
        return e.getLeft().accept(this) && e.getRight().accept(this)
                && (e.getEscape() == null || e.getEscape().accept(this));
    }

    @Override
    public Boolean visitComparison(Comparison e) {
        return e.getLeft().accept(this) && (e.getRight() == null || e.getRight().accept(this));
    }

    @Override
    public Boolean visitConditionAndOr(ConditionAndOr e) {
        return e.getLeft().accept(this) && e.getRight().accept(this);
    }

    @Override
    public Boolean visitConditionExists(ConditionExists e) {
        return visitQuery(e.getQuery());
    }

    @Override
    public Boolean visitConditionIn(ConditionIn e) {
        if (!e.getLeft().accept(this)) {
            return false;
        }
        for (Expression e2 : e.getValueList()) {
            if (!e2.accept(this)) {
                return false;
            }
        }
        return true;
    }

    @Override
    public Boolean visitConditionInConstantSet(ConditionInConstantSet e) {
        return e.getLeft().accept(this);
    }

    @Override
    public Boolean visitConditionInSelect(ConditionInSelect e) {
        if (!e.getLeft().accept(this)) {
            return false;
        }
        return visitQuery(e.getQuery());
    }

    @Override
    public Boolean visitConditionNot(ConditionNot e) {
        return e.getCondition().accept(this);
    }

    @Override
    public Boolean visitAggregate(Aggregate e) {
        return e.getOn() == null || e.getOn().accept(this);
    }

    @Override
    public Boolean visitAGroupConcat(AGroupConcat e) {<FILL_FUNCTION_BODY>}

    @Override
    public Boolean visitJavaAggregate(JavaAggregate e) {
        for (Expression e2 : e.getArgs()) {
            if (e != null && !e2.accept(this)) {
                return false;
            }
        }
        return true;
    }

    @Override
    public Boolean visitFunction(Function e) {
        for (Expression e2 : e.getArgs()) {
            if (e2 != null && !e2.accept(this)) {
                return false;
            }
        }
        return true;
    }

    @Override
    public Boolean visitJavaFunction(JavaFunction e) {
        return visitFunction(e);
    }

    @Override
    public Boolean visitTableFunction(TableFunction e) {
        return visitFunction(e);
    }

    @Override
    public Boolean visitSelect(Select s) {
        ExpressionVisitor<Boolean> v2 = incrementQueryLevel(1);
        ArrayList<Expression> expressions = s.getExpressions();
        for (int i = 0, size = expressions.size(); i < size; i++) {
            Expression e = expressions.get(i);
            if (!e.accept(v2))
                return false;
        }
        if (s.getCondition() != null) {
            if (!s.getCondition().accept(v2))
                return false;
        }
        if (s.getHaving() != null) {
            if (!s.getHaving().accept(v2))
                return false;
        }
        return true;
    }

    @Override
    public Boolean visitSelectUnion(SelectUnion su) {
        return su.getLeft().accept(this) && su.getRight().accept(this);
    }
}

        if (!visitAggregate(e)) {
            return false;
        }
        if (e.getGroupConcatSeparator() != null && !e.getGroupConcatSeparator().accept(this)) {
            return false;
        }
        if (e.getGroupConcatOrderList() != null) {
            for (int i = 0, size = e.getGroupConcatOrderList().size(); i < size; i++) {
                SelectOrderBy o = e.getGroupConcatOrderList().get(i);
                if (!o.expression.accept(this)) {
                    return false;
                }
            }
        }
        return true;
    
<methods>public non-sealed void <init>() ,public int getQueryLevel() ,public ExpressionVisitorBase<java.lang.Boolean> incrementQueryLevel(int) ,public void setQueryLevel(int) <variables>private int queryLevel