@@ -57,6 +57,7 @@ impl std::str::FromStr for MetadataRecordType {
5757fn from_metadata_record < S : DeserializeOwned + Debug + Clone > (
5858 state : Option < serde_json:: Value > ,
5959 staging_changes : sqlx:: types:: Json < Vec < StateChange < serde_json:: Value > > > ,
60+ legacy_state_key : Option < serde_json:: Value > ,
6061) -> Result < CombinedState < S > > {
6162 let current: Option < S > = state. map ( serde_json:: from_value) . transpose ( ) ?;
6263 let staging: Vec < StateChange < S > > = ( staging_changes. 0 . into_iter ( ) )
@@ -67,7 +68,11 @@ fn from_metadata_record<S: DeserializeOwned + Debug + Clone>(
6768 } )
6869 } )
6970 . collect :: < Result < _ > > ( ) ?;
70- Ok ( CombinedState { current, staging } )
71+ Ok ( CombinedState {
72+ current,
73+ staging,
74+ legacy_state_key,
75+ } )
7176}
7277
7378pub async fn get_existing_setup_state ( pool : & PgPool ) -> Result < AllSetupState < ExistingMode > > {
@@ -103,27 +108,33 @@ pub async fn get_existing_setup_state(pool: &PgPool) -> Result<AllSetupState<Exi
103108 db_metadata:: parse_flow_version ( & state) ;
104109 }
105110 MetadataRecordType :: FlowMetadata => {
106- flow_ss. metadata = from_metadata_record ( state, staging_changes) ?;
111+ flow_ss. metadata = from_metadata_record ( state, staging_changes, None ) ?;
107112 }
108113 MetadataRecordType :: TrackingTable => {
109- flow_ss. tracking_table = from_metadata_record ( state, staging_changes) ?;
114+ flow_ss. tracking_table =
115+ from_metadata_record ( state, staging_changes, None ) ?;
110116 }
111117 MetadataRecordType :: Target ( target_type) => {
112118 let normalized_key = {
113119 let registry = executor_factory_registry ( ) ;
114120 match registry. get ( & target_type) {
115121 Some ( ExecutorFactory :: ExportTarget ( factory) ) => {
116- factory. normalize_setup_key ( metadata_record. key ) ?
122+ factory. normalize_setup_key ( & metadata_record. key ) ?
117123 }
118124 _ => metadata_record. key . clone ( ) ,
119125 }
120126 } ;
127+ let combined_state = from_metadata_record (
128+ state,
129+ staging_changes,
130+ ( normalized_key != metadata_record. key ) . then_some ( metadata_record. key ) ,
131+ ) ?;
121132 flow_ss. targets . insert (
122133 super :: ResourceIdentifier {
123134 key : normalized_key,
124135 target_kind : target_type,
125136 } ,
126- from_metadata_record ( state , staging_changes ) ? ,
137+ combined_state ,
127138 ) ;
128139 }
129140 }
@@ -203,6 +214,20 @@ fn group_resource_states<'a>(
203214 if let Some ( current) = & state. current {
204215 entry. existing . current = Some ( current. clone ( ) ) ;
205216 }
217+ if let Some ( legacy_state_key) = & state. legacy_state_key {
218+ if !entry
219+ . existing
220+ . legacy_state_key
221+ . as_ref ( )
222+ . map_or ( false , |v| v == legacy_state_key)
223+ {
224+ warn ! (
225+ "inconsistent legacy key: {:?}, {:?}" ,
226+ key, entry. existing. legacy_state_key
227+ ) ;
228+ }
229+ entry. existing . legacy_state_key = Some ( legacy_state_key. clone ( ) ) ;
230+ }
206231 for s in state. staging . iter ( ) {
207232 match s {
208233 StateChange :: Upsert ( v) => {
@@ -288,6 +313,7 @@ pub async fn check_flow_setup_status(
288313 StateChange :: Delete => Some ( StateChange :: Delete ) ,
289314 } )
290315 . collect ( ) ,
316+ legacy_state_key : v. existing . legacy_state_key . clone ( ) ,
291317 } ;
292318 let never_setup_by_sys = target_state. is_none ( )
293319 && existing_without_setup_by_user. current . is_none ( )
@@ -311,6 +337,13 @@ pub async fn check_flow_setup_status(
311337 state,
312338 description : factory. describe_resource ( & resource_id. key ) ?,
313339 status_check,
340+ legacy_key : v
341+ . existing
342+ . legacy_state_key
343+ . map ( |legacy_state_key| ResourceIdentifier {
344+ target_kind : resource_id. target_kind . clone ( ) ,
345+ key : legacy_state_key,
346+ } ) ,
314347 } ) ;
315348 }
316349 Ok ( FlowSetupStatusCheck {
@@ -406,19 +439,16 @@ pub async fn apply_changes(
406439 } ;
407440 write ! ( write, "\n {verb} flow {flow_name}:\n " ) ?;
408441
409- let mut state_updates =
410- HashMap :: < db_metadata:: ResourceTypeKey , Option < serde_json :: Value > > :: new ( ) ;
442+ let mut update_info =
443+ HashMap :: < db_metadata:: ResourceTypeKey , db_metadata :: StateUpdateInfo > :: new ( ) ;
411444
412445 if let Some ( metadata_change) = & flow_status. metadata_change {
413- state_updates . insert (
446+ update_info . insert (
414447 db_metadata:: ResourceTypeKey :: new (
415448 MetadataRecordType :: FlowMetadata . to_string ( ) ,
416449 serde_json:: Value :: Null ,
417450 ) ,
418- metadata_change
419- . desired_state ( )
420- . map ( serde_json:: to_value)
421- . transpose ( ) ?,
451+ db_metadata:: StateUpdateInfo :: new ( metadata_change. desired_state ( ) , None ) ?,
422452 ) ;
423453 }
424454 if let Some ( tracking_table) = & flow_status. tracking_table {
@@ -428,37 +458,37 @@ pub async fn apply_changes(
428458 . map ( |c| c. change_type ( ) != SetupChangeType :: NoChange )
429459 . unwrap_or_default ( )
430460 {
431- state_updates . insert (
461+ update_info . insert (
432462 db_metadata:: ResourceTypeKey :: new (
433463 MetadataRecordType :: TrackingTable . to_string ( ) ,
434464 serde_json:: Value :: Null ,
435465 ) ,
436- tracking_table
437- . state
438- . as_ref ( )
439- . map ( serde_json:: to_value)
440- . transpose ( ) ?,
466+ db_metadata:: StateUpdateInfo :: new ( tracking_table. state . as_ref ( ) , None ) ?,
441467 ) ;
442468 }
443469 }
444470 for target_resource in & flow_status. target_resources {
445- state_updates . insert (
471+ update_info . insert (
446472 db_metadata:: ResourceTypeKey :: new (
447473 MetadataRecordType :: Target ( target_resource. key . target_kind . clone ( ) ) . to_string ( ) ,
448474 target_resource. key . key . clone ( ) ,
449475 ) ,
450- target_resource
451- . state
452- . as_ref ( )
453- . map ( serde_json:: to_value)
454- . transpose ( ) ?,
476+ db_metadata:: StateUpdateInfo :: new (
477+ target_resource. state . as_ref ( ) ,
478+ target_resource. legacy_key . as_ref ( ) . map ( |k| {
479+ db_metadata:: ResourceTypeKey :: new (
480+ MetadataRecordType :: Target ( k. target_kind . clone ( ) ) . to_string ( ) ,
481+ k. key . clone ( ) ,
482+ )
483+ } ) ,
484+ ) ?,
455485 ) ;
456486 }
457487
458488 let new_version_id = db_metadata:: stage_changes_for_flow (
459489 flow_name,
460490 flow_status. seen_flow_metadata_version ,
461- & state_updates ,
491+ & update_info ,
462492 pool,
463493 )
464494 . await ?;
@@ -474,7 +504,7 @@ pub async fn apply_changes(
474504 db_metadata:: commit_changes_for_flow (
475505 flow_name,
476506 new_version_id,
477- state_updates ,
507+ update_info ,
478508 is_deletion,
479509 pool,
480510 )
0 commit comments