protected ContinuousEnumerationResult discoverIncrementalSplits(
      MixedFormatEnumeratorOffset lastPosition, List<Expression> filters) {
    long fromChangeSnapshotId = lastPosition.changeSnapshotId();
    Snapshot changeSnapshot = table.changeTable().currentSnapshot();
    if (changeSnapshot != null && changeSnapshot.snapshotId() != fromChangeSnapshotId) {
      long snapshotId = changeSnapshot.snapshotId();
      ChangeTableIncrementalScan changeTableScan =
          table.changeTable().newScan().useSnapshot(snapshotId);
      if (filters != null) {
        for (Expression filter : filters) {
          changeTableScan = changeTableScan.filter(filter);
        }
      }

      if (fromChangeSnapshotId != Long.MIN_VALUE) {
        Snapshot snapshot = table.changeTable().snapshot(fromChangeSnapshotId);
        changeTableScan = changeTableScan.fromSequence(snapshot.sequenceNumber());
      }

      List<MixedFormatSplit> changeSplit = planChangeTable(changeTableScan, SPLIT_COUNT);
      return new ContinuousEnumerationResult(
          changeSplit, lastPosition, MixedFormatEnumeratorOffset.of(snapshotId, null));
    }
    return ContinuousEnumerationResult.EMPTY;
  }
Continuous planning {@link KeyedTable} by {@link MixedFormatEnumeratorOffset} and generate a
{@link ContinuousEnumerationResult}.

<p>{@link ContinuousEnumerationResult#splits()} includes the {@link SnapshotSplit}s and {@link
ChangelogSplit}s.
amoro-format-mixed/amoro-mixed-flink/amoro-mixed-flink-common/src/main/java/org/apache/amoro/flink/read/hybrid/enumerator/ContinuousSplitPlannerImpl.java