code: private CompletableReadResultEntry getMultiReadResultEntry(long resultStartOffset, int maxLength) {
          int readLength = 0;
  
          CompletableReadResultEntry nextEntry = getSingleReadResultEntry(resultStartOffset, maxLength);
          if (nextEntry == null || !(nextEntry instanceof CacheReadResultEntry)) {
              // We can only coalesce CacheReadResultEntries.
              return nextEntry;
          }
  
          // Collect the contents of congruent Index Entries into a list, as long as we still encounter data in the cache.
          ArrayList<InputStream> contents = new ArrayList<>();
          do {
              assert Futures.isSuccessful(nextEntry.getContent()) : "Found CacheReadResultEntry that is not completed yet: " + nextEntry;
              val entryContents = nextEntry.getContent().join();
              contents.add(entryContents.getData());
              readLength += entryContents.getLength();
              if (readLength >= this.config.getMemoryReadMinLength() || readLength >= maxLength) {
                  break;
              }
  
              nextEntry = getSingleMemoryReadResultEntry(resultStartOffset + readLength, maxLength - readLength);
          } while (nextEntry != null);
  
          // Coalesce the results into a single InputStream and return the result.
          return new CacheReadResultEntry(resultStartOffset, new SequenceInputStream(Iterators.asEnumeration(contents.iterator())), readLength);
      }
docs: Returns a ReadResultEntry that matches the specified search parameters.
  <p>
  Compared to getSingleMemoryReadResultEntry(), this method may return a direct entry or a collection of entries.
  If the first entry to be returned would constitute a cache hit, then this method will attempt to return data from
  subsequent (congruent) entries, as long as they are cache hits. If at any time a cache miss occurs, the data collected
  so far is returned as a single entry, excluding the cache miss entry (exception if the first entry is a miss,
  then that entry is returned).
  
  @param resultStartOffset The Offset within the StreamSegment where to start returning data from.
  @param maxLength         The maximum number of bytes to return.
  @return A ReadResultEntry representing the data to return.