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

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


The following commit(s) were added to refs/heads/master by this push:
     new ada1d8fbf6f Optimize the parsing of match expressions. (#31230)
ada1d8fbf6f is described below

commit ada1d8fbf6f7ce04427272d37127c20fe86ea612
Author: Cong Hu <[email protected]>
AuthorDate: Wed May 15 17:19:17 2024 +0800

    Optimize the parsing of match expressions. (#31230)
---
 .../segment/expression/impl/MatchExpressionConverter.java        | 9 ++++++---
 .../parser/mysql/visitor/statement/MySQLStatementVisitor.java    | 8 ++++++--
 .../sql/parser/sql/common/extractor/TableExtractor.java          | 6 ++++++
 .../sql/parser/sql/common/util/ExpressionExtractUtils.java       | 2 +-
 .../sql/dialect/segment/mysql/match/MatchAgainstExpression.java  | 5 ++++-
 src/resources/checkstyle.xml                                     | 4 +++-
 .../parser/jaxb/segment/impl/expr/ExpectedMatchExpression.java   | 6 ++++++
 test/it/parser/src/main/resources/case/dml/select.xml            | 5 +++++
 8 files changed, 37 insertions(+), 8 deletions(-)

diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/MatchExpressionConverter.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/MatchExpressionConverter.java
index 69ebb4d7a49..bbb8886b9ba 100644
--- 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/MatchExpressionConverter.java
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/MatchExpressionConverter.java
@@ -24,6 +24,7 @@ import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.parser.SqlParserPos;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.mysql.match.MatchAgainstExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.converter.operator.common.SQLExtensionOperatorTable;
@@ -49,10 +50,12 @@ public final class MatchExpressionConverter {
     public static Optional<SqlNode> convert(final MatchAgainstExpression 
segment) {
         List<SqlNode> sqlNodes = new LinkedList<>();
         List<String> names = new ArrayList<>();
-        if (segment.getColumnName().getOwner().isPresent()) {
-            addOwnerNames(names, segment.getColumnName().getOwner().get());
+        for (ColumnSegment each : segment.getColumns()) {
+            if (each.getOwner().isPresent()) {
+                addOwnerNames(names, each.getOwner().get());
+            }
+            names.add(each.getIdentifier().getValue());
         }
-        names.add(segment.getColumnName().getIdentifier().getValue());
         sqlNodes.add(new SqlIdentifier(names, SqlParserPos.ZERO));
         
ExpressionConverter.convert(segment.getExpr()).ifPresent(sqlNodes::add);
         SqlNode searchModifier = 
SqlLiteral.createCharString(segment.getSearchModifier(), SqlParserPos.ZERO);
diff --git 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
index 80975d48f93..dc9b8c8cb3e 100644
--- 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
+++ 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
@@ -1283,9 +1283,13 @@ public abstract class MySQLStatementVisitor extends 
MySQLStatementBaseVisitor<AS
     
     @Override
     public final ASTNode visitMatchExpression(final MatchExpressionContext 
ctx) {
-        ColumnSegment columnSegment = (ColumnSegment) 
visit(ctx.columnRefList().columnRef(0));
         ExpressionSegment expressionSegment = (ExpressionSegment) 
visit(ctx.expr());
-        return new MatchAgainstExpression(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(), columnSegment, expressionSegment, 
getOriginalText(ctx.matchSearchModifier()), getOriginalText(ctx));
+        MatchAgainstExpression result = new 
MatchAgainstExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), 
expressionSegment, getOriginalText(ctx.matchSearchModifier()),
+                getOriginalText(ctx));
+        for (ColumnRefContext each : ctx.columnRefList().columnRef()) {
+            result.getColumns().add((ColumnSegment) visit(each));
+        }
+        return result;
     }
     
     // TODO :FIXME, sql case id: insert_with_str_to_date
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
index 49871eb2690..a6296cb69aa 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
@@ -58,6 +58,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateState
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.CreateTableStatementHandler;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.InsertStatementHandler;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.SelectStatementHandler;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.segment.mysql.match.MatchAgainstExpression;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -160,6 +161,11 @@ public final class TableExtractor {
             extractTablesFromExpression(((BinaryOperationExpression) 
expressionSegment).getLeft());
             extractTablesFromExpression(((BinaryOperationExpression) 
expressionSegment).getRight());
         }
+        if (expressionSegment instanceof MatchAgainstExpression) {
+            for (ColumnSegment each : ((MatchAgainstExpression) 
expressionSegment).getColumns()) {
+                extractTablesFromExpression(each);
+            }
+        }
         if (expressionSegment instanceof FunctionSegment) {
             for (ExpressionSegment each : ((FunctionSegment) 
expressionSegment).getParameters()) {
                 extractTablesFromExpression(each);
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtils.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtils.java
index 5b0f8a1f592..35cf9c2240b 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtils.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtils.java
@@ -220,7 +220,7 @@ public final class ExpressionExtractUtils {
             }
         }
         if (expression instanceof MatchAgainstExpression) {
-            result.add(((MatchAgainstExpression) expression).getColumnName());
+            result.addAll(((MatchAgainstExpression) expression).getColumns());
             result.addAll(extractColumns(((MatchAgainstExpression) 
expression).getExpr(), containsSubQuery));
         }
         if (expression instanceof MultisetExpression) {
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/mysql/match/MatchAgainstExpression.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/mysql/match/MatchAgainstExpression.java
index 6c14c50a8c6..57c820a3371 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/mysql/match/MatchAgainstExpression.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/mysql/match/MatchAgainstExpression.java
@@ -23,6 +23,9 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 
+import java.util.Collection;
+import java.util.LinkedList;
+
 /**
  * Match against expression.
  */
@@ -35,7 +38,7 @@ public final class MatchAgainstExpression implements 
ExpressionSegment {
     
     private final int stopIndex;
     
-    private final ColumnSegment columnName;
+    private final Collection<ColumnSegment> columns = new LinkedList<>();
     
     private final ExpressionSegment expr;
     
diff --git a/src/resources/checkstyle.xml b/src/resources/checkstyle.xml
index 1420466303c..d1545bb5e40 100644
--- a/src/resources/checkstyle.xml
+++ b/src/resources/checkstyle.xml
@@ -29,7 +29,9 @@
     <module name="FileTabCharacter">
         <property name="eachLine" value="true" />
     </module>
-    <module name="FileLength" />
+    <module name="FileLength">
+        <property name="max" value="3000" />
+    </module>
     <module name="LineLength">
         <property name="fileExtensions" value="java" />
         <property name="max" value="200" />
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedMatchExpression.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedMatchExpression.java
index 278116b992d..9a04c3776b0 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedMatchExpression.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedMatchExpression.java
@@ -20,8 +20,11 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.
 import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.column.ExpectedColumn;
 
 import javax.xml.bind.annotation.XmlElement;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
  * Expected match expression.
@@ -30,6 +33,9 @@ import javax.xml.bind.annotation.XmlElement;
 @Setter
 public class ExpectedMatchExpression extends AbstractExpectedSQLSegment 
implements ExpectedExpressionSegment {
     
+    @XmlElement
+    private final List<ExpectedColumn> columns = new LinkedList<>();
+    
     @XmlElement
     private ExpectedExpression expr;
 }
diff --git a/test/it/parser/src/main/resources/case/dml/select.xml 
b/test/it/parser/src/main/resources/case/dml/select.xml
index 142f3d2894d..ada265f45ef 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -3726,6 +3726,11 @@
                 <binary-operation-expression start-index="33" stop-index="116" 
literal-stop-index="123">
                     <left>
                         <match-expression start-index="33" stop-index="106">
+                            <columns>
+                                <column name="description" start-index="39" 
stop-index="62">
+                                    <owner name="t_order" start-index="39" 
stop-index="50" />
+                                </column>
+                            </columns>
                             <expr>
                                 <literal-expression value="hello" 
start-index="74" stop-index="80" />
                                 <parameter-marker-expression 
parameter-index="0" start-index="74" stop-index="74" />

Reply via email to