2020
2121import org .apache .paimon .CoreOptions ;
2222import org .apache .paimon .Snapshot ;
23+ import org .apache .paimon .options .Options ;
2324import org .apache .paimon .schema .SchemaManager ;
2425import org .apache .paimon .schema .TableSchema ;
2526import org .apache .paimon .table .FileStoreTable ;
2627import org .apache .paimon .utils .ChangelogManager ;
2728import org .apache .paimon .utils .FunctionWithException ;
2829import org .apache .paimon .utils .SnapshotManager ;
30+ import org .apache .paimon .utils .TagManager ;
2931
3032import org .slf4j .Logger ;
3133import org .slf4j .LoggerFactory ;
@@ -44,6 +46,8 @@ public class TimeTravelUtil {
4446
4547 private static final Logger LOG = LoggerFactory .getLogger (TimeTravelUtil .class );
4648
49+ private static final String WATERMARK_PREFIX = "watermark-" ;
50+
4751 private static final String [] SCAN_KEYS = {
4852 CoreOptions .SCAN_SNAPSHOT_ID .key (),
4953 CoreOptions .SCAN_TAG_NAME .key (),
@@ -53,15 +57,18 @@ public class TimeTravelUtil {
5357
5458 @ Nullable
5559 public static Snapshot resolveSnapshot (FileStoreTable table ) {
56- return resolveSnapshotFromOptions (table .coreOptions (), table .snapshotManager ());
60+ return resolveSnapshotFromOptions (
61+ table .coreOptions ().toConfiguration (), table .snapshotManager (), table .tagManager ());
5762 }
5863
5964 @ Nullable
6065 public static Snapshot resolveSnapshotFromOptions (
61- CoreOptions options , SnapshotManager snapshotManager ) {
66+ Options options , SnapshotManager snapshotManager , TagManager tagManager ) {
67+ adaptScanVersion (options , tagManager );
68+
6269 List <String > scanHandleKey = new ArrayList <>(1 );
6370 for (String key : SCAN_KEYS ) {
64- if (options .toConfiguration (). containsKey (key )) {
71+ if (options .containsKey (key )) {
6572 scanHandleKey .add (key );
6673 }
6774 }
@@ -81,28 +88,49 @@ public static Snapshot resolveSnapshotFromOptions(
8188
8289 String key = scanHandleKey .get (0 );
8390 Snapshot snapshot = null ;
91+ CoreOptions coreOptions = new CoreOptions (options );
8492 if (key .equals (CoreOptions .SCAN_SNAPSHOT_ID .key ())) {
8593 snapshot =
86- new StaticFromSnapshotStartingScanner (snapshotManager , options .scanSnapshotId ())
94+ new StaticFromSnapshotStartingScanner (
95+ snapshotManager , coreOptions .scanSnapshotId ())
8796 .getSnapshot ();
8897 } else if (key .equals (CoreOptions .SCAN_WATERMARK .key ())) {
8998 snapshot =
90- new StaticFromWatermarkStartingScanner (snapshotManager , options .scanWatermark ())
99+ new StaticFromWatermarkStartingScanner (
100+ snapshotManager , coreOptions .scanWatermark ())
91101 .getSnapshot ();
92102 } else if (key .equals (CoreOptions .SCAN_TIMESTAMP_MILLIS .key ())) {
93103 snapshot =
94104 new StaticFromTimestampStartingScanner (
95- snapshotManager , options .scanTimestampMills ())
105+ snapshotManager , coreOptions .scanTimestampMills ())
96106 .getSnapshot ();
97107 } else if (key .equals (CoreOptions .SCAN_TAG_NAME .key ())) {
98108 snapshot =
99- new StaticFromTagStartingScanner (snapshotManager , options .scanTagName ())
109+ new StaticFromTagStartingScanner (snapshotManager , coreOptions .scanTagName ())
100110 .getSnapshot ();
101111 }
102112
103113 return snapshot ;
104114 }
105115
116+ private static void adaptScanVersion (Options options , TagManager tagManager ) {
117+ String version = options .remove (CoreOptions .SCAN_VERSION .key ());
118+ if (version == null ) {
119+ return ;
120+ }
121+
122+ if (tagManager .tagExists (version )) {
123+ options .set (CoreOptions .SCAN_TAG_NAME , version );
124+ } else if (version .startsWith (WATERMARK_PREFIX )) {
125+ long watermark = Long .parseLong (version .substring (WATERMARK_PREFIX .length ()));
126+ options .set (CoreOptions .SCAN_WATERMARK , watermark );
127+ } else if (version .chars ().allMatch (Character ::isDigit )) {
128+ options .set (CoreOptions .SCAN_SNAPSHOT_ID .key (), version );
129+ } else {
130+ throw new RuntimeException ("Cannot find a time travel version for " + version );
131+ }
132+ }
133+
106134 /**
107135 * Returns the latest snapshot earlier than the timestamp mills. A non-existent snapshot may be
108136 * returned if all snapshots are equal to or later than the timestamp mills.
0 commit comments