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