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");
+ }
}