Skip to content

Commit 6166315

Browse files
committed
Optimize TopicFilterIterator
1 parent f3a9e15 commit 6166315

File tree

4 files changed

+35
-42
lines changed

4 files changed

+35
-42
lines changed

bifromq-dist/bifromq-dist-coproc-proto/src/main/java/com/baidu/bifromq/dist/trie/MTopicFilterTrieNode.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
package com.baidu.bifromq.dist.trie;
1515

1616
import static com.baidu.bifromq.util.TopicConst.MULTI_WILDCARD;
17+
import static java.util.Collections.emptySet;
18+
import static java.util.Collections.singleton;
1719

1820
import com.google.common.collect.Sets;
1921
import java.util.NoSuchElementException;
@@ -25,12 +27,15 @@
2527
* @param <V> value type
2628
*/
2729
final class MTopicFilterTrieNode<V> extends TopicFilterTrieNode<V> {
28-
private final Set<TopicTrieNode<V>> siblingTopicTrieNodes;
30+
private final Set<TopicTrieNode<V>> backingTopics;
2931

30-
MTopicFilterTrieNode(TopicFilterTrieNode<V> parent,
31-
Set<TopicTrieNode<V>> siblingTopicTrieNodes) {
32+
MTopicFilterTrieNode(TopicFilterTrieNode<V> parent, Set<TopicTrieNode<V>> siblingTopicTrieNodes) {
3233
super(parent);
33-
this.siblingTopicTrieNodes = siblingTopicTrieNodes;
34+
Set<TopicTrieNode<V>> topics = parent != null ? parent.backingTopics() : emptySet();
35+
for (TopicTrieNode<V> sibling : siblingTopicTrieNodes) {
36+
topics = collectTopics(sibling, topics);
37+
}
38+
backingTopics = topics;
3439
}
3540

3641
@Override
@@ -40,25 +45,20 @@ String levelName() {
4045

4146
@Override
4247
Set<TopicTrieNode<V>> backingTopics() {
43-
Set<TopicTrieNode<V>> topics = Sets.newHashSet();
44-
if (parent != null) {
45-
topics.addAll(parent.backingTopics());
46-
}
47-
for (TopicTrieNode<V> sibling : siblingTopicTrieNodes) {
48-
collectTopics(sibling, topics);
49-
}
50-
return topics;
48+
return backingTopics;
5149
}
5250

53-
private void collectTopics(TopicTrieNode<V> node, Set<TopicTrieNode<V>> topics) {
51+
private Set<TopicTrieNode<V>> collectTopics(TopicTrieNode<V> node, Set<TopicTrieNode<V>> topics) {
5452
if (node.isUserTopic()) {
55-
topics.add(node);
53+
topics = Sets.union(topics, singleton(node));
5654
}
5755
for (TopicTrieNode<V> child : node.children().values()) {
58-
collectTopics(child, topics);
56+
topics = collectTopics(child, topics);
5957
}
58+
return topics;
6059
}
6160

61+
6262
@Override
6363
void seekChild(String childLevelName) {
6464

bifromq-dist/bifromq-dist-coproc-proto/src/main/java/com/baidu/bifromq/dist/trie/NTopicFilterTrieNode.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.util.Set;
2525
import java.util.TreeMap;
2626
import java.util.TreeSet;
27-
import java.util.stream.Collectors;
2827

2928
/**
3029
* Normal level topic filter trie node.
@@ -33,27 +32,27 @@
3332
*/
3433
final class NTopicFilterTrieNode<V> extends TopicFilterTrieNode<V> {
3534
private final String levelName;
36-
private final Set<TopicTrieNode<V>> siblingTopicTrieNodes;
3735
private final NavigableSet<String> subLevelNames;
3836
private final NavigableMap<String, Set<TopicTrieNode<V>>> subTopicTrieNodes;
3937
private final Set<TopicTrieNode<V>> subWildcardMatchableTopicTrieNodes;
40-
38+
private final Set<TopicTrieNode<V>> backingTopics;
4139

4240
// point to the sub node during iteration
4341
private String subLevelName;
4442

45-
protected NTopicFilterTrieNode(TopicFilterTrieNode<V> parent,
46-
String levelName,
47-
Set<TopicTrieNode<V>> siblingTopicTrieNodes) {
43+
NTopicFilterTrieNode(TopicFilterTrieNode<V> parent, String levelName, Set<TopicTrieNode<V>> siblingTopicTrieNodes) {
4844
super(parent);
4945
assert levelName != null;
5046
assert siblingTopicTrieNodes.stream().allMatch(node -> node.levelName().equals(levelName));
51-
this.siblingTopicTrieNodes = siblingTopicTrieNodes;
5247
this.subTopicTrieNodes = new TreeMap<>();
5348
this.subLevelNames = new TreeSet<>();
5449
this.subWildcardMatchableTopicTrieNodes = new HashSet<>();
5550
this.levelName = levelName;
51+
this.backingTopics = new HashSet<>();
5652
for (TopicTrieNode<V> sibling : siblingTopicTrieNodes) {
53+
if (sibling.isUserTopic()) {
54+
backingTopics.add(sibling);
55+
}
5756
for (Map.Entry<String, TopicTrieNode<V>> entry : sibling.children().entrySet()) {
5857
TopicTrieNode<V> subNode = entry.getValue();
5958
if (subNode.wildcardMatchable()) {
@@ -64,7 +63,7 @@ protected NTopicFilterTrieNode(TopicFilterTrieNode<V> parent,
6463
}
6564
}
6665
// # match parent
67-
if (!backingTopics().isEmpty()) {
66+
if (!backingTopics.isEmpty()) {
6867
subLevelNames.add(MULTI_WILDCARD);
6968
}
7069
if (!subWildcardMatchableTopicTrieNodes.isEmpty()) {
@@ -81,7 +80,7 @@ String levelName() {
8180

8281
@Override
8382
Set<TopicTrieNode<V>> backingTopics() {
84-
return siblingTopicTrieNodes.stream().filter(TopicTrieNode::isUserTopic).collect(Collectors.toSet());
83+
return backingTopics;
8584
}
8685

8786
@Override

bifromq-dist/bifromq-dist-coproc-proto/src/main/java/com/baidu/bifromq/dist/trie/STopicFilterTrieNode.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import static com.baidu.bifromq.util.TopicConst.MULTI_WILDCARD;
1717
import static com.baidu.bifromq.util.TopicConst.SINGLE_WILDCARD;
1818

19-
import com.google.common.collect.Sets;
2019
import java.util.HashSet;
2120
import java.util.Map;
2221
import java.util.NavigableMap;
@@ -32,22 +31,24 @@
3231
* @param <V> value type
3332
*/
3433
final class STopicFilterTrieNode<V> extends TopicFilterTrieNode<V> {
35-
private final Set<TopicTrieNode<V>> siblingTopicTrieNodes;
3634
private final NavigableSet<String> subLevelNames;
3735
private final NavigableMap<String, Set<TopicTrieNode<V>>> subTopicTrieNodes;
3836
private final Set<TopicTrieNode<V>> subWildcardMatchableTopicTrieNodes;
37+
private final Set<TopicTrieNode<V>> backingTopics;
3938

4039
// point to the sub node during iteration
4140
private String subLevelName;
4241

43-
STopicFilterTrieNode(TopicFilterTrieNode<V> parent,
44-
Set<TopicTrieNode<V>> siblingTopicTrieNodes) {
42+
STopicFilterTrieNode(TopicFilterTrieNode<V> parent, Set<TopicTrieNode<V>> siblingTopicTrieNodes) {
4543
super(parent);
46-
this.siblingTopicTrieNodes = siblingTopicTrieNodes;
4744
this.subLevelNames = new TreeSet<>();
4845
this.subTopicTrieNodes = new TreeMap<>();
4946
this.subWildcardMatchableTopicTrieNodes = new HashSet<>();
47+
this.backingTopics = new HashSet<>();
5048
for (TopicTrieNode<V> sibling : siblingTopicTrieNodes) {
49+
if (sibling.isUserTopic()) {
50+
backingTopics.add(sibling);
51+
}
5152
for (Map.Entry<String, TopicTrieNode<V>> entry : sibling.children().entrySet()) {
5253
TopicTrieNode<V> subNode = entry.getValue();
5354
if (subNode.wildcardMatchable()) {
@@ -59,7 +60,7 @@ final class STopicFilterTrieNode<V> extends TopicFilterTrieNode<V> {
5960

6061
}
6162
// # match parent
62-
if (!backingTopics().isEmpty()) {
63+
if (!backingTopics.isEmpty()) {
6364
subLevelNames.add(MULTI_WILDCARD);
6465
}
6566
if (!subWildcardMatchableTopicTrieNodes.isEmpty()) {
@@ -77,13 +78,7 @@ String levelName() {
7778

7879
@Override
7980
Set<TopicTrieNode<V>> backingTopics() {
80-
Set<TopicTrieNode<V>> topics = Sets.newHashSet();
81-
for (TopicTrieNode<V> sibling : siblingTopicTrieNodes) {
82-
if (sibling.isUserTopic()) {
83-
topics.add(sibling);
84-
}
85-
}
86-
return topics;
81+
return backingTopics;
8782
}
8883

8984
@Override

bifromq-dist/bifromq-dist-coproc-proto/src/main/java/com/baidu/bifromq/dist/trie/TopicFilterTrieNode.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@
2525
* @param <V> value type
2626
*/
2727
abstract class TopicFilterTrieNode<V> {
28-
static <V> TopicFilterTrieNode<V> from(TopicTrieNode<V> root) {
29-
return new NTopicFilterTrieNode<>(null, root.levelName(), Set.of(root));
30-
}
31-
3228
protected final TopicFilterTrieNode<V> parent;
3329

3430
protected TopicFilterTrieNode(TopicFilterTrieNode<V> parent) {
3531
this.parent = parent;
3632
}
3733

34+
static <V> TopicFilterTrieNode<V> from(TopicTrieNode<V> root) {
35+
return new NTopicFilterTrieNode<>(null, root.levelName(), Set.of(root));
36+
}
37+
3838
/**
3939
* Get the level name of the topic filter node.
4040
*
@@ -65,7 +65,6 @@ final List<String> topicFilterPrefix() {
6565
*/
6666
abstract Set<TopicTrieNode<V>> backingTopics();
6767

68-
6968
/**
7069
* Seek to the child node whose level name is greater or equals to specified level name.
7170
*

0 commit comments

Comments
 (0)