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/05/19 04:51:58 UTC

(shardingsphere) branch master updated: Add DialectPaginationOption.rowNumberColumnName (#35461)

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 5f40ec2c2d7 Add DialectPaginationOption.rowNumberColumnName (#35461)
5f40ec2c2d7 is described below

commit 5f40ec2c2d797ff86311c65255bc33f000c105c3
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Mon May 19 12:51:53 2025 +0800

    Add DialectPaginationOption.rowNumberColumnName (#35461)
    
    * Fix sonar issues
    
    * Add DialectPaginationOption.rowNumberColumnName
---
 .../engine/RowNumberPaginationContextEngine.java   | 34 ++++++++--------------
 .../database/metadata/DialectDatabaseMetaData.java |  2 +-
 .../option/pagination/DialectPaginationOption.java |  2 ++
 .../metadata/database/OracleDatabaseMetaData.java  |  2 +-
 .../database/SQLServerDatabaseMetaData.java        |  2 +-
 5 files changed, 17 insertions(+), 25 deletions(-)

diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/RowNumberPaginationContextEngine.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
index a60e5b08b55..f5d647fa0c7 100644
--- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
+++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
@@ -17,12 +17,12 @@
 
 package org.apache.shardingsphere.infra.binder.context.segment.select.pagination.engine;
 
-import com.cedarsoftware.util.CaseInsensitiveMap;
-import com.cedarsoftware.util.CaseInsensitiveSet;
-import lombok.RequiredArgsConstructor;
+import com.google.common.base.Strings;
 import org.apache.shardingsphere.infra.binder.context.segment.select.pagination.PaginationContext;
 import org.apache.shardingsphere.infra.binder.context.segment.select.projection.ProjectionsContext;
+import org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.pagination.DialectPaginationOption;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression;
@@ -37,27 +37,18 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.paginatio
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
  * Pagination context engine for row number.
  */
-@RequiredArgsConstructor
 public final class RowNumberPaginationContextEngine {
     
-    private static final Collection<String> ROW_NUMBER_IDENTIFIERS = new CaseInsensitiveSet<>(2, 1F);
+    private final DialectPaginationOption paginationOption;
     
-    private static final Map<String, String> DATABASE_TYPE_ROW_NUMBER_IDENTIFIERS = new CaseInsensitiveMap<>(2, 1F);
-    
-    private final DatabaseType databaseType;
-    
-    static {
-        ROW_NUMBER_IDENTIFIERS.add("ROWNUM");
-        ROW_NUMBER_IDENTIFIERS.add("ROW_NUMBER");
-        DATABASE_TYPE_ROW_NUMBER_IDENTIFIERS.put("Oracle", "ROWNUM");
-        DATABASE_TYPE_ROW_NUMBER_IDENTIFIERS.put("SQLServer", "ROW_NUMBER");
+    public RowNumberPaginationContextEngine(final DatabaseType databaseType) {
+        paginationOption = new DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getPaginationOption();
     }
     
     /**
@@ -89,13 +80,12 @@ public final class RowNumberPaginationContextEngine {
     }
     
     private Optional<String> findRowNumberAlias(final ProjectionsContext projectionsContext) {
-        for (String each : ROW_NUMBER_IDENTIFIERS) {
-            Optional<String> result = projectionsContext.findAlias(each);
-            if (result.isPresent()) {
-                return result;
-            }
+        String rowNumberColumnName = paginationOption.getRowNumberColumnName();
+        if (Strings.isNullOrEmpty(rowNumberColumnName)) {
+            return Optional.empty();
         }
-        return Optional.ofNullable(DATABASE_TYPE_ROW_NUMBER_IDENTIFIERS.get(databaseType.getType()));
+        Optional<String> result = projectionsContext.findAlias(rowNumberColumnName);
+        return result.isPresent() ? result : Optional.of(rowNumberColumnName);
     }
     
     private boolean isRowNumberColumn(final ExpressionSegment predicate, final String rowNumberAlias) {
@@ -103,7 +93,7 @@ public final class RowNumberPaginationContextEngine {
             ExpressionSegment left = ((BinaryOperationExpression) predicate).getLeft();
             if (left instanceof ColumnSegment) {
                 String leftColumnValue = ((ColumnSegment) left).getIdentifier().getValue();
-                return ROW_NUMBER_IDENTIFIERS.contains(leftColumnValue) || leftColumnValue.equalsIgnoreCase(rowNumberAlias);
+                return leftColumnValue.equalsIgnoreCase(paginationOption.getRowNumberColumnName()) || leftColumnValue.equalsIgnoreCase(rowNumberAlias);
             }
             return false;
         }
diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java
index c4b2d8c668d..c4b8eacb444 100644
--- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java
+++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java
@@ -145,7 +145,7 @@ public interface DialectDatabaseMetaData extends DatabaseTypedSPI {
      * @return pagination option
      */
     default DialectPaginationOption getPaginationOption() {
-        return new DialectPaginationOption(false);
+        return new DialectPaginationOption(false, "");
     }
     
     /**
diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/pagination/DialectPaginationOption.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/pagination/DialectPaginationOption.java
index 66f35fdc8d7..fea40c90a87 100644
--- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/pagination/DialectPaginationOption.java
+++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/pagination/DialectPaginationOption.java
@@ -28,4 +28,6 @@ import lombok.RequiredArgsConstructor;
 public final class DialectPaginationOption {
     
     private final boolean containsRowNumber;
+    
+    private final String rowNumberColumnName;
 }
diff --git a/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/database/OracleDatabaseMetaData.java b/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/database/OracleDatabaseMetaData.java
index 1e69aba0c99..fe4a10333e7 100644
--- a/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/database/OracleDatabaseMetaData.java
+++ b/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/database/OracleDatabaseMetaData.java
@@ -74,7 +74,7 @@ public final class OracleDatabaseMetaData implements DialectDatabaseMetaData {
     
     @Override
     public DialectPaginationOption getPaginationOption() {
-        return new DialectPaginationOption(true);
+        return new DialectPaginationOption(true, "ROWNUM");
     }
     
     @Override
diff --git a/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/database/SQLServerDatabaseMetaData.java b/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/database/SQLServerDatabaseMetaData.java
index bab95b769d3..2e7ffaf6787 100644
--- a/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/database/SQLServerDatabaseMetaData.java
+++ b/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/database/SQLServerDatabaseMetaData.java
@@ -55,7 +55,7 @@ public final class SQLServerDatabaseMetaData implements DialectDatabaseMetaData
     
     @Override
     public DialectPaginationOption getPaginationOption() {
-        return new DialectPaginationOption(true);
+        return new DialectPaginationOption(true, "ROW_NUMBER");
     }
     
     @Override