private Predicate<StructForDelete<T>> applyPosDeletes() {

    if (posDeletes.isEmpty()) {
      return record -> false;
    }

    if (positionMap == null) {
      positionMap = new HashMap<>();
      List<CloseableIterable<Record>> deletes = Lists.transform(posDeletes, this::openPosDeletes);
      CloseableIterator<Record> iterator = CloseableIterable.concat(deletes).iterator();
      while (iterator.hasNext()) {
        Record deleteRecord = iterator.next();
        String path = FILENAME_ACCESSOR.get(deleteRecord).toString();
        if (positionPathSets != null && !positionPathSets.contains(path)) {
          continue;
        }
        Roaring64Bitmap posBitMap = positionMap.computeIfAbsent(path, k -> new Roaring64Bitmap());
        posBitMap.add((Long) POSITION_ACCESSOR.get(deleteRecord));
      }
    }

    return structLikeForDelete -> {
      Roaring64Bitmap posSet = positionMap.get(structLikeForDelete.filePath());

      if (posSet == null || posSet.isEmpty()) {
        return false;
      }
      return posSet.contains(structLikeForDelete.getPosition());
    };
  }
Get all delete ids of equality delete files

<p>For example, if there are two equality delete fields, one is [1, 2] and another is [1], the
delete ids will be [1, 2].

@return delete ids
amoro-format-iceberg/src/main/java/org/apache/amoro/io/reader/CombinedDeleteFilter.java