docs: @Override
    public boolean moveToNext()
    {
      clearCombinedRowsInfo();
      if (nextRowPointer == null) {
        currentTimeAndDimsPointer = null;
        return false;
      }
      // This line implicitly uses the property of RowIterator.getPointer() (see [*] below), that it's still valid after
      // RowPointer.moveToNext() returns false. mergingIterator.moveToNext() could have returned false during the previous
      // call to this method, RowCombiningTimeAndDimsIterator.moveToNext().
      startNewTimeAndDims(nextRowPointer);
      nextRowPointer = null;
      // [1] -- see comment in startNewTimeAndDims()
      mergingIterator.mark();
      // [2] -- see comment in startNewTimeAndDims()
      while (mergingIterator.moveToNext()) {
        if (mergingIterator.hasTimeAndDimsChangedSinceMark()) {
          nextRowPointer = mergingIterator.getPointer(); // [*]
          return true;
        } else {
          combineToCurrentTimeAndDims(mergingIterator.getPointer());
        }
      }
      // No more rows left in mergingIterator
      nextRowPointer = null;
      return true;
    }