@@ -44,10 +44,9 @@ pub(crate) static EMPTY_SNAPSHOT_ID: i64 = -1;
44
44
pub ( crate ) static INITIAL_SEQUENCE_NUMBER : i64 = 0 ;
45
45
46
46
/// 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" ;
48
48
/// 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" ;
51
50
/// Default value for max number of previous versions to keep.
52
51
pub const PROPERTY_METADATA_PREVIOUS_VERSIONS_MAX_DEFAULT : usize = 100 ;
53
52
@@ -137,9 +136,9 @@ impl TableMetadata {
137
136
format_version : FormatVersion ,
138
137
properties : HashMap < String , String > ,
139
138
) -> Result < Self > {
140
- super :: table_metadata_builder :: TableMetadataBuilder :: new (
139
+ Self :: builder (
141
140
schema,
142
- spec. into ( ) ,
141
+ spec,
143
142
sort_order,
144
143
location,
145
144
format_version,
@@ -149,19 +148,32 @@ impl TableMetadata {
149
148
. map ( |x| x. metadata )
150
149
}
151
150
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
+
152
170
/// Convert this Table Metadata into a builder for modification.
153
171
///
154
172
/// `current_file_location` is the location where the current version
155
173
/// of the metadata file is stored. This is used to update the metadata log.
156
174
#[ 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)
165
177
}
166
178
167
179
/// Returns format version of this metadata.
@@ -277,7 +289,7 @@ impl TableMetadata {
277
289
pub fn snapshot_for_ref ( & self , ref_name : & str ) -> Option < & SnapshotRef > {
278
290
self . refs . get ( ref_name) . map ( |r| {
279
291
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) )
281
293
} )
282
294
}
283
295
@@ -397,16 +409,14 @@ impl TableMetadata {
397
409
if let Some ( current_snapshot_id) = self . current_snapshot_id {
398
410
if current_snapshot_id == EMPTY_SNAPSHOT_ID {
399
411
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 (
403
414
ErrorKind :: DataInvalid ,
404
415
format ! (
405
416
"Snapshot for current snapshot id {} does not exist in the existing snapshots list" ,
406
417
current_snapshot_id
407
418
) ,
408
419
) ) ;
409
- }
410
420
}
411
421
}
412
422
Ok ( ( ) )
@@ -438,30 +448,27 @@ impl TableMetadata {
438
448
) ) ;
439
449
}
440
450
}
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
+ ) ) ;
448
456
}
449
457
450
458
Ok ( ( ) )
451
459
}
452
460
453
461
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
+ ) ) ;
464
470
}
471
+
465
472
Ok ( ( ) )
466
473
}
467
474
@@ -1132,7 +1139,7 @@ mod tests {
1132
1139
"current-schema-id" : 1,
1133
1140
"partition-specs": [
1134
1141
{
1135
- "spec-id": 1 ,
1142
+ "spec-id": 0 ,
1136
1143
"fields": [
1137
1144
{
1138
1145
"source-id": 4,
@@ -1143,7 +1150,7 @@ mod tests {
1143
1150
]
1144
1151
}
1145
1152
],
1146
- "default-spec-id": 1 ,
1153
+ "default-spec-id": 0 ,
1147
1154
"last-partition-id": 1000,
1148
1155
"properties": {
1149
1156
"commit.retry.num-retries": "1"
@@ -1154,7 +1161,12 @@ mod tests {
1154
1161
"timestamp-ms": 1515100
1155
1162
}
1156
1163
],
1157
- "sort-orders": [],
1164
+ "sort-orders": [
1165
+ {
1166
+ "order-id": 0,
1167
+ "fields": []
1168
+ }
1169
+ ],
1158
1170
"default-sort-order-id": 0
1159
1171
}
1160
1172
"# ;
@@ -1170,7 +1182,7 @@ mod tests {
1170
1182
. unwrap ( ) ;
1171
1183
1172
1184
let partition_spec = PartitionSpec {
1173
- spec_id : 1 ,
1185
+ spec_id : 0 ,
1174
1186
fields : vec ! [ PartitionField {
1175
1187
name: "ts_day" . to_string( ) ,
1176
1188
transform: Transform :: Day ,
@@ -1187,11 +1199,11 @@ mod tests {
1187
1199
last_column_id : 1 ,
1188
1200
schemas : HashMap :: from_iter ( vec ! [ ( 1 , Arc :: new( schema) ) ] ) ,
1189
1201
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 ,
1192
1204
last_partition_id : 1000 ,
1193
1205
default_sort_order_id : 0 ,
1194
- sort_orders : HashMap :: from_iter ( vec ! [ ] ) ,
1206
+ sort_orders : HashMap :: from_iter ( vec ! [ ( 0 , SortOrder :: unsorted_order ( ) . into ( ) ) ] ) ,
1195
1207
snapshots : HashMap :: default ( ) ,
1196
1208
current_snapshot_id : None ,
1197
1209
last_sequence_number : 1 ,
@@ -1663,21 +1675,15 @@ mod tests {
1663
1675
default_spec_id : 0 ,
1664
1676
last_partition_id : 0 ,
1665
1677
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( ) ) ] ) ,
1667
1680
snapshots : HashMap :: new ( ) ,
1668
1681
current_snapshot_id : None ,
1669
1682
last_sequence_number : 0 ,
1670
1683
properties : HashMap :: new ( ) ,
1671
1684
snapshot_log : vec ! [ ] ,
1672
1685
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 ( ) ,
1681
1687
} ;
1682
1688
1683
1689
check_table_metadata_serde ( & metadata, expected) ;
0 commit comments