in mqtt-common/src/main/java/org/apache/rocketmq/mqtt/common/model/Trie.java [225:251]
private Map<K, V> findValueSet(TrieNode<K, V> currentNode, String[] topicArray, int level, int maxLevel,
boolean isNumberSign) {
Map<K, V> result = new HashMap<>(16);
// match the mqtt-topic leaf or match the leaf node of trie
if (level == maxLevel || isNumberSign) {
result.putAll(currentNode.valueSet);
}
// match the '#'
TrieNode numberMatch = currentNode.children.get(Constants.NUMBER_SIGN);
if (numberMatch != null) {
result.putAll(findValueSet(numberMatch, topicArray, level + 1, maxLevel, true));
}
// match the mqtt-topic path
if (level < maxLevel && !currentNode.children.isEmpty()) {
// match the precise
TrieNode trieNode = currentNode.children.get(topicArray[level]);
if (trieNode != null) {
result.putAll(findValueSet(trieNode, topicArray, level + 1, maxLevel, false));
}
// match the '+'
TrieNode plusMatch = currentNode.children.get(Constants.PLUS_SIGN);
if (plusMatch != null) {
result.putAll(findValueSet(plusMatch, topicArray, level + 1, maxLevel, false));
}
}
return result;
}