public static void addField(String dir, String fieldName, FlamdexReader r, final long[] cache)
      throws IOException {
    final File tempFile =
        new File(dir, "temp-" + fieldName + "-" + UUID.randomUUID() + ".intarray.bin");
    try {
      final MMapBuffer buffer =
          new MMapBuffer(
              tempFile,
              0,
              4 * cache.length,
              FileChannel.MapMode.READ_WRITE,
              ByteOrder.nativeOrder());
      try {
        final IntArray indices = buffer.memory().intArray(0, cache.length);
        for (int i = 0; i < cache.length; ++i) {
          indices.set(i, i);
        }
        log.debug("sorting");
        Quicksortables.sort(
            new Quicksortable() {
              @Override
              public void swap(int i, int j) {
                final int t = indices.get(i);
                indices.set(i, indices.get(j));
                indices.set(j, t);
              }

              @Override
              public int compare(int i, int j) {
                final long ii = cache[indices.get(i)];
                final long ij = cache[indices.get(j)];
                return ii < ij
                    ? -1
                    : ii > ij
                        ? 1
                        : indices.get(i) < indices.get(j)
                            ? -1
                            : indices.get(i) > indices.get(j) ? 1 : 0;
              }
            },
            cache.length);

        log.debug("writing field " + fieldName);
        final SimpleFlamdexWriter w = new SimpleFlamdexWriter(dir, r.getNumDocs(), false);
        final IntFieldWriter ifw = w.getIntFieldWriter(fieldName, true);
        long prev = 0;
        boolean prevInitialized = false;
        for (int i = 0; i < cache.length; ++i) {
          final long cur = cache[indices.get(i)];
          if (!prevInitialized || cur != prev) {
            ifw.nextTerm(cur);
            prev = cur;
            prevInitialized = true;
          }
          ifw.nextDoc(indices.get(i));
        }

        ifw.close();
        w.close();
      } finally {
        try {
          buffer.close();
        } catch (IOException e) {
          log.error("error closing MMapBuffer", e);
        }
      }
    } finally {
      if (!tempFile.delete()) {
        log.warn("unable to delete temp file " + tempFile);
      }
    }
  }