@@ -285,7 +285,7 @@ impl Transaction {
285
285
engine : & ' a dyn Engine ,
286
286
domain_metadatas : & ' a [ DomainMetadata ] ,
287
287
read_snapshot : & Snapshot ,
288
- row_tracking_high_watermark : Option < i64 > ,
288
+ row_tracking_high_watermark : Option < RowTrackingDomainMetadata > ,
289
289
) -> DeltaResult < impl Iterator < Item = DeltaResult < Box < dyn EngineData > > > + ' a > {
290
290
// if there are domain metadata actions, the table must support it
291
291
if !domain_metadatas. is_empty ( )
@@ -315,7 +315,7 @@ impl Transaction {
315
315
}
316
316
317
317
let system_domains = row_tracking_high_watermark
318
- . map ( |hwm| DomainMetadata :: try_from ( RowTrackingDomainMetadata :: new ( hwm) ) )
318
+ . map ( |hwm| DomainMetadata :: try_from ( hwm) )
319
319
. transpose ( ) ?
320
320
. into_iter ( ) ;
321
321
@@ -370,7 +370,39 @@ impl Transaction {
370
370
& ' a self ,
371
371
engine : & dyn Engine ,
372
372
commit_version : u64 ,
373
- ) -> DeltaResult < ( EngineDataResultIterator < ' a > , Option < i64 > ) > {
373
+ ) -> DeltaResult < (
374
+ EngineDataResultIterator < ' a > ,
375
+ Option < RowTrackingDomainMetadata > ,
376
+ ) > {
377
+ fn build_add_actions < ' a , I , T > (
378
+ engine : & dyn Engine ,
379
+ add_files_metadata : I ,
380
+ input_schema : SchemaRef ,
381
+ output_schema : SchemaRef ,
382
+ ) -> impl Iterator < Item = DeltaResult < Box < dyn EngineData > > > + ' a
383
+ where
384
+ I : Iterator < Item = DeltaResult < T > > + Send + ' a ,
385
+ T : Deref < Target = dyn EngineData > + Send + ' a ,
386
+ {
387
+ let evaluation_handler = engine. evaluation_handler ( ) ;
388
+
389
+ add_files_metadata. map ( move |add_files_batch| {
390
+ // Convert stats to a JSON string and nest the add action in a top-level struct
391
+ let adds_expr = Expression :: struct_from ( [ Expression :: transform (
392
+ Transform :: new_top_level ( ) . with_replaced_field (
393
+ "stats" ,
394
+ Expression :: unary ( ToJson , Expression :: column ( [ "stats" ] ) ) . into ( ) ,
395
+ ) ,
396
+ ) ] ) ;
397
+ let adds_evaluator = evaluation_handler. new_expression_evaluator (
398
+ input_schema. clone ( ) ,
399
+ Arc :: new ( adds_expr) ,
400
+ output_schema. clone ( ) . into ( ) ,
401
+ ) ;
402
+ adds_evaluator. evaluate ( add_files_batch?. deref ( ) )
403
+ } )
404
+ }
405
+
374
406
if self . add_files_metadata . is_empty ( ) {
375
407
return Ok ( ( Box :: new ( iter:: empty ( ) ) , None ) ) ;
376
408
}
@@ -411,7 +443,7 @@ impl Transaction {
411
443
} ,
412
444
) ;
413
445
414
- let add_actions = self . create_add_actions (
446
+ let add_actions = build_add_actions (
415
447
engine,
416
448
extended_add_files,
417
449
with_row_tracking_cols ( add_files_schema ( ) ) ,
@@ -420,13 +452,13 @@ impl Transaction {
420
452
) ) ) ,
421
453
) ;
422
454
423
- Ok ( (
424
- Box :: new ( add_actions ) ,
425
- Some ( row_tracking_visitor . row_id_high_water_mark ) ,
426
- ) )
455
+ let row_tracking_domain_metadata =
456
+ RowTrackingDomainMetadata :: new ( row_tracking_visitor . row_id_high_water_mark ) ;
457
+
458
+ Ok ( ( Box :: new ( add_actions ) , Some ( row_tracking_domain_metadata ) ) )
427
459
} else {
428
460
// Simple case without row tracking
429
- let add_actions = self . create_add_actions (
461
+ let add_actions = build_add_actions (
430
462
engine,
431
463
self . add_files_metadata . iter ( ) . map ( |a| Ok ( a. deref ( ) ) ) ,
432
464
add_files_schema ( ) . clone ( ) ,
@@ -436,37 +468,6 @@ impl Transaction {
436
468
Ok ( ( Box :: new ( add_actions) , None ) )
437
469
}
438
470
}
439
-
440
- /// Convert file metadata provided by the engine into protocol-compliant add actions.
441
- fn create_add_actions < ' a , I , T > (
442
- & ' a self ,
443
- engine : & dyn Engine ,
444
- add_files_metadata : I ,
445
- input_schema : SchemaRef ,
446
- output_schema : SchemaRef ,
447
- ) -> impl Iterator < Item = DeltaResult < Box < dyn EngineData > > > + ' a
448
- where
449
- I : Iterator < Item = DeltaResult < T > > + Send + ' a ,
450
- T : Deref < Target = dyn EngineData > + Send + ' a ,
451
- {
452
- let evaluation_handler = engine. evaluation_handler ( ) ;
453
-
454
- add_files_metadata. map ( move |add_files_batch| {
455
- // Convert stats to a JSON string and nest the add action in a top-level struct
456
- let adds_expr = Expression :: struct_from ( [ Expression :: transform (
457
- Transform :: new_top_level ( ) . with_replaced_field (
458
- "stats" ,
459
- Expression :: unary ( ToJson , Expression :: column ( [ "stats" ] ) ) . into ( ) ,
460
- ) ,
461
- ) ] ) ;
462
- let adds_evaluator = evaluation_handler. new_expression_evaluator (
463
- input_schema. clone ( ) ,
464
- Arc :: new ( adds_expr) ,
465
- output_schema. clone ( ) . into ( ) ,
466
- ) ;
467
- adds_evaluator. evaluate ( add_files_batch?. deref ( ) )
468
- } )
469
- }
470
471
}
471
472
472
473
/// WriteContext is data derived from a [`Transaction`] that can be provided to writers in order to
0 commit comments