You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2025/04/13 10:00:56 UTC
(shardingsphere) branch master updated: Add JoinOrderOption (#35179)
This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 91b5a1a72bc Add JoinOrderOption (#35179)
91b5a1a72bc is described below
commit 91b5a1a72bc2c21871ab5966b37f1bbfcd388738
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sun Apr 13 18:00:50 2025 +0800
Add JoinOrderOption (#35179)
---
.../dml/from/type/JoinTableSegmentBinder.java | 12 ++++----
.../metadata/database/DialectDatabaseMetaData.java | 18 ++++--------
.../metadata/database/option/JoinOrderOption.java | 33 ++++++++++++++++++++++
.../metadata/database/MySQLDatabaseMetaData.java | 10 ++-----
4 files changed, 47 insertions(+), 26 deletions(-)
diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/JoinTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/JoinTableSegmentBinder.java
index 538727bf122..5eddce65a75 100644
--- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/JoinTableSegmentBinder.java
+++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/JoinTableSegmentBinder.java
@@ -29,7 +29,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type
import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.TableSegmentBinder;
import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext;
import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext;
-import org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData;
+import org.apache.shardingsphere.infra.database.core.metadata.database.option.JoinOrderOption;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
@@ -114,14 +114,14 @@ public final class JoinTableSegmentBinder {
private static Collection<ProjectionSegment> getDerivedJoinTableProjectionSegments(final JoinTableSegment segment, final DatabaseType databaseType,
final Map<String, ProjectionSegment> usingColumnsByNaturalJoin,
final Multimap<CaseInsensitiveString, TableSegmentBinderContext> tableBinderContexts) {
- DialectDatabaseMetaData dialectDatabaseMetaData = new DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData();
- Collection<ProjectionSegment> projectionSegments = getProjectionSegments(segment, dialectDatabaseMetaData, tableBinderContexts);
+ JoinOrderOption joinOrderOption = new DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getJoinOrderOption();
+ Collection<ProjectionSegment> projectionSegments = getProjectionSegments(segment, joinOrderOption, tableBinderContexts);
if (segment.getUsing().isEmpty() && !segment.isNatural()) {
return projectionSegments;
}
Collection<ProjectionSegment> result = new LinkedList<>();
Map<String, ProjectionSegment> originalUsingColumns = segment.getUsing().isEmpty() ? usingColumnsByNaturalJoin : getUsingColumns(projectionSegments, segment.getUsing(), segment.getJoinType());
- Collection<ProjectionSegment> orderedUsingColumns = dialectDatabaseMetaData.isJoinUsingColumnsByProjectionOrder()
+ Collection<ProjectionSegment> orderedUsingColumns = joinOrderOption.isUsingColumnsByProjectionOrder()
? getJoinUsingColumnsByProjectionOrder(projectionSegments, originalUsingColumns)
: originalUsingColumns.values();
result.addAll(orderedUsingColumns);
@@ -129,10 +129,10 @@ public final class JoinTableSegmentBinder {
return result;
}
- private static Collection<ProjectionSegment> getProjectionSegments(final JoinTableSegment segment, final DialectDatabaseMetaData dialectDatabaseMetaData,
+ private static Collection<ProjectionSegment> getProjectionSegments(final JoinTableSegment segment, final JoinOrderOption joinOrderOption,
final Multimap<CaseInsensitiveString, TableSegmentBinderContext> tableBinderContexts) {
Collection<ProjectionSegment> result = new LinkedList<>();
- if (dialectDatabaseMetaData.isRightColumnsOrderFirstOnJoin() && JoinType.RIGHT.name().equalsIgnoreCase(segment.getJoinType()) && (!segment.getUsing().isEmpty() || segment.isNatural())) {
+ if (joinOrderOption.isRightColumnsByFirstOrder() && JoinType.RIGHT.name().equalsIgnoreCase(segment.getJoinType()) && (!segment.getUsing().isEmpty() || segment.isNatural())) {
result.addAll(getProjectionSegments(segment.getRight(), tableBinderContexts));
result.addAll(getProjectionSegments(segment.getLeft(), tableBinderContexts));
} else {
diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java
index 867f9815cdb..a33aa501de6 100644
--- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java
+++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.infra.database.core.metadata.database;
import org.apache.shardingsphere.infra.database.core.metadata.database.enums.NullsOrderType;
import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
+import org.apache.shardingsphere.infra.database.core.metadata.database.option.JoinOrderOption;
import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPI;
import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
@@ -177,20 +178,11 @@ public interface DialectDatabaseMetaData extends DatabaseTypedSPI {
}
/**
- * Whether join using columns by projection order.
+ * Get join order option.
*
- * @return by projection order or not
+ * @return join order option
*/
- default boolean isJoinUsingColumnsByProjectionOrder() {
- return false;
- }
-
- /**
- * Whether right columns order first on join.
- *
- * @return right columns order first or not
- */
- default boolean isRightColumnsOrderFirstOnJoin() {
- return false;
+ default JoinOrderOption getJoinOrderOption() {
+ return new JoinOrderOption(false, false);
}
}
diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/option/JoinOrderOption.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/option/JoinOrderOption.java
new file mode 100644
index 00000000000..9a42a6e620d
--- /dev/null
+++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/option/JoinOrderOption.java
@@ -0,0 +1,33 @@
+/*
+ * 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.database.core.metadata.database.option;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * Join order option.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class JoinOrderOption {
+
+ private final boolean isUsingColumnsByProjectionOrder;
+
+ private final boolean isRightColumnsByFirstOrder;
+}
diff --git a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java
index 534d222bb45..8329a4a1b96 100644
--- a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java
+++ b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.infra.database.mysql.metadata.database;
import org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData;
import org.apache.shardingsphere.infra.database.core.metadata.database.enums.NullsOrderType;
import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
+import org.apache.shardingsphere.infra.database.core.metadata.database.option.JoinOrderOption;
import java.math.BigInteger;
import java.sql.Types;
@@ -88,13 +89,8 @@ public final class MySQLDatabaseMetaData implements DialectDatabaseMetaData {
}
@Override
- public boolean isJoinUsingColumnsByProjectionOrder() {
- return true;
- }
-
- @Override
- public boolean isRightColumnsOrderFirstOnJoin() {
- return true;
+ public JoinOrderOption getJoinOrderOption() {
+ return new JoinOrderOption(true, true);
}
@Override