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 5cf2c472f40 Enhance SQLNodeConverterEngine to support 
'select_with_match_against' (#28297)
5cf2c472f40 is described below

commit 5cf2c472f40ddb5b45b2789e1d69682156d5be48
Author: Yunbo Ni <[email protected]>
AuthorDate: Mon Sep 4 17:26:33 2023 +0800

    Enhance SQLNodeConverterEngine to support 'select_with_match_against' 
(#28297)
    
    * feat: names with owner in match()
    
    * fix: spotless
    
    ---------
    
    Co-authored-by: Zhengqiang Duan <[email protected]>
---
 .../expression/impl/MatchExpressionConverter.java        | 16 +++++++++++++++-
 .../it/optimizer/src/test/resources/converter/select.xml |  2 ++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/MatchExpressionConverter.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/MatchExpressionConverter.java
index bd2d59a0398..e633ad288f0 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/MatchExpressionConverter.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/converter/segment/expression/impl/MatchExpressionConverter.java
@@ -23,9 +23,11 @@ import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.parser.SqlParserPos;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.MatchAgainstExpression;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sqlfederation.compiler.converter.segment.SQLSegmentConverter;
 import 
org.apache.shardingsphere.sqlfederation.compiler.converter.segment.expression.ExpressionConverter;
 
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Optional;
@@ -38,10 +40,22 @@ public final class MatchExpressionConverter implements 
SQLSegmentConverter<Match
     @Override
     public Optional<SqlNode> convert(final MatchAgainstExpression segment) {
         List<SqlNode> sqlNodes = new LinkedList<>();
-        sqlNodes.add(new 
SqlIdentifier(segment.getColumnName().getIdentifier().getValue(), 
SqlParserPos.ZERO));
+        List<String> names = new ArrayList<>();
+        if (segment.getColumnName().getOwner().isPresent()) {
+            addOwnerNames(names, segment.getColumnName().getOwner().get());
+        }
+        names.add(segment.getColumnName().getIdentifier().getValue());
+        sqlNodes.add(new SqlIdentifier(names, SqlParserPos.ZERO));
         new 
ExpressionConverter().convert(segment.getExpr()).ifPresent(sqlNodes::add);
         SqlNode searchModifier = 
SqlLiteral.createCharString(segment.getSearchModifier(), SqlParserPos.ZERO);
         sqlNodes.add(searchModifier);
         return Optional.of(new 
SqlBasicCall(SQLExtensionOperatorTable.MATCH_AGAINST, sqlNodes, 
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 931c59af091..a28f2fe6a8d 100644
--- a/test/it/optimizer/src/test/resources/converter/select.xml
+++ b/test/it/optimizer/src/test/resources/converter/select.xml
@@ -20,6 +20,8 @@
     <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_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" />
     <test-cases sql-case-id="select_with_assignment_operator" 
expected-sql="SELECT `rn` := 1, `now_code` := '' FROM `t_order`" 
db-types="MySQL" />
     <test-cases sql-case-id="select_with_assignment_operator_and_keyword" 
expected-sql="SELECT `KEY` := '', `num` := 123 FROM `t_order`" db-types="MySQL" 
/>

Reply via email to