You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by li...@apache.org on 2026/09/07 10:03:05 UTC

(rocketmq-dashboard) branch rocketmq-studio updated: fix(aliyun): populate subscription filter mode like the other providers (#3349)

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: 烤化の初雪 <ya...@outlook.com>
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 <17...@users.noreply.github.com>
---
 .../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");
+    }
 }