public static AggregationNode deserialize(ByteBuffer byteBuffer) {
    int size = ReadWriteIOUtils.readInt(byteBuffer);
    final Map<Symbol, Aggregation> aggregations = new LinkedHashMap<>(size);
    while (size-- > 0) {
      aggregations.put(Symbol.deserialize(byteBuffer), Aggregation.deserialize(byteBuffer));
    }
    GroupingSetDescriptor groupingSetDescriptor = GroupingSetDescriptor.deserialize(byteBuffer);
    size = ReadWriteIOUtils.readInt(byteBuffer);
    List<Symbol> preGroupedSymbols = new ArrayList<>(size);
    while (size-- > 0) {
      preGroupedSymbols.add(Symbol.deserialize(byteBuffer));
    }
    Step step = Step.deserialize(byteBuffer);
    Optional<Symbol> hashSymbol = Optional.empty();
    if (ReadWriteIOUtils.readBool(byteBuffer)) {
      hashSymbol = Optional.of(Symbol.deserialize(byteBuffer));
    }
    Optional<Symbol> groupIdSymbol = Optional.empty();
    if (ReadWriteIOUtils.readBool(byteBuffer)) {
      groupIdSymbol = Optional.of(Symbol.deserialize(byteBuffer));
    }
    PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
    return new AggregationNode(
        planNodeId,
        null,
        aggregations,
        groupingSetDescriptor,
        preGroupedSymbols,
        step,
        hashSymbol,
        groupIdSymbol);
  }
@return whether this node should produce default output in case of no input pages. For example
    for query:
    <p>SELECT count(*) FROM nation WHERE nationkey < 0
    <p>A default output of "0" is expected to be produced by FINAL aggregation operator.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/AggregationNode.java