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