private void preReadUncompressedStreams(long baseOffset, MutateHelper toRead,
      IdentityHashMap<ByteBuffer, Boolean> toRelease) throws IOException {
    if (isCompressed)
      return;
    DiskRangeList iter = toRead.next;
    while (iter != null) {
      DiskRangeList newIter = preReadUncompressedStream(baseOffset, iter, iter.getOffset(), iter.getOffset() + iter.getLength(), Kind.DATA);
      iter = newIter != null ? newIter.next : null;
    }
    if (toRelease != null) {
      releaseBuffers(toRelease.keySet(), true);
      toRelease.clear();
    }
  }
Uncompresses part of the stream. RGs can overlap, so we cannot just go and decompress
and remove what we have returned. We will keep iterator as a "hint" point.
@param baseOffset Absolute offset of boundaries and ranges relative to file, for cache keys.
@param start Ordered ranges containing file data. Helpful if they point close to cOffset.
@param cOffset Start offset to decompress.
@param endCOffset End offset to decompress; estimate, partial CBs will be ignored.
@param csd Stream data, to add the results.
@param unlockUntilCOffset The offset until which the buffers can be unlocked in cache, as
                          they will not be used in future calls (see the class comment in
                          EncodedReaderImpl about refcounts).
@return Last buffer cached during decompression. Cache buffers are never removed from
        the master list, so they are safe to keep as iterators for various streams.
ql/src/java/org/apache/hadoop/hive/ql/io/orc/encoded/EncodedReaderImpl.java