@Override
  public boolean isFinished() throws Exception {
    return !this.hasNextWithTimer();
  }
Since devices have been sorted by the merge order as expected, what {@link DeviceViewOperator}
need to do is traversing the device child operators, get all tsBlocks of one device and transform
it to the form we need, adding the device column and allocating value column to its expected
location, then get the next device operator until no next device.

<p>The deviceOperators can be timeJoinOperator or seriesScanOperator that have not transformed
the result form.

<p>Attention! If some columns are not existing in one device, those columns will be null. e.g.
[s1,s2,s3] is query, but only [s1, s3] exists in device1, then the column of s2 will be filled
with NullColumn.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/DeviceViewOperator.java