public static DeviceViewNode deserializeUseTemplate(
      ByteBuffer byteBuffer, TypeProvider typeProvider) {
    PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
    OrderByParameter mergeOrderParameter = OrderByParameter.deserialize(byteBuffer);

    int devicesSize = ReadWriteIOUtils.readInt(byteBuffer);
    List<IDeviceID> devices = new ArrayList<>(devicesSize);
    while (devicesSize > 0) {
      devices.add(IDeviceID.Deserializer.DEFAULT_DESERIALIZER.deserializeFrom(byteBuffer));
      devicesSize--;
    }

    return new DeviceViewNode(
        planNodeId,
        mergeOrderParameter,
        typeProvider.getTemplatedInfo().getDeviceViewOutputNames(),
        devices,
        null);
  }
DeviceViewNode is responsible for constructing a device-based view of a set of series. And output
the result with specific order. The order could be 'order by device' or 'order by timestamp'

<p>Each output from its children should have the same schema. That means, the columns should be
same between these TsBlocks. If the input TsBlock contains n columns, the device-based view will
contain n+1 columns where the new column is Device column.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/process/DeviceViewNode.java