docs: private boolean gbyTablesEqual(MaterializedViewInfo mv) {
          if (m_selectStmt.hasComplexGroupby() != mv.getGroupbyexpressionsjson().isEmpty()) {
              if (m_selectStmt.hasComplexGroupby()) {     // when both have complex GBY expressions, anonymize table/column of SEL stmt and compare the two expressions.
                  final Set<AbstractExpression>
                          selGby = m_selectStmt.groupByColumns().stream()
                          .map(ci -> transformExpressionRidofPVE(ci.m_expression).anonymize())
                          .collect(Collectors.toSet()),
                          viewGby = new HashSet<>(getGbyExpressions(mv));
                  return selGby.equals(viewGby) &&        // NOTE: as TVE's equal() method misses column index comparison,
                          // which is almost the whole point, and we need to do the checking here. This is quite hacky, but
                          // is the only way to do it here.
                          selGby.stream().map(MVQueryRewriter::extractTVEIndices).collect(Collectors.toSet()).equals(
                                  viewGby.stream().map(MVQueryRewriter::extractTVEIndices).collect(Collectors.toSet()));
              } else {    // when neither has complex GBY expression, we already know that GBY table names match, since
                  return true;    // we are only checking SELECT query from a single table.
              }
          } else {        // unequal when one has complex gby and the other doesn't
              return false;
          }
      }