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/12/09 19:37:01 UTC

[groovy] branch master updated: Minor refactoring for GINQ optimizer

This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new c9b4b91  Minor refactoring for GINQ optimizer
c9b4b91 is described below

commit c9b4b914effd21de4fda75b8ac79f6fed859411a
Author: Daniel Sun <su...@apache.org>
AuthorDate: Thu Dec 10 03:36:30 2020 +0800

    Minor refactoring for GINQ optimizer
---
 .../apache/groovy/ginq/dsl/GinqAstOptimizer.groovy | 50 ++++++++++++----------
 1 file changed, 27 insertions(+), 23 deletions(-)

diff --git a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/dsl/GinqAstOptimizer.groovy b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/dsl/GinqAstOptimizer.groovy
index 857b1a1..d9eee7c 100644
--- a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/dsl/GinqAstOptimizer.groovy
+++ b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/dsl/GinqAstOptimizer.groovy
@@ -76,20 +76,8 @@ class GinqAstOptimizer extends GinqAstBaseVisitor {
             return null
         }
 
-        List<DataSourceExpression> optimizingDataSourceExpressionList = []
-        optimizingDataSourceExpressionList << ginqExpression.fromExpression
-        for (JoinExpression joinExpression : ginqExpression.joinExpressionList) {
-            if (joinExpression.innerJoin) {
-                optimizingDataSourceExpressionList << joinExpression
-            } else if (joinExpression.leftJoin) {
-                break
-            } else {
-                optimizingDataSourceExpressionList.clear()
-                break
-            }
-        }
-
-        if (!optimizingDataSourceExpressionList) {
+        List<DataSourceExpression> dataSourcesToOptimize = findDataSourcesToOptimize(ginqExpression)
+        if (!dataSourcesToOptimize) {
             return null
         }
 
@@ -98,24 +86,24 @@ class GinqAstOptimizer extends GinqAstBaseVisitor {
             return null
         }
 
-        final List<String> optimizingAliasList =
-                (List<String>) optimizingDataSourceExpressionList.stream()
+        final List<String> aliasesToOptimize =
+                (List<String>) dataSourcesToOptimize.stream()
                         .map((DataSourceExpression e) -> e.aliasExpr.text)
                         .collect(Collectors.toList())
 
-        List<DataSourceExpression> allDataSourceExpressionList = [].tap {
+        List<DataSourceExpression> allDataSourceList = [].tap {
             it << ginqExpression.fromExpression
             it.addAll(ginqExpression.joinExpressionList)
         }
 
         final List<String> allAliasList =
-                (List<String>) allDataSourceExpressionList.stream()
+                (List<String>) allDataSourceList.stream()
                         .map((DataSourceExpression e) -> e.aliasExpr.text)
                         .collect(Collectors.toList())
 
         WhereExpression whereExpression = ginqExpression.whereExpression
         if (whereExpression) {
-            boolean transformed = transformFromClause(candidatesToOptimize, optimizingAliasList, allAliasList, optimizingDataSourceExpressionList)
+            boolean transformed = transformFromClause(candidatesToOptimize, aliasesToOptimize, allAliasList, dataSourcesToOptimize)
             if (transformed) {
                 transformWhereClause(whereExpression, ginqExpression)
             }
@@ -124,7 +112,23 @@ class GinqAstOptimizer extends GinqAstBaseVisitor {
         return null
     }
 
-    private static String constantText(ConstantExpression constantExpression) {
+    private static List<DataSourceExpression> findDataSourcesToOptimize(GinqExpression ginqExpression) {
+        List<DataSourceExpression> optimizingDataSourceExpressionList = []
+        optimizingDataSourceExpressionList << ginqExpression.fromExpression
+        for (JoinExpression joinExpression : ginqExpression.joinExpressionList) {
+            if (joinExpression.innerJoin) {
+                optimizingDataSourceExpressionList << joinExpression
+            } else if (joinExpression.leftJoin) {
+                break
+            } else {
+                optimizingDataSourceExpressionList.clear()
+                break
+            }
+        }
+        return optimizingDataSourceExpressionList
+    }
+
+    private static String constantLiteral(ConstantExpression constantExpression) {
         if (constantExpression.value instanceof CharSequence) {
             return "'''${constantExpression.value}'''"
         }
@@ -146,7 +150,7 @@ class GinqAstOptimizer extends GinqAstBaseVisitor {
             if (e instanceof BinaryExpression && e.leftExpression instanceof ConstantExpression && e.rightExpression instanceof ConstantExpression) {
                 try {
                     def result = new GroovyShell().evaluate(
-                            "${constantText((ConstantExpression) e.leftExpression)} $e.operation.text ${constantText((ConstantExpression) e.rightExpression)}")
+                            "${constantLiteral((ConstantExpression) e.leftExpression)} $e.operation.text ${constantLiteral((ConstantExpression) e.rightExpression)}")
                     if (result) {
                         return false
                     }
@@ -211,7 +215,7 @@ class GinqAstOptimizer extends GinqAstBaseVisitor {
 
         return candidatesToOptimize
     }
-    static boolean isCandidate(Expression expression) {
+    private static boolean isCandidate(Expression expression) {
         if (expression instanceof BinaryExpression && expression.operation.type in LOGICAL_OP_TYPE_LIST) {
             return false
         }
@@ -262,7 +266,7 @@ class GinqAstOptimizer extends GinqAstBaseVisitor {
         return transformed
     }
 
-    Expression correctVars(Expression expression, final String alias, final String constructedAlias) {
+    private Expression correctVars(Expression expression, final String alias, final String constructedAlias) {
         ((ListExpression) new ListExpression(Collections.singletonList(expression)).transformExpression(new ExpressionTransformer() {
             @Override
             Expression transform(Expression expr) {