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

lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git


The following commit(s) were added to refs/heads/rocketmq-studio by this push:
     new 42de4f375 fix(aliyun): populate subscription filter mode like the 
other providers (#3349)
42de4f375 is described below

commit 42de4f375eac4d431d27a2e777662a1036307961
Author: 烤化の初雪 <[email protected]>
AuthorDate: Mon Sep 7 18:02:59 2026 +0800

    fix(aliyun): populate subscription filter mode like the other providers 
(#3349)
    
    toSubscriptionEntry never derived filterMode from the Aliyun
    FilterExpressionType, so the consumer-group subscription table rendered
    an empty 订阅模式 cell for every Aliyun instance while Apache and Tencent
    rows show TAG/SQL. Derive it with the same SQL92→SQL normalization the
    Apache provider uses.
    
    Co-authored-by: unbridled-41 
<[email protected]>
---
 .../common/util/SubscriptionFilterModes.java}      | 35 +++++++++++-----------
 .../studio/provider/alibaba/AliyunConverters.java  |  2 ++
 .../provider/apache/RocketMQMetadataProvider.java  | 12 ++------
 .../util/SubscriptionFilterModesTest.java}         | 25 +++++++++-------
 .../provider/alibaba/AliyunConvertersTest.java     | 31 +++++++++++++++++++
 5 files changed, 67 insertions(+), 38 deletions(-)

diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
 
b/server/src/main/java/org/apache/rocketmq/studio/common/util/SubscriptionFilterModes.java
similarity index 50%
copy from 
server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
copy to 
server/src/main/java/org/apache/rocketmq/studio/common/util/SubscriptionFilterModes.java
index a47ec89ce..20ae0a939 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/common/util/SubscriptionFilterModes.java
@@ -14,25 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.rocketmq.studio.provider.alibaba;
+package org.apache.rocketmq.studio.common.util;
 
