@Override
  public ReadResult read() {
    AbstractCursor<Column> cursor = getCursorWithResults();
    if (cursor == null) return new ReadResult(); // no more data to read

    return translate(cursor.getCurrent());
  }
  protected AbstractCursor<Column> getCursorWithResults() {
    if (cursor != null && cursor.next()) {
      return cursor;
    } else if (currentIndex >= existingPartitions.size()) return null;

    int count = 0;
    do {
      Long currentPartId = existingPartitions.get(currentIndex);
      NoSqlTypedSession em = mgr.getTypedSession();
      NoSqlSession raw = em.getRawSession();

      byte[] rowKeyPostFix =
          meta.getIdColumnMeta().convertToStorage2(new BigInteger("" + currentPartId));
      byte[] rowKey = meta.getIdColumnMeta().formVirtRowKey(rowKeyPostFix);
      cursor = raw.columnSlice(meta, rowKey, startBytes, endBytes, 500, BigInteger.class);
      currentIndex++;
      if (cursor.next()) return cursor;
      count++;

    } while (!hasReachedEnd(end));

    // reached end and no data found
    return null;
  }