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 4c48747c588 SHOW SHADOW RULES add algorithm information return (#25279)
4c48747c588 is described below

commit 4c48747c58877a1c9e5370b41b95d4f305118cf5
Author: yx9o <[email protected]>
AuthorDate: Mon Apr 24 12:17:01 2023 +0800

    SHOW SHADOW RULES add algorithm information return (#25279)
    
    * SHOW SHADOW RULES add algorithm information return
    
    * Update
    
    * Update
    
    * Update
    
    * Update
---
 .../handler/query/ShowShadowRuleExecutor.java      | 53 +++++++---------------
 .../distsql/query/ShowShadowRuleExecutorTest.java  | 32 +++++++++----
 2 files changed, 39 insertions(+), 46 deletions(-)

diff --git 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/ShowShadowRuleExecutor.java
 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/ShowShadowRuleExecutor.java
index 486c576a149..8d84f8df88d 100644
--- 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/ShowShadowRuleExecutor.java
+++ 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/ShowShadowRuleExecutor.java
@@ -18,8 +18,10 @@
 package org.apache.shardingsphere.shadow.distsql.handler.query;
 
 import org.apache.shardingsphere.distsql.handler.query.RQLExecutor;
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.util.props.PropertiesConverter;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
 import 
org.apache.shardingsphere.shadow.api.config.datasource.ShadowDataSourceConfiguration;
 import 
org.apache.shardingsphere.shadow.api.config.table.ShadowTableConfiguration;
@@ -29,8 +31,6 @@ import org.apache.shardingsphere.shadow.rule.ShadowRule;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
@@ -42,36 +42,22 @@ import java.util.stream.Collectors;
  */
 public final class ShowShadowRuleExecutor implements 
RQLExecutor<ShowShadowRulesStatement> {
     
-    private static final String RULE_NAME = "rule_name";
-    
-    private static final String SOURCE_NAME = "source_name";
-    
-    private static final String SHADOW_NAME = "shadow_name";
-    
-    private static final String SHADOW_TABLE = "shadow_table";
-    
     @Override
     public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereDatabase database, final ShowShadowRulesStatement sqlStatement) {
         Optional<ShadowRule> rule = 
database.getRuleMetaData().findSingleRule(ShadowRule.class);
-        rule.ifPresent(optional -> 
buildDataSourceIterator((ShadowRuleConfiguration) optional.getConfiguration(), 
sqlStatement));
-        Iterator<Map<String, String>> data = Collections.emptyIterator();
-        if (rule.isPresent()) {
-            data = buildDataSourceIterator((ShadowRuleConfiguration) 
rule.get().getConfiguration(), sqlStatement);
-        }
         Collection<LocalDataQueryResultRow> result = new LinkedList<>();
-        while (data.hasNext()) {
-            Map<String, String> row = data.next();
-            result.add(new LocalDataQueryResultRow(row.get(RULE_NAME), 
row.get(SOURCE_NAME), row.get(SHADOW_NAME), row.getOrDefault(SHADOW_TABLE, 
"")));
+        if (rule.isPresent()) {
+            result = buildData((ShadowRuleConfiguration) 
rule.get().getConfiguration(), sqlStatement);
         }
         return result;
     }
     
-    private Iterator<Map<String, String>> buildDataSourceIterator(final 
ShadowRuleConfiguration ruleConfig, final ShowShadowRulesStatement 
sqlStatement) {
+    private Collection<LocalDataQueryResultRow> buildData(final 
ShadowRuleConfiguration ruleConfig, final ShowShadowRulesStatement 
sqlStatement) {
         Map<String, Map<String, ShadowTableConfiguration>> dataSourceTableMap 
= convertToDataSourceTableMap(ruleConfig.getTables());
         Collection<ShadowDataSourceConfiguration> specifiedConfigs = 
isSpecified(sqlStatement)
                 ? ruleConfig.getDataSources().stream().filter(each -> 
each.getName().equalsIgnoreCase(sqlStatement.getRuleName())).collect(Collectors.toList())
                 : ruleConfig.getDataSources();
-        return specifiedConfigs.stream().map(each -> buildDataItem(each, 
dataSourceTableMap)).collect(Collectors.toList()).iterator();
+        return specifiedConfigs.stream().map(each -> buildColumnData(each, 
dataSourceTableMap, 
ruleConfig.getShadowAlgorithms())).flatMap(Collection::stream).collect(Collectors.toList());
     }
     
     private Map<String, Map<String, ShadowTableConfiguration>> 
convertToDataSourceTableMap(final Map<String, ShadowTableConfiguration> tables) 
{
@@ -85,28 +71,21 @@ public final class ShowShadowRuleExecutor implements 
RQLExecutor<ShowShadowRules
         return null != sqlStatement.getRuleName() && 
!sqlStatement.getRuleName().isEmpty();
     }
     
-    private Map<String, String> buildDataItem(final 
ShadowDataSourceConfiguration dataSourceConfiguration, final Map<String, 
Map<String, ShadowTableConfiguration>> dataSourceTableMap) {
-        Map<String, String> result = 
convertToDataSourceMap(dataSourceConfiguration);
-        Map<String, ShadowTableConfiguration> dataSourceTable = 
dataSourceTableMap.getOrDefault(result.get(RULE_NAME), Collections.emptyMap());
-        result.put(SHADOW_TABLE, convertToString(dataSourceTable.keySet()));
-        return result;
-    }
-    
-    private Map<String, String> convertToDataSourceMap(final 
ShadowDataSourceConfiguration dataSourceConfiguration) {
-        Map<String, String> result = new HashMap<>();
-        result.put(RULE_NAME, dataSourceConfiguration.getName());
-        result.put(SOURCE_NAME, 
dataSourceConfiguration.getProductionDataSourceName());
-        result.put(SHADOW_NAME, 
dataSourceConfiguration.getShadowDataSourceName());
+    private Collection<LocalDataQueryResultRow> buildColumnData(final 
ShadowDataSourceConfiguration dataSourceConfig, final Map<String, Map<String, 
ShadowTableConfiguration>> dataSourceTableMap,
+                                                                final 
Map<String, AlgorithmConfiguration> algorithmConfigs) {
+        Map<String, ShadowTableConfiguration> dataSourceTable = 
dataSourceTableMap.getOrDefault(dataSourceConfig.getName(), 
Collections.emptyMap());
+        Collection<LocalDataQueryResultRow> result = new LinkedList<>();
+        dataSourceTable.forEach((key, value) -> 
value.getShadowAlgorithmNames().forEach(each -> {
+            AlgorithmConfiguration algorithmConfig = 
algorithmConfigs.get(each);
+            result.add(new LocalDataQueryResultRow(Arrays.asList(key, 
dataSourceConfig.getName(), dataSourceConfig.getProductionDataSourceName(), 
dataSourceConfig.getShadowDataSourceName(),
+                    algorithmConfig.getType(), 
PropertiesConverter.convert(algorithmConfig.getProps()))));
+        }));
         return result;
     }
     
-    private String convertToString(final Collection<String> shadowTables) {
-        return null == shadowTables ? "" : String.join(",", shadowTables);
-    }
-    
     @Override
     public Collection<String> getColumnNames() {
-        return Arrays.asList(RULE_NAME, SOURCE_NAME, SHADOW_NAME, 
SHADOW_TABLE);
+        return Arrays.asList("shadow_table", "rule_name", "source_name", 
"shadow_name", "algorithm_type", "algorithm_props");
     }
     
     @Override
diff --git 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/query/ShowShadowRuleExecutorTest.java
 
b/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/query/ShowShadowRuleExecutorTest.java
index 95c17ec3a2a..8481814e320 100644
--- 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/query/ShowShadowRuleExecutorTest.java
+++ 
b/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/query/ShowShadowRuleExecutorTest.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.shadow.distsql.query;
 
 import org.apache.shardingsphere.distsql.handler.query.RQLExecutor;
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -33,6 +34,7 @@ import org.junit.jupiter.api.Test;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -46,25 +48,36 @@ class ShowShadowRuleExecutorTest {
     void assertGetRowData() {
         RQLExecutor<ShowShadowRulesStatement> executor = new 
ShowShadowRuleExecutor();
         Collection<LocalDataQueryResultRow> actual = 
executor.getRows(mockDatabase(), mock(ShowShadowRulesStatement.class));
-        assertThat(actual.size(), is(1));
+        assertThat(actual.size(), is(2));
         Iterator<LocalDataQueryResultRow> iterator = actual.iterator();
         LocalDataQueryResultRow row = iterator.next();
-        assertThat(row.getCell(1), is("shadow_rule"));
-        assertThat(row.getCell(2), is("source"));
-        assertThat(row.getCell(3), is("shadow"));
-        assertThat(row.getCell(4), is("t_order,t_order_1"));
+        assertThat(row.getCell(1), is("t_order"));
+        assertThat(row.getCell(2), is("shadow_rule"));
+        assertThat(row.getCell(3), is("source"));
+        assertThat(row.getCell(4), is("shadow"));
+        assertThat(row.getCell(5), is("REGEX_MATCH"));
+        assertThat(row.getCell(6), is(""));
+        row = iterator.next();
+        assertThat(row.getCell(1), is("t_order_item"));
+        assertThat(row.getCell(2), is("shadow_rule"));
+        assertThat(row.getCell(3), is("source"));
+        assertThat(row.getCell(4), is("shadow"));
+        assertThat(row.getCell(5), is("REGEX_MATCH"));
+        assertThat(row.getCell(6), is(""));
     }
     
     @Test
     void assertGetColumnNames() {
         RQLExecutor<ShowShadowRulesStatement> executor = new 
ShowShadowRuleExecutor();
         Collection<String> columns = executor.getColumnNames();
-        assertThat(columns.size(), is(4));
+        assertThat(columns.size(), is(6));
         Iterator<String> iterator = columns.iterator();
+        assertThat(iterator.next(), is("shadow_table"));
         assertThat(iterator.next(), is("rule_name"));
         assertThat(iterator.next(), is("source_name"));
         assertThat(iterator.next(), is("shadow_name"));
-        assertThat(iterator.next(), is("shadow_table"));
+        assertThat(iterator.next(), is("algorithm_type"));
+        assertThat(iterator.next(), is("algorithm_props"));
     }
     
     private ShardingSphereDatabase mockDatabase() {
@@ -78,8 +91,9 @@ class ShowShadowRuleExecutorTest {
     private RuleConfiguration createRuleConfiguration() {
         ShadowRuleConfiguration result = new ShadowRuleConfiguration();
         result.getDataSources().add(new 
ShadowDataSourceConfiguration("shadow_rule", "source", "shadow"));
-        result.getTables().put("t_order", new 
ShadowTableConfiguration(Collections.singletonList("shadow_rule"), 
Collections.emptyList()));
-        result.getTables().put("t_order_1", new 
ShadowTableConfiguration(Collections.singletonList("shadow_rule"), 
Collections.emptyList()));
+        result.getShadowAlgorithms().put("user_id_select_match_algorithm", new 
AlgorithmConfiguration("REGEX_MATCH", new Properties()));
+        result.getTables().put("t_order", new 
ShadowTableConfiguration(Collections.singletonList("shadow_rule"), 
Collections.singletonList("user_id_select_match_algorithm")));
+        result.getTables().put("t_order_item", new 
ShadowTableConfiguration(Collections.singletonList("shadow_rule"), 
Collections.singletonList("user_id_select_match_algorithm")));
         return result;
     }
 }

Reply via email to