code: protected void seek(int rowIndexEntry, boolean backwards) throws IOException {
      if (backwards || rowIndexEntry != computeRowIndexEntry(previousRow)) {
        // initialize the previousPositionProvider
        previousRowIndexEntry = rowIndexEntry;
        // if the present stream exists and we are seeking backwards or to a new row Index entry
        // the present stream needs to seek
        if (present != null && (backwards || rowIndexEntry != computeRowIndexEntry(previousPresentRow))) {
          present.seek(rowIndexEntry);
          // Update previousPresentRow because the state is now as if that were the case
          previousPresentRow = rowBaseInStripe + rowIndexEntry * rowIndexStride - 1;
        }
        seek(rowIndexEntry);
        // Update previousRow because the state is now as if that were the case
        previousRow = rowBaseInStripe + rowIndexEntry * rowIndexStride - 1;
      }
    }
docs: Adjust all streams to the beginning of the row index entry specified, backwards means that
  a previous value is being read and forces the index entry to be restarted, otherwise, has
  no effect if we're already in the current index entry
  
  @param rowIndexEntry
  @param backwards
  @throws IOException