@@ -44,10 +44,9 @@ pub(crate) static EMPTY_SNAPSHOT_ID: i64 = -1;
4444pub ( crate ) static INITIAL_SEQUENCE_NUMBER : i64 = 0 ;
4545
4646/// Property key for the format version.
47- pub const PROPERTY_FORMAT_VERSION : & ' static str = "format-version" ;
47+ pub const PROPERTY_FORMAT_VERSION : & str = "format-version" ;
4848/// Property key for max number of previous versions to keep.
49- pub const PROPERTY_METADATA_PREVIOUS_VERSIONS_MAX : & ' static str =
50- "write.metadata.previous-versions-max" ;
49+ pub const PROPERTY_METADATA_PREVIOUS_VERSIONS_MAX : & str = "write.metadata.previous-versions-max" ;
5150/// Default value for max number of previous versions to keep.
5251pub const PROPERTY_METADATA_PREVIOUS_VERSIONS_MAX_DEFAULT : usize = 100 ;
5352
@@ -137,9 +136,9 @@ impl TableMetadata {
137136 format_version : FormatVersion ,
138137 properties : HashMap < String , String > ,
139138 ) -> Result < Self > {
140- super :: table_metadata_builder :: TableMetadataBuilder :: new (
139+ Self :: builder (
141140 schema,
142- spec. into ( ) ,
141+ spec,
143142 sort_order,
144143 location,
145144 format_version,
@@ -149,19 +148,32 @@ impl TableMetadata {
149148 . map ( |x| x. metadata )
150149 }
151150
151+ /// Create a new table metadata builder
152+ pub fn builder (
153+ schema : Schema ,
154+ spec : impl Into < UnboundPartitionSpec > ,
155+ sort_order : SortOrder ,
156+ location : String ,
157+ format_version : FormatVersion ,
158+ properties : HashMap < String , String > ,
159+ ) -> Result < TableMetadataBuilder > {
160+ TableMetadataBuilder :: new (
161+ schema,
162+ spec. into ( ) ,
163+ sort_order,
164+ location,
165+ format_version,
166+ properties,
167+ )
168+ }
169+
152170 /// Convert this Table Metadata into a builder for modification.
153171 ///
154172 /// `current_file_location` is the location where the current version
155173 /// of the metadata file is stored. This is used to update the metadata log.
156174 #[ must_use]
157- pub fn into_builder (
158- self ,
159- current_file_location : impl Into < String > ,
160- ) -> super :: table_metadata_builder:: TableMetadataBuilder {
161- super :: table_metadata_builder:: TableMetadataBuilder :: new_from_metadata (
162- self ,
163- current_file_location,
164- )
175+ pub fn into_builder ( self , current_file_location : impl Into < String > ) -> TableMetadataBuilder {
176+ TableMetadataBuilder :: new_from_metadata ( self , current_file_location)
165177 }
166178
167179 /// Returns format version of this metadata.
@@ -277,7 +289,7 @@ impl TableMetadata {
277289 pub fn snapshot_for_ref ( & self , ref_name : & str ) -> Option < & SnapshotRef > {
278290 self . refs . get ( ref_name) . map ( |r| {
279291 self . snapshot_by_id ( r. snapshot_id )
280- . expect ( format ! ( "Snapshot id of ref {} doesn't exist" , ref_name) . as_str ( ) )
292+ . unwrap_or_else ( || panic ! ( "Snapshot id of ref {} doesn't exist" , ref_name) )
281293 } )
282294 }
283295
@@ -397,16 +409,14 @@ impl TableMetadata {
397409 if let Some ( current_snapshot_id) = self . current_snapshot_id {
398410 if current_snapshot_id == EMPTY_SNAPSHOT_ID {
399411 self . current_snapshot_id = None ;
400- } else {
401- if self . snapshot_by_id ( current_snapshot_id) . is_none ( ) {
402- return Err ( Error :: new (
412+ } else if self . snapshot_by_id ( current_snapshot_id) . is_none ( ) {
413+ return Err ( Error :: new (
403414 ErrorKind :: DataInvalid ,
404415 format ! (
405416 "Snapshot for current snapshot id {} does not exist in the existing snapshots list" ,
406417 current_snapshot_id
407418 ) ,
408419 ) ) ;
409- }
410420 }
411421 }
412422 Ok ( ( ) )
@@ -438,30 +448,27 @@ impl TableMetadata {
438448 ) ) ;
439449 }
440450 }
441- } else {
442- if main_ref. is_none ( ) {
443- return Err ( Error :: new (
444- ErrorKind :: DataInvalid ,
445- "Current snapshot is not set, but main branch exists" ,
446- ) ) ;
447- }
451+ } else if main_ref. is_some ( ) {
452+ return Err ( Error :: new (
453+ ErrorKind :: DataInvalid ,
454+ "Current snapshot is not set, but main branch exists" ,
455+ ) ) ;
448456 }
449457
450458 Ok ( ( ) )
451459 }
452460
453461 fn validate_format_version_specifics ( & self ) -> Result < ( ) > {
454- if self . format_version < FormatVersion :: V2 {
455- if self . last_sequence_number != 0 {
456- return Err ( Error :: new (
457- ErrorKind :: DataInvalid ,
458- format ! (
459- "Last sequence number must be 0 in v1. Found {}" ,
460- self . last_sequence_number
461- ) ,
462- ) ) ;
463- }
462+ if self . format_version < FormatVersion :: V2 && self . last_sequence_number != 0 {
463+ return Err ( Error :: new (
464+ ErrorKind :: DataInvalid ,
465+ format ! (
466+ "Last sequence number must be 0 in v1. Found {}" ,
467+ self . last_sequence_number
468+ ) ,
469+ ) ) ;
464470 }
471+
465472 Ok ( ( ) )
466473 }
467474
@@ -1132,7 +1139,7 @@ mod tests {
11321139 "current-schema-id" : 1,
11331140 "partition-specs": [
11341141 {
1135- "spec-id": 1 ,
1142+ "spec-id": 0 ,
11361143 "fields": [
11371144 {
11381145 "source-id": 4,
@@ -1143,7 +1150,7 @@ mod tests {
11431150 ]
11441151 }
11451152 ],
1146- "default-spec-id": 1 ,
1153+ "default-spec-id": 0 ,
11471154 "last-partition-id": 1000,
11481155 "properties": {
11491156 "commit.retry.num-retries": "1"
@@ -1154,7 +1161,12 @@ mod tests {
11541161 "timestamp-ms": 1515100
11551162 }
11561163 ],
1157- "sort-orders": [],
1164+ "sort-orders": [
1165+ {
1166+ "order-id": 0,
1167+ "fields": []
1168+ }
1169+ ],
11581170 "default-sort-order-id": 0
11591171 }
11601172 "# ;
@@ -1170,7 +1182,7 @@ mod tests {
11701182 . unwrap ( ) ;
11711183
11721184 let partition_spec = PartitionSpec {
1173- spec_id : 1 ,
1185+ spec_id : 0 ,
11741186 fields : vec ! [ PartitionField {
11751187 name: "ts_day" . to_string( ) ,
11761188 transform: Transform :: Day ,
@@ -1187,11 +1199,11 @@ mod tests {
11871199 last_column_id : 1 ,
11881200 schemas : HashMap :: from_iter ( vec ! [ ( 1 , Arc :: new( schema) ) ] ) ,
11891201 current_schema_id : 1 ,
1190- partition_specs : HashMap :: from_iter ( vec ! [ ( 1 , partition_spec. into( ) ) ] ) ,
1191- default_spec_id : 1 ,
1202+ partition_specs : HashMap :: from_iter ( vec ! [ ( 0 , partition_spec. into( ) ) ] ) ,
1203+ default_spec_id : 0 ,
11921204 last_partition_id : 1000 ,
11931205 default_sort_order_id : 0 ,
1194- sort_orders : HashMap :: from_iter ( vec ! [ ] ) ,
1206+ sort_orders : HashMap :: from_iter ( vec ! [ ( 0 , SortOrder :: unsorted_order ( ) . into ( ) ) ] ) ,
11951207 snapshots : HashMap :: default ( ) ,
11961208 current_snapshot_id : None ,
11971209 last_sequence_number : 1 ,
@@ -1663,21 +1675,15 @@ mod tests {
16631675 default_spec_id : 0 ,
16641676 last_partition_id : 0 ,
16651677 default_sort_order_id : 0 ,
1666- sort_orders : HashMap :: new ( ) ,
1678+ // Sort order is added during deserialization for V2 compatibility
1679+ sort_orders : HashMap :: from_iter ( vec ! [ ( 0 , SortOrder :: unsorted_order( ) . into( ) ) ] ) ,
16671680 snapshots : HashMap :: new ( ) ,
16681681 current_snapshot_id : None ,
16691682 last_sequence_number : 0 ,
16701683 properties : HashMap :: new ( ) ,
16711684 snapshot_log : vec ! [ ] ,
16721685 metadata_log : Vec :: new ( ) ,
1673- refs : HashMap :: from_iter ( vec ! [ ( "main" . to_string( ) , SnapshotReference {
1674- snapshot_id: -1 ,
1675- retention: SnapshotRetention :: Branch {
1676- min_snapshots_to_keep: None ,
1677- max_snapshot_age_ms: None ,
1678- max_ref_age_ms: None ,
1679- } ,
1680- } ) ] ) ,
1686+ refs : HashMap :: new ( ) ,
16811687 } ;
16821688
16831689 check_table_metadata_serde ( & metadata, expected) ;
0 commit comments