-import 
com.aliyun.sdk.service.rocketmq20220801.models.ListInstancesResponseBody;
-import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class AliyunConvertersTest {
-
-    @Test
-    void toInstanceOptionShouldClampCountsOutsideTheIntegerRange() {
-        ListInstancesResponseBody.List data = 
ListInstancesResponseBody.List.builder()
-                .topicCount(Long.MAX_VALUE)
-                .groupCount(Long.MIN_VALUE)
-                .build();
+/**
+ * Maps a subscription filter expression type to the studio {@code filterMode} 
display value.
+ * Shared by the Apache and Aliyun providers so consumer-group subscription 
tables render the
+ * same values across instance types: {@code SQL92} is normalized to {@code 
SQL}, {@code CLASS_FILTER}
+ * is kept, and anything else (including a null/unknown type) defaults to 
{@code TAG}.
+ */
+public final class SubscriptionFilterModes {
 
-        var result = AliyunConverters.toInstanceOptionVO(data);
+    private SubscriptionFilterModes() {
+    }
 
-        assertThat(result.getTopicCount()).isEqualTo(Integer.MAX_VALUE);
-        assertThat(result.getGroupCount()).isZero();
+    public static String fromExpressionType(String expressionType) {
+        if ("SQL92".equals(expressionType)) {
+            return "SQL";
+        }
+        if ("CLASS_FILTER".equals(expressionType)) {
+            return "CLASS_FILTER";
+        }
+        return "TAG";
     }
 }
diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConverters.java
 
b/server/src/main/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConverters.java
index fd52ed63b..e8a49cf89 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConverters.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConverters.java
@@ -30,6 +30,7 @@ import 
com.aliyun.sdk.service.rocketmq20220801.models.ListTopicsResponseBody;
 import org.apache.rocketmq.studio.common.domain.enums.ConsumeType;
 import org.apache.rocketmq.studio.common.domain.enums.DeliveryStatus;
 import org.apache.rocketmq.studio.common.domain.enums.TopicType;
+import org.apache.rocketmq.studio.common.util.SubscriptionFilterModes;
 import org.apache.rocketmq.studio.instance.group.ConsumerGroupVO;
 import org.apache.rocketmq.studio.instance.group.QueueProgressVO;
 import org.apache.rocketmq.studio.instance.group.SubscriptionEntryVO;
@@ -212,6 +213,7 @@ final class AliyunConverters {
                 .topic(data.getTopicName())
                 .expression(data.getFilterExpression())
                 .type(data.getFilterExpressionType())
+                
.filterMode(SubscriptionFilterModes.fromExpressionType(data.getFilterExpressionType()))
                 .consistency(data.getConsistency() == null ? null : 
String.valueOf(data.getConsistency()))
                 .build();
     }
diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQMetadataProvider.java
 
b/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQMetadataProvider.java
index 61a199623..8070d5655 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQMetadataProvider.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQMetadataProvider.java
@@ -40,6 +40,7 @@ import 
org.apache.rocketmq.studio.common.domain.enums.ConsumeType;
 import org.apache.rocketmq.studio.common.domain.enums.SubscriptionMode;
 import org.apache.rocketmq.studio.common.domain.enums.TopicPerm;
 import org.apache.rocketmq.studio.common.util.Pagination;
+import org.apache.rocketmq.studio.common.util.SubscriptionFilterModes;
 import org.apache.rocketmq.studio.common.util.SystemGroupFilter;
 import org.apache.rocketmq.studio.common.util.SystemTopicFilter;
 import org.apache.rocketmq.common.topic.TopicValidator;
@@ -688,7 +689,7 @@ public class RocketMQMetadataProvider implements 
MetadataProvider {
                     .topic(sd.getTopic())
                     .expression(sd.getSubString())
                     .type(sd.getExpressionType())
-                    .filterMode(filterMode(sd.getExpressionType()))
+                    
.filterMode(SubscriptionFilterModes.fromExpressionType(sd.getExpressionType()))
                     // The broker/proxy expose the group's merged subscription 
set only; with at
                     // least one client connected that merged view is the 
consistent observable
                     // state. Without connections the consistency status stays 
unknown (null).
@@ -761,15 +762,6 @@ public class RocketMQMetadataProvider implements 
MetadataProvider {
     private long resolveDiff(long brokerOffset, long consumerOffset) {
         return ConsumerLagResolver.resolve(brokerOffset - consumerOffset, 
proxyStatsProvider);
     }
-    private String filterMode(String expressionType) {
-        if ("SQL92".equals(expressionType)) {
-            return "SQL";
-        }
-        if ("CLASS_FILTER".equals(expressionType)) {
-            return "CLASS_FILTER";
-        }
-        return "TAG";
-    }
 
     private boolean isSystemTopic(String topicName, Set<String> brokerNames) {
         return SystemTopicFilter.isSystem(topicName, brokerNames);
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
 
b/server/src/test/java/org/apache/rocketmq/studio/common/util/SubscriptionFilterModesTest.java
similarity index 56%
copy from 
server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
copy to 
server/src/test/java/org/apache/rocketmq/studio/common/util/SubscriptionFilterModesTest.java
index a47ec89ce..c4d77edb4 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/common/util/SubscriptionFilterModesTest.java
@@ -14,25 +14,28 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.rocketmq.studio.provider.alibaba;
+package org.apache.rocketmq.studio.common.util;
 
-import 
com.aliyun.sdk.service.rocketmq20220801.models.ListInstancesResponseBody;
 import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-class AliyunConvertersTest {
+class SubscriptionFilterModesTest {
 
     @Test
-    void toInstanceOptionShouldClampCountsOutsideTheIntegerRange() {
-        ListInstancesResponseBody.List data = 
ListInstancesResponseBody.List.builder()
-                .topicCount(Long.MAX_VALUE)
-                .groupCount(Long.MIN_VALUE)
-                .build();
+    void normalizesSql92ToSqlTest() {
+        
assertThat(SubscriptionFilterModes.fromExpressionType("SQL92")).isEqualTo("SQL");
+    }
 
-        var result = AliyunConverters.toInstanceOptionVO(data);
+    @Test
+    void keepsClassFilterTest() {
+        
assertThat(SubscriptionFilterModes.fromExpressionType("CLASS_FILTER")).isEqualTo("CLASS_FILTER");
+    }
 
-        assertThat(result.getTopicCount()).isEqualTo(Integer.MAX_VALUE);
-        assertThat(result.getGroupCount()).isZero();
+    @Test
+    void defaultsToTagForTagUnknownAndNullTest() {
+        
assertThat(SubscriptionFilterModes.fromExpressionType("TAG")).isEqualTo("TAG");
+        
assertThat(SubscriptionFilterModes.fromExpressionType("SQL")).isEqualTo("TAG");
+        
assertThat(SubscriptionFilterModes.fromExpressionType(null)).isEqualTo("TAG");
     }
 }
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
 
b/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
index a47ec89ce..00238ca38 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
@@ -16,7 +16,9 @@
  */
 package org.apache.rocketmq.studio.provider.alibaba;
 
+import 
com.aliyun.sdk.service.rocketmq20220801.models.ListConsumerGroupSubscriptionsResponseBody;
 import 
com.aliyun.sdk.service.rocketmq20220801.models.ListInstancesResponseBody;
+import org.apache.rocketmq.studio.instance.group.SubscriptionEntryVO;
 import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -35,4 +37,33 @@ class AliyunConvertersTest {
         assertThat(result.getTopicCount()).isEqualTo(Integer.MAX_VALUE);
         assertThat(result.getGroupCount()).isZero();
     }
+
+    @Test
+    void toSubscriptionEntryShouldDeriveFilterModeFromTheExpressionType() {
+        ListConsumerGroupSubscriptionsResponseBody.Data data =
+                ListConsumerGroupSubscriptionsResponseBody.Data.builder()
+                        .topicName("orders")
+                        .filterExpression("orderType = 'A'")
+                        .filterExpressionType("SQL92")
+                        .consistency(true)
+                        .build();
+
+        SubscriptionEntryVO entry = AliyunConverters.toSubscriptionEntry(data);
+
+        assertThat(entry.getFilterMode()).isEqualTo("SQL");
+    }
+
+    @Test
+    void toSubscriptionEntryShouldKeepTagFilterMode() {
+        ListConsumerGroupSubscriptionsResponseBody.Data data =
+                ListConsumerGroupSubscriptionsResponseBody.Data.builder()
+                        .topicName("orders")
+                        .filterExpression("tag-a")
+                        .filterExpressionType("TAG")
+                        .build();
+
+        SubscriptionEntryVO entry = AliyunConverters.toSubscriptionEntry(data);
+
+        assertThat(entry.getFilterMode()).isEqualTo("TAG");
+    }
 }

Reply via email to