Created
August 9, 2013 01:36
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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