Plan the full scan: resolve snapshot (via options or latest), then read manifests and build DataSplits. Time travel is resolved from table options: - only one of `scan.version`, `scan.timestamp-millis` may be set - `scan.version` → tag name (if exists) → snapshot id (if parseable) → error - `scan.timestamp-millis` → find the latest snapshot <= that timestamp - otherwise → read the latest snapshot
(&self)
| 371 | /// |
| 372 | /// Reference: [TimeTravelUtil.tryTravelToSnapshot](https://github.com/apache/paimon/blob/master/paimon-core/src/main/java/org/apache/paimon/table/source/snapshot/TimeTravelUtil.java) |
| 373 | pub async fn plan(&self) -> crate::Result<Plan> { |
| 374 | let snapshot = match self.resolve_snapshot().await? { |
| 375 | Some(snapshot) => snapshot, |
| 376 | None => return Ok(Plan::new(Vec::new())), |
| 377 | }; |
| 378 | self.plan_snapshot(snapshot).await |
| 379 | } |
| 380 | |
| 381 | async fn resolve_snapshot(&self) -> crate::Result<Option<Snapshot>> { |
| 382 | let file_io = self.table.file_io(); |