You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2020/10/06 16:47:31 UTC
[groovy] 01/01: GROOVY-8258: Minor refactoring
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch GROOVY-8258
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit d6659c339d935210c41914f6d50ca2f3b096d64c
Author: Daniel Sun <su...@apache.org>
AuthorDate: Wed Oct 7 00:36:33 2020 +0800
GROOVY-8258: Minor refactoring
---
.../apache/groovy/linq/dsl/GinqAstWalker.groovy | 69 +++++++++++-----------
1 file changed, 35 insertions(+), 34 deletions(-)
diff --git a/subprojects/groovy-linq/src/main/groovy/org/apache/groovy/linq/dsl/GinqAstWalker.groovy b/subprojects/groovy-linq/src/main/groovy/org/apache/groovy/linq/dsl/GinqAstWalker.groovy
index 5b0c6af..0be2349 100644
--- a/subprojects/groovy-linq/src/main/groovy/org/apache/groovy/linq/dsl/GinqAstWalker.groovy
+++ b/subprojects/groovy-linq/src/main/groovy/org/apache/groovy/linq/dsl/GinqAstWalker.groovy
@@ -20,7 +20,6 @@ package org.apache.groovy.linq.dsl
import groovy.transform.CompileDynamic
import groovy.transform.CompileStatic
-import org.apache.groovy.linq.dsl.expression.AbstractGinqExpression
import org.apache.groovy.linq.dsl.expression.DataSourceExpression
import org.apache.groovy.linq.dsl.expression.FilterExpression
import org.apache.groovy.linq.dsl.expression.FromExpression
@@ -44,6 +43,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.callX
import static org.codehaus.groovy.ast.tools.GeneralUtils.lambdaX
import static org.codehaus.groovy.ast.tools.GeneralUtils.param
import static org.codehaus.groovy.ast.tools.GeneralUtils.params
+import static org.codehaus.groovy.ast.tools.GeneralUtils.propX
import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt
/**
@@ -65,7 +65,7 @@ class GinqAstWalker implements GinqVisitor<Object> {
MethodCallExpression lastJoinMethodCallExpression = null
for (JoinExpression joinExpression : simpleGinqExpression.getJoinExpressionList()) {
joinExpression.putNodeMetaData(__METHOD_CALL_RECEIVER, lastJoinMethodCallExpression ?: fromMethodCallExpression)
- joinExpression.putNodeMetaData(__ALIAS_EXPR, (lastJoinExpression ?: fromExpression).aliasExpr)
+ joinExpression.putNodeMetaData(__DATA_SOURCE_EXPRESSION, lastJoinExpression ?: fromExpression)
lastJoinExpression = joinExpression
lastJoinMethodCallExpression = this.visitInnerJoinExpression((InnerJoinExpression) lastJoinExpression)
@@ -77,9 +77,7 @@ class GinqAstWalker implements GinqVisitor<Object> {
SelectExpression selectExpression = simpleGinqExpression.getSelectExpression()
selectExpression.putNodeMetaData(__METHOD_CALL_RECEIVER, selectMethodReceiver)
-
selectExpression.putNodeMetaData(__DATA_SOURCE_EXPRESSION, lastJoinExpression ?: fromExpression)
- selectExpression.putNodeMetaData(__ALIAS_EXPR, (lastJoinExpression ?: fromExpression).aliasExpr)
MethodCallExpression selectMethodCallExpression = this.visitSelectExpression(selectExpression)
@@ -106,7 +104,8 @@ class GinqAstWalker implements GinqVisitor<Object> {
@Override
MethodCallExpression visitInnerJoinExpression(InnerJoinExpression innerJoinExpression) {
Expression receiver = innerJoinExpression.getNodeMetaData(__METHOD_CALL_RECEIVER)
- Expression receiverAliasExpr = innerJoinExpression.getNodeMetaData(__ALIAS_EXPR)
+ DataSourceExpression dataSourceExpression = innerJoinExpression.getNodeMetaData(__DATA_SOURCE_EXPRESSION)
+ Expression receiverAliasExpr = dataSourceExpression.aliasExpr
List<FilterExpression> filterExpressionList = innerJoinExpression.getFilterExpressionList()
OnExpression onExpression = (OnExpression) filterExpressionList.get(0)
@@ -166,25 +165,15 @@ class GinqAstWalker implements GinqVisitor<Object> {
Expression fromMethodCallExpression = whereExpression.getNodeMetaData(__METHOD_CALL_RECEIVER)
Expression filterExpr = whereExpression.getFilterExpr()
- boolean isJoin = dataSourceExpression instanceof JoinExpression
- if (isJoin) {
- filterExpr = correctVariablesOfGinqExpression(whereExpression, filterExpr)
- }
-
- return callXWithLambda(fromMethodCallExpression, "where", isJoin ? __T : dataSourceExpression.aliasExpr.text, filterExpr)
+ return callXWithLambda(fromMethodCallExpression, "where", dataSourceExpression, filterExpr)
}
@Override
MethodCallExpression visitSelectExpression(SelectExpression selectExpression) {
Expression selectMethodReceiver = selectExpression.getNodeMetaData(__METHOD_CALL_RECEIVER)
- Expression aliasExpr = selectExpression.getNodeMetaData(__ALIAS_EXPR)
+ DataSourceExpression dataSourceExpression = selectExpression.getNodeMetaData(__DATA_SOURCE_EXPRESSION)
Expression projectionExpr = selectExpression.getProjectionExpr()
- boolean isJoin = selectExpression.getNodeMetaData(__DATA_SOURCE_EXPRESSION) instanceof JoinExpression
- if (isJoin) {
- projectionExpr = correctVariablesOfGinqExpression(selectExpression, projectionExpr)
- }
-
List<Expression> expressionList = ((TupleExpression) projectionExpr).getExpressions()
Expression lambdaCode
if (expressionList.size() > 1) {
@@ -193,14 +182,13 @@ class GinqAstWalker implements GinqVisitor<Object> {
lambdaCode = expressionList.get(0)
}
- return callXWithLambda(selectMethodReceiver, "select", isJoin ? __T : aliasExpr.text, lambdaCode)
+ return callXWithLambda(selectMethodReceiver, "select", dataSourceExpression, lambdaCode)
}
-
- private Expression correctVariablesOfGinqExpression(AbstractGinqExpression ginqExpression, Expression expr) {
- final DataSourceExpression dataSourceExpression = ginqExpression.getNodeMetaData(__DATA_SOURCE_EXPRESSION)
- final Expression firstAliasExpr = dataSourceExpression.getNodeMetaData(__ALIAS_EXPR)
- final Expression secondAliasExpr = dataSourceExpression.aliasExpr
+ private static Expression correctVariablesOfGinqExpression(JoinExpression joinExpression, Expression expr) {
+ DataSourceExpression dataSourceExpression = joinExpression.getNodeMetaData(__DATA_SOURCE_EXPRESSION)
+ final Expression firstAliasExpr = dataSourceExpression.aliasExpr
+ final Expression secondAliasExpr = joinExpression.aliasExpr
// The synthetic lambda parameter `__t` represents the element from the result datasource of joining, e.g. `n1` innerJoin `n2`
// The element from first datasource(`n1`) is referenced via `_t.v1`
@@ -229,21 +217,23 @@ class GinqAstWalker implements GinqVisitor<Object> {
return expr
}
- @CompileDynamic
- private Expression constructFirstAliasVariableAccess() {
- macro { __t.v1 }
- }
-
- @CompileDynamic
- private Expression constructSecondAliasVariableAccess() {
- macro { __t.v2 }
- }
-
@Override
Object visit(GinqExpression expression) {
return expression.accept(this)
}
+ private static MethodCallExpression callXWithLambda(Expression receiver, String methodName, DataSourceExpression dataSourceExpression, Expression lambdaCode) {
+ String lambdaParamName
+ if (dataSourceExpression instanceof JoinExpression) {
+ lambdaParamName = __T
+ lambdaCode = correctVariablesOfGinqExpression((JoinExpression) dataSourceExpression, lambdaCode)
+ } else {
+ lambdaParamName = dataSourceExpression.aliasExpr.text
+ }
+
+ callXWithLambda(receiver, methodName, lambdaParamName, lambdaCode)
+ }
+
private static MethodCallExpression callXWithLambda(Expression receiver, String methodName, String lambdaParamName, Expression lambdaCode) {
callX(
receiver,
@@ -255,8 +245,19 @@ class GinqAstWalker implements GinqVisitor<Object> {
)
}
+ private static Expression constructFirstAliasVariableAccess() {
+ constructAliasVariableAccess('v1')
+ }
+
+ private static Expression constructSecondAliasVariableAccess() {
+ constructAliasVariableAccess('v2')
+ }
+
+ private static Expression constructAliasVariableAccess(String name) {
+ propX(new VariableExpression(__T), name)
+ }
+
private static final String __DATA_SOURCE_EXPRESSION = "__dataSourceExpression"
- private static final String __ALIAS_EXPR = "__aliasExpr"
private static final String __METHOD_CALL_RECEIVER = "__methodCallReceiver"
private static final String __T = "__t"
}