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 8a37b1a5b8c Refactor ProjectionIdentifierExtractEngine (#33192)
8a37b1a5b8c is described below

commit 8a37b1a5b8c96448349c66419ffd10652479933c
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Oct 9 19:47:07 2024 +0800

    Refactor ProjectionIdentifierExtractEngine (#33192)
    
    * Add more test cases on ProjectionsContext
    
    * Refactor ProjectionIdentifierExtractEngine
    
    * Refactor ProjectionIdentifierExtractEngine
---
 .../DialectProjectionIdentifierExtractor.java      |  2 ++
 .../ProjectionIdentifierExtractEngine.java         | 22 ++++++++++------------
 .../ProjectionIdentifierExtractEngineTest.java     | 21 +++++++++++++++++++++
 3 files changed, 33 insertions(+), 12 deletions(-)

diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java
index 73da997261c..23603c89028 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java
@@ -18,12 +18,14 @@
 package 
org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor;
 
 import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPI;
+import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 /**
  * Dialect projection identifier extractor.
  */
+@SingletonSPI
 public interface DialectProjectionIdentifierExtractor extends DatabaseTypedSPI 
{
     
     /**
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java
index 422f43a9418..5d69ad1c42e 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java
@@ -17,25 +17,20 @@
 
 package 
org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor;
 
+import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
 import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
-import java.util.Optional;
-
 /**
  * Projection identifier extract engine.
  */
+@RequiredArgsConstructor
 public final class ProjectionIdentifierExtractEngine {
     
-    @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
-    private final Optional<DialectProjectionIdentifierExtractor> 
projectionIdentifierExtractor;
-    
-    public ProjectionIdentifierExtractEngine(final DatabaseType databaseType) {
-        projectionIdentifierExtractor = 
DatabaseTypedSPILoader.findService(DialectProjectionIdentifierExtractor.class, 
databaseType);
-    }
+    private final DatabaseType databaseType;
     
     /**
      * Get identifier value.
@@ -47,7 +42,8 @@ public final class ProjectionIdentifierExtractEngine {
         if (QuoteCharacter.NONE != identifierValue.getQuoteCharacter()) {
             return identifierValue.getValue();
         }
-        return projectionIdentifierExtractor.map(optional -> 
optional.getIdentifierValue(identifierValue)).orElseGet(identifierValue::getValue);
+        return 
DatabaseTypedSPILoader.findService(DialectProjectionIdentifierExtractor.class, 
databaseType)
+                .map(optional -> 
optional.getIdentifierValue(identifierValue)).orElseGet(identifierValue::getValue);
     }
     
     /**
@@ -58,7 +54,8 @@ public final class ProjectionIdentifierExtractEngine {
      * @return column name
      */
     public String getColumnNameFromFunction(final String functionName, final 
String functionExpression) {
-        return projectionIdentifierExtractor.map(optional -> 
optional.getColumnNameFromFunction(functionName, 
functionExpression)).orElse(functionExpression);
+        return 
DatabaseTypedSPILoader.findService(DialectProjectionIdentifierExtractor.class, 
databaseType)
+                .map(optional -> 
optional.getColumnNameFromFunction(functionName, 
functionExpression)).orElse(functionExpression);
     }
     
     /**
@@ -68,7 +65,7 @@ public final class ProjectionIdentifierExtractEngine {
      * @return column name
      */
     public String getColumnNameFromExpression(final String expression) {
-        return projectionIdentifierExtractor.map(optional -> 
optional.getColumnNameFromExpression(expression)).orElse(expression);
+        return 
DatabaseTypedSPILoader.findService(DialectProjectionIdentifierExtractor.class, 
databaseType).map(optional -> 
optional.getColumnNameFromExpression(expression)).orElse(expression);
     }
     
     /**
@@ -78,6 +75,7 @@ public final class ProjectionIdentifierExtractEngine {
      * @return column name
      */
     public String getColumnNameFromSubquery(final SubqueryProjectionSegment 
subquerySegment) {
-        return projectionIdentifierExtractor.map(optional -> 
optional.getColumnNameFromSubquery(subquerySegment)).orElseGet(subquerySegment::getText);
+        return 
DatabaseTypedSPILoader.findService(DialectProjectionIdentifierExtractor.class, 
databaseType)
+                .map(optional -> 
optional.getColumnNameFromSubquery(subquerySegment)).orElseGet(subquerySegment::getText);
     }
 }
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java
index e7ccb3eab58..3f172eb8980 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java
@@ -21,11 +21,14 @@ import 
org.apache.shardingsphere.infra.binder.context.segment.select.projection.
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.mockito.Mockito.mock;
 
 class ProjectionIdentifierExtractEngineTest {
     
@@ -51,4 +54,22 @@ class ProjectionIdentifierExtractEngineTest {
         assertThat(new 
ProjectionIdentifierExtractEngine(TypedSPILoader.getService(DatabaseType.class, 
"MySQL")).getColumnNameFromFunction(functionName, functionExpression),
                 is("FunctionExpression"));
     }
+    
+    @Test
+    void assertGetColumnNameFromExpression() {
+        String expression = "expression";
+        assertThat(new 
ProjectionIdentifierExtractEngine(TypedSPILoader.getService(DatabaseType.class, 
"PostgreSQL")).getColumnNameFromExpression(expression), is("?column?"));
+        assertThat(new 
ProjectionIdentifierExtractEngine(TypedSPILoader.getService(DatabaseType.class, 
"openGauss")).getColumnNameFromExpression(expression), is("?column?"));
+        assertThat(new 
ProjectionIdentifierExtractEngine(TypedSPILoader.getService(DatabaseType.class, 
"Oracle")).getColumnNameFromExpression(expression), is("EXPRESSION"));
+        assertThat(new 
ProjectionIdentifierExtractEngine(TypedSPILoader.getService(DatabaseType.class, 
"MySQL")).getColumnNameFromExpression(expression), is("expression"));
+    }
+    
+    @Test
+    void assertGetColumnNameFromSubquery() {
+        SubqueryProjectionSegment projectionSegment = new 
SubqueryProjectionSegment(mock(SubquerySegment.class), "text");
+        assertThat(new 
ProjectionIdentifierExtractEngine(TypedSPILoader.getService(DatabaseType.class, 
"PostgreSQL")).getColumnNameFromSubquery(projectionSegment), is("text"));
+        assertThat(new 
ProjectionIdentifierExtractEngine(TypedSPILoader.getService(DatabaseType.class, 
"openGauss")).getColumnNameFromSubquery(projectionSegment), is("text"));
+        assertThat(new 
ProjectionIdentifierExtractEngine(TypedSPILoader.getService(DatabaseType.class, 
"Oracle")).getColumnNameFromSubquery(projectionSegment), is("TEXT"));
+        assertThat(new 
ProjectionIdentifierExtractEngine(TypedSPILoader.getService(DatabaseType.class, 
"MySQL")).getColumnNameFromSubquery(projectionSegment), is("text"));
+    }
 }

Reply via email to