You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/06/25 09:08:13 UTC
[shardingsphere] branch master updated: Remove SQLHintExtractor (#26539)
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 5dbc236759b Remove SQLHintExtractor (#26539)
5dbc236759b is described below
commit 5dbc236759b0bb48099fcdc1d10376e13aec164f
Author: Chuxin Chen <ch...@qq.com>
AuthorDate: Sun Jun 25 17:08:06 2023 +0800
Remove SQLHintExtractor (#26539)
---
.../shadow/hint/SQLHintShadowAlgorithm.java | 5 +-
.../standard/ShardingStandardRoutingEngine.java | 15 +-
.../infra/hint/HintValueContext.java | 59 +++++++
.../infra/hint/SQLHintExtractor.java | 143 -----------------
.../shardingsphere/infra/hint/SQLHintUtils.java | 14 +-
.../infra/hint/SQLHintExtractorTest.java | 170 ---------------------
.../infra/hint/SQLHintUtilsTest.java | 90 +++++++++++
7 files changed, 163 insertions(+), 333 deletions(-)
diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/hint/SQLHintShadowAlgorithm.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/hint/SQLHintShadowAlgorithm.java
index ee7270da727..fa7bf125a22 100644
--- a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/hint/SQLHintShadowAlgorithm.java
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/hint/SQLHintShadowAlgorithm.java
@@ -17,7 +17,8 @@
package org.apache.shardingsphere.shadow.algorithm.shadow.hint;
-import org.apache.shardingsphere.infra.hint.SQLHintExtractor;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
+import org.apache.shardingsphere.infra.hint.SQLHintUtils;
import org.apache.shardingsphere.shadow.api.shadow.ShadowOperationType;
import org.apache.shardingsphere.shadow.api.shadow.hint.HintShadowAlgorithm;
import org.apache.shardingsphere.shadow.api.shadow.hint.PreciseHintShadowValue;
@@ -32,7 +33,7 @@ public final class SQLHintShadowAlgorithm implements HintShadowAlgorithm<String>
@Override
public boolean isShadow(final Collection<String> shadowTableNames, final PreciseHintShadowValue<String> noteShadowValue) {
if (ShadowOperationType.HINT_MATCH == noteShadowValue.getShadowOperationType() || shadowTableNames.contains(noteShadowValue.getLogicTableName())) {
- return new SQLHintExtractor(noteShadowValue.getValue()).isShadow();
+ return SQLHintUtils.extractHint(noteShadowValue.getValue()).map(HintValueContext::isShadow).orElse(false);
}
return false;
}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/standard/ShardingStandardRoutingEngine.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/standard/ShardingStandardRoutingEngine.java
index 6eefd27f5c7..769d055fa4c 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/standard/ShardingStandardRoutingEngine.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/standard/ShardingStandardRoutingEngine.java
@@ -22,7 +22,6 @@ import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.datanode.DataNode;
import org.apache.shardingsphere.infra.hint.HintManager;
import org.apache.shardingsphere.infra.hint.HintValueContext;
-import org.apache.shardingsphere.infra.hint.SQLHintExtractor;
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.route.context.RouteMapper;
import org.apache.shardingsphere.infra.route.context.RouteUnit;
@@ -68,7 +67,7 @@ public final class ShardingStandardRoutingEngine implements ShardingRouteEngine
private final Collection<Collection<DataNode>> originalDataNodes = new LinkedList<>();
- private final SQLHintExtractor sqlHintExtractor;
+ private final HintValueContext hintValueContext;
public ShardingStandardRoutingEngine(final String logicTableName, final ShardingConditions shardingConditions, final SQLStatementContext sqlStatementContext,
final HintValueContext hintValueContext, final ConfigurationProperties props) {
@@ -76,7 +75,7 @@ public final class ShardingStandardRoutingEngine implements ShardingRouteEngine
this.shardingConditions = shardingConditions;
this.sqlStatementContext = sqlStatementContext;
this.props = props;
- this.sqlHintExtractor = new SQLHintExtractor(sqlStatementContext.getSqlStatement(), hintValueContext);
+ this.hintValueContext = hintValueContext;
}
@Override
@@ -113,7 +112,7 @@ public final class ShardingStandardRoutingEngine implements ShardingRouteEngine
private boolean isRoutingBySQLHint() {
Collection<String> tableNames = sqlStatementContext.getTablesContext().getTableNames();
for (String each : tableNames) {
- if (sqlHintExtractor.containsHintShardingValue(each)) {
+ if (hintValueContext.containsHintShardingValue(each)) {
return true;
}
}
@@ -203,8 +202,8 @@ public final class ShardingStandardRoutingEngine implements ShardingRouteEngine
Collection<Comparable<?>> shardingValues = new LinkedList<>();
Collection<String> tableNames = sqlStatementContext.getTablesContext().getTableNames();
for (String each : tableNames) {
- if (each.equals(logicTableName) && sqlHintExtractor.containsHintShardingDatabaseValue(each)) {
- shardingValues.addAll(sqlHintExtractor.getHintShardingDatabaseValue(each));
+ if (each.equals(logicTableName) && hintValueContext.containsHintShardingDatabaseValue(each)) {
+ shardingValues.addAll(hintValueContext.getHintShardingDatabaseValue(each));
}
}
return getShardingConditions(shardingValues);
@@ -221,8 +220,8 @@ public final class ShardingStandardRoutingEngine implements ShardingRouteEngine
Collection<Comparable<?>> shardingValues = new LinkedList<>();
Collection<String> tableNames = sqlStatementContext.getTablesContext().getTableNames();
for (String each : tableNames) {
- if (each.equals(logicTableName) && sqlHintExtractor.containsHintShardingTableValue(each)) {
- shardingValues.addAll(sqlHintExtractor.getHintShardingTableValue(each));
+ if (each.equals(logicTableName) && hintValueContext.containsHintShardingTableValue(each)) {
+ shardingValues.addAll(hintValueContext.getHintShardingTableValue(each));
}
}
return getShardingConditions(shardingValues);
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/HintValueContext.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/HintValueContext.java
index 0372a3cf41b..beedb5c7d3e 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/HintValueContext.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/HintValueContext.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.infra.hint;
+import com.google.common.base.Joiner;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import lombok.Getter;
@@ -69,4 +70,62 @@ public final class HintValueContext {
public Optional<String> findHintDataSourceName() {
return dataSourceName.isEmpty() ? Optional.empty() : Optional.of(dataSourceName);
}
+
+ /**
+ * Judge contains hint sharding databases value or not.
+ *
+ * @param tableName table name
+ * @return contains hint sharding databases value or not
+ */
+ public boolean containsHintShardingDatabaseValue(final String tableName) {
+ String key = Joiner.on(".").join(tableName.toUpperCase(), SQLHintPropertiesKey.SHARDING_DATABASE_VALUE_KEY.getKey());
+ return shardingDatabaseValues.containsKey(key) || shardingDatabaseValues.containsKey(SQLHintPropertiesKey.SHARDING_DATABASE_VALUE_KEY.getKey());
+ }
+
+ /**
+ * Judge contains hint sharding table value or not.
+ *
+ * @param tableName table name
+ * @return Contains hint sharding table value or not
+ */
+ public boolean containsHintShardingTableValue(final String tableName) {
+ String key = Joiner.on(".").join(tableName.toUpperCase(), SQLHintPropertiesKey.SHARDING_TABLE_VALUE_KEY.getKey());
+ return shardingTableValues.containsKey(key) || shardingTableValues.containsKey(SQLHintPropertiesKey.SHARDING_TABLE_VALUE_KEY.getKey());
+ }
+
+ /**
+ * Judge contains hint sharding value or not.
+ *
+ * @param tableName table name
+ * @return Contains hint sharding value or not
+ */
+ public boolean containsHintShardingValue(final String tableName) {
+ return containsHintShardingDatabaseValue(tableName) || containsHintShardingTableValue(tableName);
+ }
+
+ /**
+ * Get hint sharding table value.
+ *
+ * @param tableName table name
+ * @return sharding table value
+ */
+ public Collection<Comparable<?>> getHintShardingTableValue(final String tableName) {
+ String key = String.join(".", tableName.toUpperCase(), SQLHintPropertiesKey.SHARDING_TABLE_VALUE_KEY.getKey());
+ return shardingTableValues.containsKey(key)
+ ? shardingTableValues.get(key)
+ : shardingTableValues.get(SQLHintPropertiesKey.SHARDING_TABLE_VALUE_KEY.getKey());
+ }
+
+ /**
+ * Get hint sharding database value.
+ *
+ * @param tableName table name
+ * @return sharding database value
+ */
+ public Collection<Comparable<?>> getHintShardingDatabaseValue(final String tableName) {
+ String key = String.join(".", tableName.toUpperCase(), SQLHintPropertiesKey.SHARDING_DATABASE_VALUE_KEY.getKey());
+ return shardingDatabaseValues.containsKey(key)
+ ? shardingDatabaseValues.get(key)
+ : shardingDatabaseValues.get(SQLHintPropertiesKey.SHARDING_DATABASE_VALUE_KEY.getKey());
+ }
}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintExtractor.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintExtractor.java
deleted file mode 100644
index 443fdb107b0..00000000000
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintExtractor.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * 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.hint;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Strings;
-import lombok.Getter;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-
-import java.util.Collection;
-
-/**
- * SQL hint extractor.
- */
-@Getter
-public final class SQLHintExtractor {
-
- private final HintValueContext hintValueContext;
-
- public SQLHintExtractor(final String sqlComment) {
- hintValueContext = Strings.isNullOrEmpty(sqlComment) ? new HintValueContext() : SQLHintUtils.extractHint(sqlComment).orElseGet(HintValueContext::new);
- }
-
- public SQLHintExtractor(final SQLStatement sqlStatement) {
- this(sqlStatement, new HintValueContext());
- }
-
- public SQLHintExtractor(final SQLStatement sqlStatement, final HintValueContext hintValueContext) {
- this.hintValueContext = sqlStatement instanceof AbstractSQLStatement && !((AbstractSQLStatement) sqlStatement).getCommentSegments().isEmpty()
- ? SQLHintUtils.extractHint(((AbstractSQLStatement) sqlStatement).getCommentSegments().iterator().next().getText()).orElse(hintValueContext)
- : hintValueContext;
- }
-
- /**
- * Judge whether is hint routed to write data source or not.
- *
- * @return whether is hint routed to write data source or not
- */
- public boolean isHintWriteRouteOnly() {
- return hintValueContext.isWriteRouteOnly();
- }
-
- /**
- * Judge whether hint skip sql rewrite or not.
- *
- * @return whether hint skip sql rewrite or not
- */
- public boolean isHintSkipSQLRewrite() {
- return hintValueContext.isSkipSQLRewrite();
- }
-
- /**
- * Judge whether is hint routed to shadow data source or not.
- *
- * @return whether is hint routed to shadow data source or not
- */
- public boolean isShadow() {
- return hintValueContext.isShadow();
- }
-
- /**
- * Find hint disable audit names.
- *
- * @return disable audit names
- */
- public Collection<String> findDisableAuditNames() {
- return SQLHintUtils.getSplitterSQLHintValue(hintValueContext.getDisableAuditNames());
- }
-
- /**
- * Get hint sharding database value.
- *
- * @param tableName table name
- * @return sharding database value
- */
- public Collection<Comparable<?>> getHintShardingDatabaseValue(final String tableName) {
- String key = String.join(".", tableName.toUpperCase(), SQLHintPropertiesKey.SHARDING_DATABASE_VALUE_KEY.getKey());
- return hintValueContext.getShardingDatabaseValues().containsKey(key)
- ? hintValueContext.getShardingDatabaseValues().get(key)
- : hintValueContext.getShardingDatabaseValues().get(SQLHintPropertiesKey.SHARDING_DATABASE_VALUE_KEY.getKey());
- }
-
- /**
- * Judge contains hint sharding databases value or not.
- *
- * @param tableName table name
- * @return contains hint sharding databases value or not
- */
- public boolean containsHintShardingDatabaseValue(final String tableName) {
- String key = Joiner.on(".").join(tableName.toUpperCase(), SQLHintPropertiesKey.SHARDING_DATABASE_VALUE_KEY.getKey());
- return hintValueContext.getShardingDatabaseValues().containsKey(key) || hintValueContext.getShardingDatabaseValues().containsKey(SQLHintPropertiesKey.SHARDING_DATABASE_VALUE_KEY.getKey());
- }
-
- /**
- * Get hint sharding table value.
- *
- * @param tableName table name
- * @return sharding table value
- */
- public Collection<Comparable<?>> getHintShardingTableValue(final String tableName) {
- String key = String.join(".", tableName.toUpperCase(), SQLHintPropertiesKey.SHARDING_TABLE_VALUE_KEY.getKey());
- return hintValueContext.getShardingTableValues().containsKey(key)
- ? hintValueContext.getShardingTableValues().get(key)
- : hintValueContext.getShardingTableValues().get(SQLHintPropertiesKey.SHARDING_TABLE_VALUE_KEY.getKey());
- }
-
- /**
- * Judge contains hint sharding table value or not.
- *
- * @param tableName table name
- * @return Contains hint sharding table value or not
- */
- public boolean containsHintShardingTableValue(final String tableName) {
- String key = Joiner.on(".").join(tableName.toUpperCase(), SQLHintPropertiesKey.SHARDING_TABLE_VALUE_KEY.getKey());
- return hintValueContext.getShardingTableValues().containsKey(key) || hintValueContext.getShardingTableValues().containsKey(SQLHintPropertiesKey.SHARDING_TABLE_VALUE_KEY.getKey());
- }
-
- /**
- * Judge contains hint sharding value or not.
- *
- * @param tableName table name
- * @return Contains hint sharding value or not
- */
- public boolean containsHintShardingValue(final String tableName) {
- return containsHintShardingDatabaseValue(tableName) || containsHintShardingTableValue(tableName);
- }
-}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintUtils.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintUtils.java
index 7541368ac6d..5ee411150bd 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintUtils.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintUtils.java
@@ -47,16 +47,6 @@ public final class SQLHintUtils {
private static final int SQL_HINT_VALUE_SIZE = 2;
- /**
- * Whether the SQL statement starts with the hint prefix.
- *
- * @param sql SQL statement
- * @return whether starts with hint prefix
- */
- public static boolean startWithHint(final String sql) {
- return sql.startsWith(SQLHintTokenEnum.SQL_START_HINT_TOKEN.getKey()) || sql.startsWith(SQLHintTokenEnum.SQL_START_HINT_TOKEN.getAlias());
- }
-
/**
* Get SQL hint props.
*
@@ -145,6 +135,10 @@ public final class SQLHintUtils {
return Optional.of(result);
}
+ private static boolean startWithHint(final String sql) {
+ return sql.startsWith(SQLHintTokenEnum.SQL_START_HINT_TOKEN.getKey()) || sql.startsWith(SQLHintTokenEnum.SQL_START_HINT_TOKEN.getAlias());
+ }
+
private static boolean containsPropertyKey(final Properties hintProperties, final SQLHintPropertiesKey sqlHintPropertiesKey) {
return hintProperties.containsKey(sqlHintPropertiesKey.getKey()) || hintProperties.containsKey(sqlHintPropertiesKey.getAlias());
}
diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/hint/SQLHintExtractorTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/hint/SQLHintExtractorTest.java
deleted file mode 100644
index ea3a00244a0..00000000000
--- a/infra/common/src/test/java/org/apache/shardingsphere/infra/hint/SQLHintExtractorTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * 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.hint;
-
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.CommentSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
-import org.junit.jupiter.api.Test;
-
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Optional;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-class SQLHintExtractorTest {
-
- @Test
- void assertSQLHintWriteRouteOnly() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* SHARDINGSPHERE_HINT: WRITE_ROUTE_ONLY=true */", 0, 0)));
- assertTrue(new SQLHintExtractor(statement).isHintWriteRouteOnly());
- }
-
- @Test
- void assertSQLHintSkipSQLRewrite() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* SHARDINGSPHERE_HINT: SKIP_SQL_REWRITE=true */", 0, 0)));
- assertTrue(new SQLHintExtractor(statement).isHintSkipSQLRewrite());
- }
-
- @Test
- void assertSQLHintSkipSQLRewriteWithCommentString() {
- assertTrue(new SQLHintExtractor("/* SHARDINGSPHERE_HINT: SKIP_SQL_REWRITE=true */").isHintSkipSQLRewrite());
- }
-
- @Test
- void assertSQLHintDisableAuditNames() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* SHARDINGSPHERE_HINT: DISABLE_AUDIT_NAMES=sharding_audit1 sharding_audit2 */", 0, 0)));
- Collection<String> actual = new SQLHintExtractor(statement).findDisableAuditNames();
- assertThat(actual.size(), is(2));
- assertTrue(actual.containsAll(Arrays.asList("sharding_audit1", "sharding_audit2")));
- }
-
- @Test
- void assertSQLHintDisableAuditNamesWithCommentString() {
- Collection<String> actual = new SQLHintExtractor("/* SHARDINGSPHERE_HINT: DISABLE_AUDIT_NAMES=sharding_audit1 sharding_audit2 */").findDisableAuditNames();
- assertThat(actual.size(), is(2));
- assertTrue(actual.containsAll(Arrays.asList("sharding_audit1", "sharding_audit2")));
- }
-
- @Test
- void assertSQLHintShardingDatabaseValue() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* SHARDINGSPHERE_HINT: SHARDING_DATABASE_VALUE=10 */", 0, 0)));
- assertThat(new SQLHintExtractor(statement).getHintShardingDatabaseValue("t_order"), is(Collections.singletonList(new BigInteger("10"))));
- }
-
- @Test
- void assertSQLHintShardingDatabaseValueWithTableName() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* SHARDINGSPHERE_HINT: t_order.SHARDING_DATABASE_VALUE=10 */", 0, 0)));
- assertThat(new SQLHintExtractor(statement).getHintShardingDatabaseValue("t_order"), is(Collections.singletonList(new BigInteger("10"))));
- }
-
- @Test
- void assertSQLHintShardingDatabaseValueWithCommentString() {
- assertThat(new SQLHintExtractor("/* SHARDINGSPHERE_HINT: SHARDING_DATABASE_VALUE=10 */").getHintShardingDatabaseValue("t_order"), is(Collections.singletonList(new BigInteger("10"))));
- }
-
- @Test
- void assertSQLHintShardingDatabaseValueWithStringHintValue() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* SHARDINGSPHERE_HINT: t_order.SHARDING_DATABASE_VALUE=a */", 0, 0)));
- assertThat(new SQLHintExtractor(statement).getHintShardingDatabaseValue("t_order"), is(Collections.singletonList("a")));
- }
-
- @Test
- void assertSQLHintShardingTableValue() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* SHARDINGSPHERE_HINT: SHARDING_TABLE_VALUE=10 */", 0, 0)));
- assertThat(new SQLHintExtractor(statement).getHintShardingTableValue("t_order"), is(Collections.singletonList(new BigInteger("10"))));
- }
-
- @Test
- void assertSQLHintShardingTableValueWithCommentString() {
- assertThat(new SQLHintExtractor("/* SHARDINGSPHERE_HINT: SHARDING_TABLE_VALUE=10 */").getHintShardingTableValue("t_order"), is(Collections.singletonList(new BigInteger("10"))));
- }
-
- @Test
- void assertSQLHintShardingTableValueWithTableName() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* SHARDINGSPHERE_HINT: t_order.SHARDING_TABLE_VALUE=10 */", 0, 0)));
- assertThat(new SQLHintExtractor(statement).getHintShardingTableValue("t_order"), is(Collections.singletonList(new BigInteger("10"))));
- }
-
- @Test
- void assertSQLHintShardingTableValueWithStringHintValue() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* SHARDINGSPHERE_HINT: t_order.SHARDING_TABLE_VALUE=a */", 0, 0)));
- assertThat(new SQLHintExtractor(statement).getHintShardingTableValue("t_order"), is(Collections.singletonList("a")));
- }
-
- @Test
- void assertSQLHintShadow() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* SHARDINGSPHERE_HINT: SHADOW=true */", 0, 0)));
- assertTrue(new SQLHintExtractor(statement).isShadow());
- }
-
- @Test
- void assertSQLHintShadowWithCommentString() {
- assertTrue(new SQLHintExtractor("/* SHARDINGSPHERE_HINT: SHADOW=true */").isShadow());
- }
-
- @Test
- void assertFindHintDataSourceNameExist() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* SHARDINGSPHERE_HINT: DATA_SOURCE_NAME=ds_1 */", 0, 0)));
- Optional<String> dataSourceName = new SQLHintExtractor(statement).getHintValueContext().findHintDataSourceName();
- assertTrue(dataSourceName.isPresent());
- assertThat(dataSourceName.get(), is("ds_1"));
- }
-
- @Test
- void assertFindHintDataSourceNameAliasExist() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* ShardingSphere hint: dataSourceName=ds_1 */", 0, 0)));
- Optional<String> dataSourceName = new SQLHintExtractor(statement).getHintValueContext().findHintDataSourceName();
- assertTrue(dataSourceName.isPresent());
- assertThat(dataSourceName.get(), is("ds_1"));
- }
-
- @Test
- void assertFindHintDataSourceNameNotExist() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new CommentSegment("/* no hint */", 0, 0)));
- Optional<String> dataSourceName = new SQLHintExtractor(statement).getHintValueContext().findHintDataSourceName();
- assertFalse(dataSourceName.isPresent());
- }
-
- @Test
- void assertFindHintDataSourceNameNotExistWithoutComment() {
- AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
- Optional<String> dataSourceName = new SQLHintExtractor(statement).getHintValueContext().findHintDataSourceName();
- assertFalse(dataSourceName.isPresent());
- }
-}
diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/hint/SQLHintUtilsTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/hint/SQLHintUtilsTest.java
index 953acac4360..ec466175917 100644
--- a/infra/common/src/test/java/org/apache/shardingsphere/infra/hint/SQLHintUtilsTest.java
+++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/hint/SQLHintUtilsTest.java
@@ -19,13 +19,16 @@ package org.apache.shardingsphere.infra.hint;
import org.junit.jupiter.api.Test;
+import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.Optional;
import java.util.Properties;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class SQLHintUtilsTest {
@@ -85,4 +88,91 @@ class SQLHintUtilsTest {
assertTrue(actual.isPresent());
assertTrue(actual.get().isWriteRouteOnly());
}
+
+ @Test
+ void assertSQLHintSkipSQLRewrite() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT: SKIP_SQL_REWRITE=true */");
+ assertTrue(actual.isPresent());
+ assertTrue(actual.get().isSkipSQLRewrite());
+ }
+
+ @Test
+ void assertSQLHintDisableAuditNames() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT: DISABLE_AUDIT_NAMES=sharding_audit1 sharding_audit2 */");
+ assertTrue(actual.isPresent());
+ Collection<String> actualDisableAuditNames = SQLHintUtils.getSplitterSQLHintValue(actual.get().getDisableAuditNames());
+ assertThat(actualDisableAuditNames.size(), is(2));
+ assertTrue(actualDisableAuditNames.containsAll(Arrays.asList("sharding_audit1", "sharding_audit2")));
+ }
+
+ @Test
+ void assertSQLHintShardingDatabaseValue() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT: SHARDING_DATABASE_VALUE=10 */");
+ assertTrue(actual.isPresent());
+ assertThat(actual.get().getHintShardingDatabaseValue("t_order"), is(Collections.singletonList(new BigInteger("10"))));
+ }
+
+ @Test
+ void assertSQLHintShardingDatabaseValueWithTableName() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT: t_order.SHARDING_DATABASE_VALUE=10 */");
+ assertTrue(actual.isPresent());
+ assertThat(actual.get().getHintShardingDatabaseValue("t_order"), is(Collections.singletonList(new BigInteger("10"))));
+ }
+
+ @Test
+ void assertSQLHintShardingDatabaseValueWithStringHintValue() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT: t_order.SHARDING_DATABASE_VALUE=a */");
+ assertTrue(actual.isPresent());
+ assertThat(actual.get().getHintShardingDatabaseValue("t_order"), is(Collections.singletonList("a")));
+ }
+
+ @Test
+ void assertSQLHintShardingTableValue() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT: SHARDING_TABLE_VALUE=10 */");
+ assertTrue(actual.isPresent());
+ assertThat(actual.get().getHintShardingTableValue("t_order"), is(Collections.singletonList(new BigInteger("10"))));
+ }
+
+ @Test
+ void assertSQLHintShardingTableValueWithTableName() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT: t_order.SHARDING_TABLE_VALUE=10 */");
+ assertTrue(actual.isPresent());
+ assertThat(actual.get().getHintShardingTableValue("t_order"), is(Collections.singletonList(new BigInteger("10"))));
+ }
+
+ @Test
+ void assertSQLHintShardingTableValueWithStringHintValue() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT: t_order.SHARDING_TABLE_VALUE=a */");
+ assertTrue(actual.isPresent());
+ assertThat(actual.get().getHintShardingTableValue("t_order"), is(Collections.singletonList("a")));
+ }
+
+ @Test
+ void assertSQLHintShadow() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT: SHADOW=true */");
+ assertTrue(actual.isPresent());
+ assertTrue(actual.get().isShadow());
+ }
+
+ @Test
+ void assertFindHintDataSourceNameExist() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT: DATA_SOURCE_NAME=ds_1 */");
+ assertTrue(actual.isPresent());
+ assertTrue(actual.get().findHintDataSourceName().isPresent());
+ assertThat(actual.get().findHintDataSourceName().get(), is("ds_1"));
+ }
+
+ @Test
+ void assertFindHintDataSourceNameAliasExist() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* ShardingSphere hint: dataSourceName=ds_1 */");
+ assertTrue(actual.isPresent());
+ assertTrue(actual.get().findHintDataSourceName().isPresent());
+ assertThat(actual.get().findHintDataSourceName().get(), is("ds_1"));
+ }
+
+ @Test
+ void assertFindHintDataSourceNameNotExist() {
+ Optional<HintValueContext> actual = SQLHintUtils.extractHint("/* no hint */");
+ assertFalse(actual.isPresent());
+ }
}