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 }