001 package groovy.sql;
002
003 import java.util.ArrayList;
004 import java.util.List;
005
006 import org.codehaus.groovy.ast.CodeVisitorSupport;
007 import org.codehaus.groovy.ast.expr.BinaryExpression;
008 import org.codehaus.groovy.ast.expr.BooleanExpression;
009 import org.codehaus.groovy.ast.expr.ConstantExpression;
010 import org.codehaus.groovy.ast.expr.Expression;
011 import org.codehaus.groovy.ast.expr.PropertyExpression;
012 import org.codehaus.groovy.ast.stmt.ReturnStatement;
013 import org.codehaus.groovy.syntax.Token;
014 import org.codehaus.groovy.syntax.Types;
015
016 /**
017 * @author James Strachan
018 * @version $Revision: 1.2 $
019 */
020 public class SqlWhereVisitor extends CodeVisitorSupport {
021
022 private StringBuffer buffer = new StringBuffer();
023 private List parameters = new ArrayList();
024
025 public String getWhere() {
026 return buffer.toString();
027 }
028
029 public void visitReturnStatement(ReturnStatement statement) {
030 statement.getExpression().visit(this);
031 }
032
033 public void visitBinaryExpression(BinaryExpression expression) {
034 Expression left = expression.getLeftExpression();
035 Expression right = expression.getRightExpression();
036
037 left.visit(this);
038 buffer.append(" ");
039
040 Token token = expression.getOperation();
041 buffer.append(tokenAsSql(token));
042
043 buffer.append(" ");
044 right.visit(this);
045 }
046
047 public void visitBooleanExpression(BooleanExpression expression) {
048 expression.getExpression().visit(this);
049 }
050
051 public void visitConstantExpression(ConstantExpression expression) {
052 getParameters().add(expression.getValue());
053 buffer.append("?");
054 }
055
056 public void visitPropertyExpression(PropertyExpression expression) {
057 buffer.append(expression.getProperty());
058 }
059
060 public List getParameters() {
061 return parameters;
062 }
063
064 protected String tokenAsSql(Token token) {
065 switch (token.getType()) {
066 case Types.COMPARE_EQUAL :
067 return "=";
068 case Types.LOGICAL_AND :
069 return "and";
070 case Types.LOGICAL_OR :
071 return "or";
072 default :
073 return token.getText();
074 }
075 }
076 }