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

jianglongtao 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 f3094a149be Refactor ShowSingleTableExecutor (#29758)
f3094a149be is described below

commit f3094a149be90be02904eab41b48facb44336684
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Jan 17 22:38:33 2024 +0800

    Refactor ShowSingleTableExecutor (#29758)
---
 .../handler/query/ShowSingleTableExecutor.java     | 51 ++++++++--------------
 1 file changed, 18 insertions(+), 33 deletions(-)

diff --git 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowSingleTableExecutor.java
 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowSingleTableExecutor.java
index 5d0c7135c5b..e818a8941bc 100644
--- 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowSingleTableExecutor.java
+++ 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowSingleTableExecutor.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.single.distsql.handler.query;
 
-import org.apache.shardingsphere.distsql.handler.type.rql.RQLExecutor;
+import 
org.apache.shardingsphere.distsql.handler.type.rql.rule.RuleAwareRQLExecutor;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -28,9 +28,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
-import java.util.LinkedList;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -38,7 +36,11 @@ import java.util.stream.Collectors;
 /**
  * Show single table executor.
  */
-public final class ShowSingleTableExecutor implements 
RQLExecutor<ShowSingleTableStatement> {
+public final class ShowSingleTableExecutor extends 
RuleAwareRQLExecutor<ShowSingleTableStatement, SingleRule> {
+    
+    public ShowSingleTableExecutor() {
+        super(SingleRule.class);
+    }
     
     @Override
     public Collection<String> getColumnNames() {
@@ -46,45 +48,28 @@ public final class ShowSingleTableExecutor implements 
RQLExecutor<ShowSingleTabl
     }
     
     @Override
-    public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereDatabase database, final ShowSingleTableStatement sqlStatement) {
-        SingleRule singleRule = 
database.getRuleMetaData().getSingleRule(SingleRule.class);
-        Map<String, Collection<DataNode>> singleTableNodes = 
singleRule.getSingleTableDataNodes();
-        return getRows(singleTableNodes, sqlStatement);
-    }
-    
-    private Collection<LocalDataQueryResultRow> getRows(final Map<String, 
Collection<DataNode>> singleTableNodes, final ShowSingleTableStatement 
sqlStatement) {
-        Optional<Pattern> pattern = getPattern(sqlStatement);
-        Collection<DataNode> resultDataNodes = pattern.map(optional -> 
getDataNodesWithLikePattern(singleTableNodes, optional)).orElseGet(() -> 
getDataNodes(singleTableNodes, sqlStatement));
+    public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereDatabase database, final ShowSingleTableStatement sqlStatement, 
final SingleRule rule) {
+        Collection<DataNode> resultDataNodes = getPattern(sqlStatement)
+                .map(optional -> 
getDataNodesWithLikePattern(rule.getSingleTableDataNodes(), 
optional)).orElseGet(() -> getDataNodes(rule.getSingleTableDataNodes(), 
sqlStatement));
         Collection<DataNode> sortedDataNodes = 
resultDataNodes.stream().sorted(Comparator.comparing(DataNode::getTableName)).collect(Collectors.toList());
         return sortedDataNodes.stream().map(each -> new 
LocalDataQueryResultRow(each.getTableName(), 
each.getDataSourceName())).collect(Collectors.toList());
     }
     
-    private Collection<DataNode> getDataNodesWithLikePattern(final Map<String, 
Collection<DataNode>> singleTableNodes, final Pattern pattern) {
-        Collection<DataNode> result = new LinkedList<>();
-        for (final Entry<String, Collection<DataNode>> entry : 
singleTableNodes.entrySet()) {
-            if (pattern.matcher(entry.getKey()).matches()) {
-                result.add(entry.getValue().iterator().next());
-            }
-        }
-        return result;
-    }
-    
-    private Collection<DataNode> getDataNodes(final Map<String, 
Collection<DataNode>> singleTableNodes, final ShowSingleTableStatement 
sqlStatement) {
-        Collection<DataNode> result = new LinkedList<>();
-        for (final Entry<String, Collection<DataNode>> entry : 
singleTableNodes.entrySet()) {
-            if (!sqlStatement.getTableName().isPresent() || 
sqlStatement.getTableName().get().equalsIgnoreCase(entry.getKey())) {
-                result.add(entry.getValue().iterator().next());
-            }
-        }
-        return result;
-    }
-    
     private Optional<Pattern> getPattern(final ShowSingleTableStatement 
sqlStatement) {
         return sqlStatement.getLikePattern().isPresent()
                 ? 
Optional.of(Pattern.compile(SQLUtils.convertLikePatternToRegex(sqlStatement.getLikePattern().get()),
 Pattern.CASE_INSENSITIVE))
                 : Optional.empty();
     }
     
+    private Collection<DataNode> getDataNodesWithLikePattern(final Map<String, 
Collection<DataNode>> singleTableNodes, final Pattern pattern) {
+        return singleTableNodes.entrySet().stream().filter(entry -> 
pattern.matcher(entry.getKey()).matches()).map(entry -> 
entry.getValue().iterator().next()).collect(Collectors.toList());
+    }
+    
+    private Collection<DataNode> getDataNodes(final Map<String, 
Collection<DataNode>> singleTableNodes, final ShowSingleTableStatement 
sqlStatement) {
+        return singleTableNodes.entrySet().stream().filter(entry -> 
!sqlStatement.getTableName().isPresent() || 
sqlStatement.getTableName().get().equalsIgnoreCase(entry.getKey()))
+                .map(entry -> 
entry.getValue().iterator().next()).collect(Collectors.toList());
+    }
+    
     @Override
     public Class<ShowSingleTableStatement> getType() {
         return ShowSingleTableStatement.class;

Reply via email to