@@ -22,28 +22,39 @@ use super::evaluator::{evaluate_source_entry, ScopeValueBuilder};
2222
2323#[ derive( Debug , Serialize , Default ) ]
2424pub struct UpdateStats {
25+ pub num_skipped : AtomicUsize ,
2526 pub num_insertions : AtomicUsize ,
2627 pub num_deletions : AtomicUsize ,
27- pub num_already_exists : AtomicUsize ,
28+ pub num_repreocesses : AtomicUsize ,
2829 pub num_errors : AtomicUsize ,
2930}
3031
3132impl std:: fmt:: Display for UpdateStats {
3233 fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
33- let num_source_rows = self . num_insertions . load ( Relaxed )
34- + self . num_deletions . load ( Relaxed )
35- + self . num_already_exists . load ( Relaxed ) ;
36- write ! ( f, "{num_source_rows} source rows processed" , ) ?;
37- if self . num_errors . load ( Relaxed ) > 0 {
38- write ! ( f, " with {} ERRORS" , self . num_errors. load( Relaxed ) ) ?;
34+ let num_skipped = self . num_skipped . load ( Relaxed ) ;
35+ if num_skipped > 0 {
36+ write ! ( f, "{} rows skipped" , num_skipped) ?;
37+ }
38+
39+ let num_insertions = self . num_insertions . load ( Relaxed ) ;
40+ let num_deletions = self . num_deletions . load ( Relaxed ) ;
41+ let num_reprocesses = self . num_repreocesses . load ( Relaxed ) ;
42+ let num_source_rows = num_insertions + num_deletions + num_reprocesses;
43+ if num_source_rows > 0 {
44+ if num_skipped > 0 {
45+ write ! ( f, ", " ) ?;
46+ }
47+ write ! ( f, "{num_source_rows} source rows processed" , ) ?;
48+
49+ let num_errors = self . num_errors . load ( Relaxed ) ;
50+ if num_errors > 0 {
51+ write ! ( f, " with {num_errors} ERRORS" , ) ?;
52+ }
53+ write ! (
54+ f,
55+ ": {num_insertions} added, {num_deletions} removed, {num_reprocesses} repocessed" ,
56+ ) ?;
3957 }
40- write ! (
41- f,
42- ": {} added, {} removed, {} already exists" ,
43- self . num_insertions. load( Relaxed ) ,
44- self . num_deletions. load( Relaxed ) ,
45- self . num_already_exists. load( Relaxed )
46- ) ?;
4758 Ok ( ( ) )
4859 }
4960}
@@ -495,8 +506,11 @@ pub async fn update_source_entry(
495506 ( Some ( source_ordinal) , Some ( existing_source_ordinal) ) => {
496507 if source_ordinal < existing_source_ordinal
497508 || ( source_ordinal == existing_source_ordinal
498- && existing_logic_fingerprint == source_op. )
509+ && existing_logic_fingerprint. as_ref ( ) . map ( |v| v. as_slice ( ) )
510+ == Some ( plan. logic_fingerprint . 0 . as_slice ( ) ) )
499511 {
512+ // TODO: We should detect based on finer grain fingerprint.
513+ stats. num_skipped . fetch_add ( 1 , Relaxed ) ;
500514 return Ok ( ( ) ) ;
501515 }
502516 }
@@ -538,7 +552,7 @@ pub async fn update_source_entry(
538552 } ;
539553 if already_exists {
540554 if output. is_some ( ) {
541- stats. num_already_exists . fetch_add ( 1 , Relaxed ) ;
555+ stats. num_repreocesses . fetch_add ( 1 , Relaxed ) ;
542556 } else {
543557 stats. num_deletions . fetch_add ( 1 , Relaxed ) ;
544558 }
@@ -590,7 +604,7 @@ pub async fn update_source_entry(
590604 source_op. source_id ,
591605 & source_key_json,
592606 source_ordinal. map ( |o| o. into ( ) ) ,
593- & plan. logic_fingerprint ,
607+ & plan. logic_fingerprint . 0 ,
594608 precommit_output. metadata ,
595609 & process_timestamp,
596610 & plan. tracking_table_setup ,
0 commit comments