@Override
    public List<Symbol> visitTableFunctionProcessor(
        TableFunctionProcessorNode node, GroupContext context) {
      if (node.getChildren().isEmpty()) {
        return ImmutableList.of();
      } else if (node.isRowSemantic()) {
        return visitPlan(node, context);
      }
      Optional<DataOrganizationSpecification> dataOrganizationSpecification =
          node.getDataOrganizationSpecification();
      return dataOrganizationSpecification
          .<List<Symbol>>map(
              organizationSpecification ->
                  organizationSpecification.getPartitionBy().stream()
                      .filter(context.groupingKeys::contains)
                      .collect(Collectors.toList()))
          .orElseGet(ImmutableList::of);
    }
This visitor returns the list of preGroupedSymbols of current AggregationNode. Attention: The
preGroupedSymbols of child-AggregationNode should have been calculated. GroupContext: The
GroupingKeys of current AggregationNode.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/TransformAggregationToStreamable.java