code: protected boolean seekToRow(long currentRow) throws IOException {
      boolean seeked = false;
  
      // If this holds it means we checked if the row is null, and it was not,
      // and when we skipRows we don't want to skip this row.
      if (currentRow != previousPresentRow) {
        nextIsNull(currentRow);
      }
  
      if (valuePresent) {
        if (currentRow != previousRow + 1) {
          numNonNulls--;
          long rowInStripe = currentRow - rowBaseInStripe - 1;
          int rowIndexEntry = computeRowIndexEntry(currentRow);
          // if previous == rowIndexEntry * rowIndexStride - 1 even though they are in different
          // index strides seeking will only leaves us where we are.
          if ((previousRow != rowIndexEntry * rowIndexStride  - 1 &&
              rowIndexEntry != computeRowIndexEntry(previousRow)) || currentRow < previousRow) {
            if (present == null) {
              previousRowIndexEntry = rowIndexEntry;
              numNonNulls = countNonNulls(rowInStripe - (rowIndexEntry * rowIndexStride));
            }
            seek(rowIndexEntry, currentRow <= previousRow);
            skipRows(numNonNulls);
          } else {
             if (present == null) {
               // If present is null, it means there are no nulls in this column
               // so the number of nonNulls is the number of rows being skipped
               numNonNulls = currentRow - previousRow - 1;
             }
            skipRows(numNonNulls);
          }
          seeked = true;
        }
  
        numNonNulls = 0;
        previousRow = currentRow;
      }
  
      return seeked;
    }
docs: Adjusts all streams so that the next value returned corresponds to the value for currentRow,
  suitable for calling from outside
  
  @param currentRow
  @return
  @throws IOException