@VisibleForTesting
  static boolean fileMatchesPredicate(
      Map<Integer, Type.PrimitiveType> primitiveTypeForFieldId,
      TupleDomain<IcebergColumnHandle> dynamicFilterPredicate,
      @Nullable Map<Integer, ByteBuffer> lowerBounds,
      @Nullable Map<Integer, ByteBuffer> upperBounds,
      @Nullable Map<Integer, Long> nullValueCounts) {
    if (dynamicFilterPredicate.isNone()) {
      return false;
    }
    Map<IcebergColumnHandle, Domain> domains = dynamicFilterPredicate.getDomains().orElseThrow();

    for (Map.Entry<IcebergColumnHandle, Domain> domainEntry : domains.entrySet()) {
      IcebergColumnHandle column = domainEntry.getKey();
      Domain domain = domainEntry.getValue();

      int fieldId = column.getId();
      boolean mayContainNulls;
      if (nullValueCounts == null) {
        mayContainNulls = true;
      } else {
        Long nullValueCount = nullValueCounts.get(fieldId);
        mayContainNulls = nullValueCount == null || nullValueCount > 0;
      }
      Type type = primitiveTypeForFieldId.get(fieldId);
      Domain statisticsDomain =
          domainForStatistics(
              column.getType(),
              lowerBounds == null ? null : fromByteBuffer(type, lowerBounds.get(fieldId)),
              upperBounds == null ? null : fromByteBuffer(type, upperBounds.get(fieldId)),
              mayContainNulls);
      if (!domain.overlaps(statisticsDomain)) {
        return false;
      }
    }
    return true;
  }
Iceberg original IcebergSplitSource has some problems for mixed-format table, such as iceberg
version, table type.
amoro-format-mixed/amoro-mixed-trino/src/main/java/org/apache/amoro/trino/unkeyed/IcebergSplitSource.java