private static void fillFromLogSorted()

in src/main/java/com/spotify/sparkey/IndexHash.java [294:339]


  private static void fillFromLogSorted(
      ReadWriteData indexData, final File logFile,
      IndexHeader header,
      final long start, final long end,
      LogHeader logHeader, final long maxMemory) throws IOException {
    final HashType hashData = header.getHashType();
    AddressSize addressData = header.getAddressData();

    final long hashCapacity = header.getHashCapacity();

    final BlockRandomInput logData =
        logHeader.getCompressionTypeBackend().createRandomAccessData(new ReadOnlyMemMap(logFile), logHeader.getCompressionBlockSize());

    try {
      final Iterator<SortHelper.Entry> iterator2 = SortHelper.sort(
          logFile, start, end, hashData, hashCapacity, header.getHashSeed(), maxMemory);

      final int maxEntriesPerBlock = logHeader.getMaxEntriesPerBlock();
      final int entryIndexbits = calcEntryBlockBits(maxEntriesPerBlock);

      final byte[] keyBuf1 = new byte[(int) logHeader.getMaxKeyLen()];
      final byte[] keyBuf2 = new byte[(int) logHeader.getMaxKeyLen()];
      while (iterator2.hasNext()) {
        final SortHelper.Entry entry = iterator2.next();

        // Safe cast, since the iterator is known to be a SparkeyLogIterator
        final SparkeyReader.Type type = (entry.address & 1) == 0 ? SparkeyReader.Type.DELETE : SparkeyReader.Type.PUT;
        final long address = entry.address >>> 1;
        final long hash = entry.hash;
        switch (type) {
          case PUT:
            put(indexData, header, hashCapacity, -1, keyBuf1,
                logData, keyBuf2, hashData, addressData, header.getEntryBlockBitsBitmask(), entryIndexbits,
                hash, address);
            break;
          case DELETE:
            delete(indexData, header, hashCapacity, -1, keyBuf1, logData, keyBuf2,
                hashData, addressData, header.getEntryBlockBitsBitmask(), entryIndexbits,
                hash, address);
            break;
        }
      }
    } finally {
      logData.close();
    }
  }