Skip to content

Instantly share code, notes, and snippets.

@mnbbrown
Created August 9, 2013 01:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mnbbrown/6190466 to your computer and use it in GitHub Desktop.
Save mnbbrown/6190466 to your computer and use it in GitHub Desktop.
Transform closure into SQL WHERE statement. TODO: Get Method Values Support Multiline Closures
import org.codehaus.groovy.ast.CodeVisitorSupport
import org.codehaus.groovy.ast.MethodNode
import org.codehaus.groovy.ast.expr.BinaryExpression
import org.codehaus.groovy.ast.expr.ConstantExpression
import org.codehaus.groovy.ast.expr.Expression
import org.codehaus.groovy.ast.expr.MethodCallExpression
import org.codehaus.groovy.ast.expr.VariableExpression
import org.codehaus.groovy.ast.stmt.BlockStatement
import org.codehaus.groovy.syntax.Token
import org.codehaus.groovy.syntax.Types
class SQLTest {
String whereStatement;
public SQLTest(Closure closure){
MethodNode method = closure.getMetaClass().getClassNode().getDeclaredMethods("doCall").get(0)
BlockStatement statement = method.getCode()
WhereVisitor wv = new WhereVisitor()
statement.visit(wv)
this.whereStatement = wv.getWhere()
}
public static void main(String[] args) {
SQLTest s = new SQLTest({
hello == 1.toString()
})
println s.whereStatement
}
}
class WhereVisitor extends CodeVisitorSupport {
private final StringBuffer buffer = new StringBuffer()
private final List<Object> parameters = new ArrayList<Object>();
public void visitBinaryExpression(BinaryExpression exp){
Expression left = exp.getLeftExpression()
Expression right = exp.getRightExpression()
boolean leaf = (right instanceof ConstantExpression || left instanceof ConstantExpression);
if (!leaf) buffer.append("(")
left.visit(this)
buffer.append(" " + tokenAsSQL(exp.getOperation()) + " ")
right.visit(this)
if (!leaf) buffer.append(")")
}
public void visitMethodCallExpression(MethodCallExpression exp){
println "METHOD"
// GET METHOD VALUE
buffer.append("METHOD VALUE")
}
public void visitConstantExpression(ConstantExpression exp){
parameters.add(exp.getValue())
buffer.append("?")
}
public String getWhere(){
println parameters
return buffer.toString()
}
public void visitVariableExpression(VariableExpression expression) {
buffer.append(expression.getName())
}
String tokenAsSQL(Token token){
switch (token.getType()) {
case Types.COMPARE_EQUAL:
return "=";
case Types.LOGICAL_AND:
return "AND";
case Types.LOGICAL_OR:
return "OR";
default:
return token.getText();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment