MatchResult detailMatches(
      PlanNode node, SessionInfo sessionInfo, Metadata metadata, SymbolAliases symbolAliases) {
    SymbolAliases.Builder newAliases = SymbolAliases.builder();

    for (Matcher matcher : matchers) {
      MatchResult matchResult = matcher.detailMatches(node, sessionInfo, metadata, symbolAliases);
      if (!matchResult.isMatch()) {
        return NO_MATCH;
      }
      newAliases.putAll(matchResult.getAliases());
    }

    return match(newAliases.build());
  }
Matches to any tree of nodes with children matching to given source matchers.
anyTree(tableScan("nation")) - will match to any plan which all leafs contain any node
containing table scan from nation table.

<p>Note: anyTree does not match zero nodes. E.g. output(anyTree(tableScan)) will NOT match
TableScan node followed by OutputNode.
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/assertions/PlanMatchPattern.java