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 9d42fae Tweak row number support
9d42fae is described below
commit 9d42fae3e1abd4cabc7713a303e3cded4cdfeec5
Author: Daniel Sun <[email protected]>
AuthorDate: Mon Dec 28 00:54:38 2020 +0800
Tweak row number support
---
.../ginq/provider/collection/GinqAstWalker.groovy | 40 +++++++++++++++++++++-
1 file changed, 39 insertions(+), 1 deletion(-)
diff --git
a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/GinqAstWalker.groovy
b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/GinqAstWalker.groovy
index 19aa92d..aadab92 100644
---
a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/GinqAstWalker.groovy
+++
b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/GinqAstWalker.groovy
@@ -65,6 +65,7 @@ import org.codehaus.groovy.ast.expr.MethodCallExpression
import org.codehaus.groovy.ast.expr.PropertyExpression
import org.codehaus.groovy.ast.expr.TupleExpression
import org.codehaus.groovy.ast.expr.VariableExpression
+import org.codehaus.groovy.ast.stmt.BlockStatement
import org.codehaus.groovy.ast.stmt.Statement
import org.codehaus.groovy.control.SourceUnit
import org.codehaus.groovy.syntax.Types
@@ -638,6 +639,29 @@ class GinqAstWalker implements GinqAstVisitor<Expression>,
SyntaxErrorReportable
List<Expression> expressionList = ((TupleExpression)
projectionExpr).getExpressions()
validateGroupCols(expressionList)
+ boolean hasRnVariable = false
+ boolean hasOverMethodCallExpression = false
+ projectionExpr.visit(new GinqAstBaseVisitor() {
+ @Override
+ void visitVariableExpression(VariableExpression expression) {
+ if (_RN == expression.text) {
+ hasRnVariable = true
+ }
+ super.visitVariableExpression(expression)
+ }
+
+ @Override
+ void visitMethodCallExpression(MethodCallExpression call) {
+ if ('over' == call.methodAsString) {
+ hasOverMethodCallExpression = true
+ return
+ }
+ super.visitMethodCallExpression(call)
+ }
+ })
+
+ final enableCount = !hasRnVariable && hasOverMethodCallExpression
+
Expression lambdaCode = expressionList.get(0)
def expressionListSize = expressionList.size()
if (expressionListSize > 1 || (expressionListSize == 1 && lambdaCode
instanceof CastExpression)) {
@@ -739,7 +763,13 @@ class GinqAstWalker implements GinqAstVisitor<Expression>,
SyntaxErrorReportable
}
})).getExpression(0)
- def selectMethodCallExpression = callXWithLambda(selectMethodReceiver,
"select", dataSourceExpression, lambdaCode, param(ClassHelper.DYNAMIC_TYPE,
getWindowQueryableName()))
+ def extra = []
+ if (enableCount) {
+ currentGinqExpression.putNodeMetaData(__RN_USED, true)
+ extra << callX(varX(rowNumberName), 'getAndIncrement')
+ }
+
+ def selectMethodCallExpression = callXWithLambda(selectMethodReceiver,
"select", dataSourceExpression, lambdaCode, extra,
param(ClassHelper.DYNAMIC_TYPE, getWindowQueryableName()))
currentGinqExpression.putNodeMetaData(__VISITING_SELECT, false)
@@ -1181,8 +1211,16 @@ class GinqAstWalker implements
GinqAstVisitor<Expression>, SyntaxErrorReportable
}
private MethodCallExpression callXWithLambda(Expression receiver, String
methodName, DataSourceExpression dataSourceExpression, Expression lambdaCode,
Parameter... extraParams) {
+ this.callXWithLambda(receiver, methodName, dataSourceExpression,
lambdaCode, Collections.emptyList(), extraParams)
+ }
+
+ private MethodCallExpression callXWithLambda(Expression receiver, String
methodName, DataSourceExpression dataSourceExpression, Expression lambdaCode,
List<Expression> extraLambdaCode, Parameter... extraParams) {
LambdaExpression lambdaExpression =
constructLambdaExpression(dataSourceExpression, lambdaCode, extraParams)
+ if (extraLambdaCode) {
+ ((BlockStatement) lambdaExpression.code).getStatements().addAll(0,
extraLambdaCode.collect { stmt(it) })
+ }
+
callXWithLambda(receiver, methodName, lambdaExpression)
}