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) {