01: package groovy.sql;
02:
03: import java.util.ArrayList;
04: import java.util.List;
05:
06: import org.codehaus.groovy.ast.CodeVisitorSupport;
07: import org.codehaus.groovy.ast.expr.BinaryExpression;
08: import org.codehaus.groovy.ast.expr.BooleanExpression;
09: import org.codehaus.groovy.ast.expr.ConstantExpression;
10: import org.codehaus.groovy.ast.expr.Expression;
11: import org.codehaus.groovy.ast.expr.PropertyExpression;
12: import org.codehaus.groovy.ast.stmt.ReturnStatement;
13: import org.codehaus.groovy.syntax.Token;
14: import org.codehaus.groovy.syntax.Types;
15:
16: /**
17: * @author James Strachan
18: * @version $Revision: 3893 $
19: */
20: public class SqlWhereVisitor extends CodeVisitorSupport {
21:
22: private StringBuffer buffer = new StringBuffer();
23: private List parameters = new ArrayList();
24:
25: public String getWhere() {
26: return buffer.toString();
27: }
28:
29: public void visitReturnStatement(ReturnStatement statement) {
30: statement.getExpression().visit(this );
31: }
32:
33: public void visitBinaryExpression(BinaryExpression expression) {
34: Expression left = expression.getLeftExpression();
35: Expression right = expression.getRightExpression();
36:
37: left.visit(this );
38: buffer.append(" ");
39:
40: Token token = expression.getOperation();
41: buffer.append(tokenAsSql(token));
42:
43: buffer.append(" ");
44: right.visit(this );
45: }
46:
47: public void visitBooleanExpression(BooleanExpression expression) {
48: expression.getExpression().visit(this );
49: }
50:
51: public void visitConstantExpression(ConstantExpression expression) {
52: getParameters().add(expression.getValue());
53: buffer.append("?");
54: }
55:
56: public void visitPropertyExpression(PropertyExpression expression) {
57: buffer.append(expression.getPropertyAsString());
58: }
59:
60: public List getParameters() {
61: return parameters;
62: }
63:
64: protected String tokenAsSql(Token token) {
65: switch (token.getType()) {
66: case Types.COMPARE_EQUAL:
67: return "=";
68: case Types.LOGICAL_AND:
69: return "and";
70: case Types.LOGICAL_OR:
71: return "or";
72: default:
73: return token.getText();
74: }
75: }
76: }
|