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 "order_id" FROM
"sharding_db"."public"."t_order" WHERE
"user_id" = ? AND "order_id" = ?"
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 "order_id" FROM
"sharding_db"."public"."t_order" WHERE
"user_id" = 1 AND "order_id" = 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 "order_id" FROM "t_order" WHERE
"user_id" = ? AND "order_id" = ? OR "user_id" =
?" 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"
/>