This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang 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 140fb9ea4d7 fix names with multi owners (#28298)
140fb9ea4d7 is described below

commit 140fb9ea4d7d1a402e139a0b8cb2e4e3136635ad
Author: Yunbo Ni <[email protected]>
AuthorDate: Mon Sep 4 17:43:02 2023 +0800

    fix names with multi owners (#28298)
    
    * feat: projection names with multi owners
    
    * fix: check style
    
    * fix: spotless
    
    ---------
    
    Co-authored-by: Zhengqiang Duan <[email protected]>
---
 .../segment/expression/impl/ColumnConverter.java    | 21 +++++++++++++++------
 .../impl/ShorthandProjectionConverter.java          | 17 +++++++++++++++--
 .../src/test/resources/converter/select.xml         |  4 ++++
 3 files changed, 34 insertions(+), 8 deletions(-)

diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/ColumnConverter.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/ColumnConverter.java
index 37ef187ace4..f7f9b4b429e 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/ColumnConverter.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/ColumnConverter.java
@@ -24,7 +24,8 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.Column
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sqlfederation.compiler.converter.segment.SQLSegmentConverter;
 
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -34,10 +35,18 @@ public final class ColumnConverter implements 
SQLSegmentConverter<ColumnSegment,
     
     @Override
     public Optional<SqlNode> convert(final ColumnSegment segment) {
-        Optional<OwnerSegment> owner = segment.getOwner();
-        String columnName = segment.getIdentifier().getValue();
-        SqlIdentifier sqlIdentifier = owner.map(optional -> new 
SqlIdentifier(Arrays.asList(optional.getIdentifier().getValue(), columnName), 
SqlParserPos.ZERO))
-                .orElseGet(() -> new SqlIdentifier(columnName, 
SqlParserPos.ZERO));
-        return Optional.of(sqlIdentifier);
+        List<String> names = new ArrayList<>();
+        if (segment.getOwner().isPresent()) {
+            addOwnerNames(names, segment.getOwner().get());
+        }
+        names.add(segment.getIdentifier().getValue());
+        return Optional.of(new SqlIdentifier(names, SqlParserPos.ZERO));
+    }
+    
+    private void addOwnerNames(final List<String> names, final OwnerSegment 
owner) {
+        if (null != owner) {
+            addOwnerNames(names, owner.getOwner().orElse(null));
+            names.add(owner.getIdentifier().getValue());
+        }
     }
 }
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/projection/impl/ShorthandProjectionConverter.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/projection/impl/ShorthandProjectionConverter.java
index 78812c7a9d5..b80d845b8e3 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/projection/impl/ShorthandProjectionConverter.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/projection/impl/ShorthandProjectionConverter.java
@@ -22,10 +22,13 @@ import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.parser.SqlParserPos;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sqlfederation.compiler.converter.segment.SQLSegmentConverter;
 
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
+import java.util.stream.IntStream;
 
 /**
  * Shorthand projection converter. 
@@ -38,8 +41,18 @@ public final class ShorthandProjectionConverter implements 
SQLSegmentConverter<S
             return Optional.empty();
         }
         if (segment.getOwner().isPresent()) {
-            return 
Optional.of(SqlIdentifier.star(Arrays.asList(segment.getOwner().get().getIdentifier().getValue(),
 ""), SqlParserPos.ZERO, ImmutableList.of(SqlParserPos.ZERO, 
SqlParserPos.ZERO)));
+            List<String> names = new ArrayList<>();
+            addOwnerNames(names, segment.getOwner().get());
+            names.add("");
+            return Optional.of(SqlIdentifier.star(names, SqlParserPos.ZERO, 
IntStream.range(0, names.size()).mapToObj(i -> 
SqlParserPos.ZERO).collect(ImmutableList.toImmutableList())));
         }
         return Optional.of(SqlIdentifier.star(SqlParserPos.ZERO));
     }
+    
+    private void addOwnerNames(final List<String> names, final OwnerSegment 
owner) {
+        if (null != owner) {
+            addOwnerNames(names, owner.getOwner().orElse(null));
+            names.add(owner.getIdentifier().getValue());
+        }
+    }
 }
diff --git a/test/it/optimizer/src/test/resources/converter/select.xml 
b/test/it/optimizer/src/test/resources/converter/select.xml
index a28f2fe6a8d..a17523123ca 100644
--- a/test/it/optimizer/src/test/resources/converter/select.xml
+++ b/test/it/optimizer/src/test/resources/converter/select.xml
@@ -20,6 +20,10 @@
     <test-cases sql-case-id="select_string_constant_type_cast" 
expected-sql="SELECT CAST('1' AS INTEGER), CAST('2' AS DECIMAL)" 
dbtypes="openGauss,PostgreSQL" />
     <test-cases 
sql-case-id="select_with_database_name_and_schema_name_in_table" 
expected-sql="SELECT &quot;order_id&quot; FROM 
&quot;sharding_db&quot;.&quot;public&quot;.&quot;t_order&quot; WHERE 
&quot;user_id&quot; = ? AND &quot;order_id&quot; = ?" 
db-types="PostgreSQL,openGauss" sql-case-types="PLACEHOLDER" />
     <test-cases 
sql-case-id="select_with_database_name_and_schema_name_in_table" 
expected-sql="SELECT &quot;order_id&quot; FROM 
&quot;sharding_db&quot;.&quot;public&quot;.&quot;t_order&quot; WHERE 
&quot;user_id&quot; = 1 AND &quot;order_id&quot; = 1" 
db-types="PostgreSQL,openGauss" sql-case-types="LITERAL" />
+    <test-cases sql-case-id="select_with_schema_name_in_shorthand_projection" 
expected-sql="SELECT `sharding_db`.`t_order`.* FROM `t_order` WHERE `user_id` = 
? AND `order_id` = ?" db-types="MySQL" sql-case-types="PLACEHOLDER" />
+    <test-cases sql-case-id="select_with_schema_name_in_shorthand_projection" 
expected-sql="SELECT `sharding_db`.`t_order`.* FROM `t_order` WHERE `user_id` = 
1 AND `order_id` = 1" db-types="MySQL" sql-case-types="LITERAL" />
+    <test-cases sql-case-id="select_with_schema_name_in_column_projection" 
expected-sql="SELECT `sharding_db`.`t_order`.`order_id` FROM `t_order` WHERE 
`user_id` = ? AND `order_id` = ?" db-types="MySQL" sql-case-types="PLACEHOLDER" 
/>
+    <test-cases sql-case-id="select_with_schema_name_in_column_projection" 
expected-sql="SELECT `sharding_db`.`t_order`.`order_id` FROM `t_order` WHERE 
`user_id` = 1 AND `order_id` = 1" db-types="MySQL" sql-case-types="LITERAL" />
     <test-cases sql-case-id="select_with_match_against" expected-sql="SELECT * 
FROM `t_order_item` WHERE MATCH (`t_order_item`.`description`) AGAINST (? IN 
NATURAL LANGUAGE MODE) AND `user_id` = ?" db-types="MySQL" 
sql-case-types="PLACEHOLDER" />
     <test-cases sql-case-id="select_with_match_against" expected-sql="SELECT * 
FROM `t_order_item` WHERE MATCH (`t_order_item`.`description`) AGAINST ('hello' 
IN NATURAL LANGUAGE MODE) AND `user_id` = 10" db-types="MySQL" 
sql-case-types="LITERAL" />
     <test-cases sql-case-id="select_with_dollar_parameter_for_postgresql" 
expected-sql="SELECT &quot;order_id&quot; FROM &quot;t_order&quot; WHERE 
&quot;user_id&quot; = ? AND &quot;order_id&quot; = ? OR &quot;user_id&quot; = 
?" db-types="PostgreSQL, openGauss" sql-case-types="PLACEHOLDER" />

Reply via email to