@Override
  protected void serializeAttributes(ByteBuffer byteBuffer) {
    PlanNodeType.TABLE_AGGREGATION_NODE.serialize(byteBuffer);
    ReadWriteIOUtils.write(aggregations.size(), byteBuffer);
    aggregations.forEach(
        (k, v) -> {
          Symbol.serialize(k, byteBuffer);
          v.serialize(byteBuffer);
        });
    groupingSets.serialize(byteBuffer);
    ReadWriteIOUtils.write(preGroupedSymbols.size(), byteBuffer);
    for (Symbol preGroupedSymbol : preGroupedSymbols) {
      Symbol.serialize(preGroupedSymbol, byteBuffer);
    }
    step.serialize(byteBuffer);
    ReadWriteIOUtils.write(hashSymbol.isPresent(), byteBuffer);
    if (hashSymbol.isPresent()) {
      Symbol.serialize(hashSymbol.get(), byteBuffer);
    }
    ReadWriteIOUtils.write(groupIdSymbol.isPresent(), byteBuffer);
    if (groupIdSymbol.isPresent()) {
      Symbol.serialize(groupIdSymbol.get(), byteBuffer);
    }
  }
@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