public static BaseAndChangeTask of(CloseableIterable<CombinedScanTask> combinedScanTasks) {
      try (CloseableIterator<CombinedScanTask> initTasks = combinedScanTasks.iterator()) {
        final Set<MixedFileScanTask> allBaseTasks = new HashSet<>();
        final Map<Long, TransactionTask> transactionTasks = new HashMap<>();

        while (initTasks.hasNext()) {
          CombinedScanTask combinedScanTask = initTasks.next();
          combinedScanTask
              .tasks()
              .forEach(
                  keyedTableScanTask -> {
                    allBaseTasks.addAll(keyedTableScanTask.baseTasks());

                    taskMap(keyedTableScanTask.insertTasks(), true, transactionTasks);
                    taskMap(keyedTableScanTask.mixedEquityDeletes(), false, transactionTasks);
                  });
        }
        List<MixedFileScanTask> baseTasks =
            allBaseTasks.stream()
                .sorted(Comparator.comparing(t -> t.file().transactionId()))
                .collect(Collectors.toList());

        return new BaseAndChangeTask(baseTasks, transactionTasks);
      } catch (IOException e) {
        throw new UncheckedIOException(e);
      }
    }
Plans full table scanning for a {@link KeyedTable} with optional filters and a specified split
count.

@param keyedTable The {@link KeyedTable} to scan.
@param filters Optional list of filters to apply to the scan.
@param splitCount The atomic integer to track the split count.
@return The list of planned {@link MixedFormatSplit} included {@link MergeOnReadSplit}.
amoro-format-mixed/amoro-mixed-flink/amoro-mixed-flink-common/src/main/java/org/apache/amoro/flink/read/FlinkSplitPlanner.java