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 <zhangli...@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

Reply via email to