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"
 }