This is an automated email from the ASF dual-hosted git repository.
chengzhang 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 6ca1a79d179 Use SQLBuilderEngine to include DefaultSQLBuilder and
RouteSQLBuilder (#37415)
6ca1a79d179 is described below
commit 6ca1a79d179dd1217b0f47889148672538d84fbd
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Dec 17 16:34:46 2025 +0800
Use SQLBuilderEngine to include DefaultSQLBuilder and RouteSQLBuilder
(#37415)
---
.../infra/rewrite/SQLRewriteEntry.java | 8 ++-
.../infra/rewrite/context/SQLRewriteContext.java | 4 --
.../rewrite/engine/GenericSQLRewriteEngine.java | 4 +-
.../rewrite/engine/RouteSQLRewriteEngine.java | 6 +-
.../infra/rewrite/sql/SQLBuilderEngine.java | 51 +++++++++++++
.../infra/rewrite/sql/SQLBuilderEngineTest.java | 84 ++++++++++++++++++++++
6 files changed, 145 insertions(+), 12 deletions(-)
diff --git
a/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/SQLRewriteEntry.java
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/SQLRewriteEntry.java
index 3a7e446c6fa..650a147e64d 100644
---
a/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/SQLRewriteEntry.java
+++
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/SQLRewriteEntry.java
@@ -27,6 +27,7 @@ import
org.apache.shardingsphere.infra.rewrite.context.SQLRewriteContextDecorato
import org.apache.shardingsphere.infra.rewrite.engine.GenericSQLRewriteEngine;
import org.apache.shardingsphere.infra.rewrite.engine.RouteSQLRewriteEngine;
import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteResult;
+import
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.builder.DefaultTokenGeneratorBuilder;
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.session.query.QueryContext;
@@ -76,6 +77,10 @@ public final class SQLRewriteEntry {
private SQLRewriteContext createSQLRewriteContext(final QueryContext
queryContext, final RouteContext routeContext) {
HintValueContext hintValueContext = queryContext.getHintValueContext();
SQLRewriteContext result = new SQLRewriteContext(database,
queryContext);
+ if (hintValueContext.isSkipSQLRewrite()) {
+ return result;
+ }
+ result.addSQLTokenGenerators(new
DefaultTokenGeneratorBuilder(queryContext.getSqlStatementContext()).getSQLTokenGenerators());
decorate(result, routeContext, hintValueContext);
result.generateSQLTokens();
return result;
@@ -83,9 +88,6 @@ public final class SQLRewriteEntry {
@SuppressWarnings({"unchecked", "rawtypes"})
private void decorate(final SQLRewriteContext sqlRewriteContext, final
RouteContext routeContext, final HintValueContext hintValueContext) {
- if (hintValueContext.isSkipSQLRewrite()) {
- return;
- }
for (Entry<ShardingSphereRule, SQLRewriteContextDecorator> entry :
decorators.entrySet()) {
entry.getValue().decorate(entry.getKey(), props,
sqlRewriteContext, routeContext);
}
diff --git
a/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/context/SQLRewriteContext.java
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/context/SQLRewriteContext.java
index bcb8c116235..0c6f74289d5 100644
---
a/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/context/SQLRewriteContext.java
+++
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/context/SQLRewriteContext.java
@@ -27,7 +27,6 @@ import
org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.GroupedPar
import
org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.StandardParameterBuilder;
import
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.SQLTokenGenerator;
import
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.SQLTokenGenerators;
-import
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.builder.DefaultTokenGeneratorBuilder;
import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken;
import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
import org.apache.shardingsphere.infra.session.query.QueryContext;
@@ -66,9 +65,6 @@ public final class SQLRewriteContext {
sql = queryContext.getSql();
parameters = queryContext.getParameters();
connectionContext = queryContext.getConnectionContext();
- if (!queryContext.getHintValueContext().isSkipSQLRewrite()) {
- addSQLTokenGenerators(new
DefaultTokenGeneratorBuilder(sqlStatementContext).getSQLTokenGenerators());
- }
parameterBuilder = containsGroupedParameter(sqlStatementContext) ?
buildGroupedParameterBuilder(sqlStatementContext) : new
StandardParameterBuilder(parameters);
}
diff --git
a/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/GenericSQLRewriteEngine.java
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/GenericSQLRewriteEngine.java
index 9704e019fa2..31a944dad08 100644
---
a/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/GenericSQLRewriteEngine.java
+++
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/GenericSQLRewriteEngine.java
@@ -25,7 +25,7 @@ import
org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.rewrite.context.SQLRewriteContext;
import
org.apache.shardingsphere.infra.rewrite.engine.result.GenericSQLRewriteResult;
import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteUnit;
-import org.apache.shardingsphere.infra.rewrite.sql.impl.DefaultSQLBuilder;
+import org.apache.shardingsphere.infra.rewrite.sql.SQLBuilderEngine;
import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.sqltranslator.context.SQLTranslatorContext;
import org.apache.shardingsphere.sqltranslator.rule.SQLTranslatorRule;
@@ -60,7 +60,7 @@ public final class GenericSQLRewriteEngine {
String sql = sqlRewriteContext.getSql();
List<Object> parameters =
sqlRewriteContext.getParameterBuilder().getParameters();
Optional<SQLTranslatorContext> sqlTranslatorContext =
translatorRule.translate(
- new DefaultSQLBuilder(sql,
sqlRewriteContext.getSqlTokens()).toSQL(), parameters, queryContext,
storageType, database, globalRuleMetaData);
+ new SQLBuilderEngine(sql,
sqlRewriteContext.getSqlTokens()).buildSQL(), parameters, queryContext,
storageType, database, globalRuleMetaData);
String translatedSQL = sqlTranslatorContext.isPresent() ?
sqlTranslatorContext.get().getSql() : sql;
List<Object> translatedParameters = sqlTranslatorContext.isPresent() ?
sqlTranslatorContext.get().getParameters() : parameters;
return new GenericSQLRewriteResult(new SQLRewriteUnit(translatedSQL,
translatedParameters));
diff --git
a/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
index 17e03cc1a55..9edd259168f 100644
---
a/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
+++
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
@@ -32,7 +32,7 @@ import
org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteUnit;
import
org.apache.shardingsphere.infra.rewrite.parameter.builder.ParameterBuilder;
import
org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.GroupedParameterBuilder;
import
org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.StandardParameterBuilder;
-import org.apache.shardingsphere.infra.rewrite.sql.impl.RouteSQLBuilder;
+import org.apache.shardingsphere.infra.rewrite.sql.SQLBuilderEngine;
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.route.context.RouteUnit;
import org.apache.shardingsphere.infra.session.query.QueryContext;
@@ -118,7 +118,7 @@ public final class RouteSQLRewriteEngine {
boolean containsDollarMarker =
sqlRewriteContext.getSqlStatementContext() instanceof SelectStatementContext
&& ((SelectStatementContext)
(sqlRewriteContext.getSqlStatementContext())).isContainsDollarParameterMarker();
for (RouteUnit each : routeUnits) {
- sql.add(SQLUtils.trimSemicolon(new
RouteSQLBuilder(sqlRewriteContext.getSql(), sqlRewriteContext.getSqlTokens(),
each).toSQL()));
+ sql.add(SQLUtils.trimSemicolon(new
SQLBuilderEngine(sqlRewriteContext.getSql(), sqlRewriteContext.getSqlTokens(),
each).buildSQL()));
if (containsDollarMarker && !params.isEmpty()) {
continue;
}
@@ -132,7 +132,7 @@ public final class RouteSQLRewriteEngine {
}
private String getActualSQL(final SQLRewriteContext sqlRewriteContext,
final RouteUnit routeUnit) {
- return new RouteSQLBuilder(sqlRewriteContext.getSql(),
sqlRewriteContext.getSqlTokens(), routeUnit).toSQL();
+ return new SQLBuilderEngine(sqlRewriteContext.getSql(),
sqlRewriteContext.getSqlTokens(), routeUnit).buildSQL();
}
private List<Object> getParameters(final SQLRewriteContext
sqlRewriteContext, final RouteContext routeContext, final RouteUnit routeUnit) {
diff --git
a/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/SQLBuilderEngine.java
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/SQLBuilderEngine.java
new file mode 100644
index 00000000000..502362c634b
--- /dev/null
+++
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/SQLBuilderEngine.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.rewrite.sql;
+
+import org.apache.shardingsphere.infra.rewrite.sql.impl.AbstractSQLBuilder;
+import org.apache.shardingsphere.infra.rewrite.sql.impl.DefaultSQLBuilder;
+import org.apache.shardingsphere.infra.rewrite.sql.impl.RouteSQLBuilder;
+import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken;
+import org.apache.shardingsphere.infra.route.context.RouteUnit;
+
+import java.util.List;
+
+/**
+ * SQL builder engine.
+ */
+public final class SQLBuilderEngine {
+
+ private final AbstractSQLBuilder sqlBuilder;
+
+ public SQLBuilderEngine(final String sql, final List<SQLToken> sqlTokens) {
+ sqlBuilder = new DefaultSQLBuilder(sql, sqlTokens);
+ }
+
+ public SQLBuilderEngine(final String sql, final List<SQLToken> sqlTokens,
final RouteUnit routeUnit) {
+ sqlBuilder = new RouteSQLBuilder(sql, sqlTokens, routeUnit);
+ }
+
+ /**
+ * Build SQL.
+ *
+ * @return SQL string
+ */
+ public String buildSQL() {
+ return sqlBuilder.toSQL();
+ }
+}
diff --git
a/infra/rewrite/core/src/test/java/org/apache/shardingsphere/infra/rewrite/sql/SQLBuilderEngineTest.java
b/infra/rewrite/core/src/test/java/org/apache/shardingsphere/infra/rewrite/sql/SQLBuilderEngineTest.java
new file mode 100644
index 00000000000..18041946a7a
--- /dev/null
+++
b/infra/rewrite/core/src/test/java/org/apache/shardingsphere/infra/rewrite/sql/SQLBuilderEngineTest.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.rewrite.sql;
+
+import org.apache.shardingsphere.infra.rewrite.sql.fixture.SQLTokenFixture;
+import org.apache.shardingsphere.infra.route.context.RouteMapper;
+import org.apache.shardingsphere.infra.route.context.RouteUnit;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collections;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.mock;
+
+class SQLBuilderEngineTest {
+
+ @Test
+ void assertCreateSQLBuilderEngineWithDefaultConstructor() {
+ SQLBuilderEngine actual = new SQLBuilderEngine("SELECT * FROM tbl
WHERE id=?", Collections.emptyList());
+ assertThat(actual.buildSQL(), is("SELECT * FROM tbl WHERE id=?"));
+ }
+
+ @Test
+ void assertCreateSQLBuilderEngineWithDefaultConstructorAndTokens() {
+ SQLBuilderEngine actual = new SQLBuilderEngine("SELECT * FROM tbl
WHERE id=?", Collections.singletonList(new SQLTokenFixture(14, 16)));
+ assertThat(actual.buildSQL(), is("SELECT * FROM XXX WHERE id=?"));
+ }
+
+ @Test
+ void assertCreateSQLBuilderEngineWithRouteUnitConstructor() {
+ RouteUnit routeUnit = new RouteUnit(mock(RouteMapper.class),
Collections.singletonList(new RouteMapper("tbl", "tbl_0")));
+ SQLBuilderEngine actual = new SQLBuilderEngine("SELECT * FROM tbl
WHERE id=?", Collections.emptyList(), routeUnit);
+ assertThat(actual.buildSQL(), is("SELECT * FROM tbl WHERE id=?"));
+ }
+
+ @Test
+ void assertCreateSQLBuilderEngineWithRouteUnitConstructorAndTokens() {
+ RouteUnit routeUnit = new RouteUnit(mock(RouteMapper.class),
Collections.singletonList(new RouteMapper("tbl", "tbl_0")));
+ SQLBuilderEngine actual = new SQLBuilderEngine("SELECT * FROM tbl
WHERE id=?", Collections.singletonList(new SQLTokenFixture(14, 16)), routeUnit);
+ assertThat(actual.buildSQL(), is("SELECT * FROM XXX WHERE id=?"));
+ }
+
+ @Test
+ void assertBuildSQLWithEmptyTokens() {
+ SQLBuilderEngine sqlBuilderEngine = new SQLBuilderEngine("INSERT INTO
tbl (col1, col2) VALUES (?, ?)", Collections.emptyList());
+ assertThat(sqlBuilderEngine.buildSQL(), is("INSERT INTO tbl (col1,
col2) VALUES (?, ?)"));
+ }
+
+ @Test
+ void assertBuildSQLWithMultipleTokens() {
+ SQLBuilderEngine sqlBuilderEngine = new SQLBuilderEngine("SELECT *
FROM tbl WHERE col1=? AND col2=?",
+ java.util.Arrays.asList(new SQLTokenFixture(14, 17), new
SQLTokenFixture(28, 31)));
+ assertThat(sqlBuilderEngine.buildSQL(), is("SELECT * FROM XXXWHERE
col1XXXND col2=?"));
+ }
+
+ @Test
+ void assertBuildSQLWithComplexSQL() {
+ String complexSQL = "SELECT t1.id, t2.name FROM table1 t1 JOIN table2
t2 ON t1.id = t2.id WHERE t1.status = ? ORDER BY t2.name DESC LIMIT 10";
+ SQLBuilderEngine sqlBuilderEngine = new SQLBuilderEngine(complexSQL,
Collections.singletonList(new SQLTokenFixture(14, 19)));
+ assertThat(sqlBuilderEngine.buildSQL(), is("SELECT t1.id, XXXe FROM
table1 t1 JOIN table2 t2 ON t1.id = t2.id WHERE t1.status = ? ORDER BY t2.name
DESC LIMIT 10"));
+ }
+
+ @Test
+ void assertBuildSQLWithEmptySQLString() {
+ SQLBuilderEngine sqlBuilderEngine = new SQLBuilderEngine("",
Collections.emptyList());
+ assertThat(sqlBuilderEngine.buildSQL(), is(""));
+ }
+}