@@ -16,6 +16,9 @@ pub struct DeltaCache {
1616
1717impl DeltaCache {
1818 pub fn new ( hydration_event : DeltaHydrationEvent , max_length : usize ) -> Self {
19+ let mut hydration_event = hydration_event;
20+ hydration_event. segments . sort_by_key ( |segment| segment. id ) ;
21+
1922 let mut cache = DeltaCache {
2023 max_length,
2124 events : Vec :: new ( ) ,
@@ -101,6 +104,9 @@ impl DeltaCache {
101104 * existing = segment. clone ( ) ;
102105 } else {
103106 self . hydration_event . segments . push ( segment. clone ( ) ) ;
107+ self . hydration_event
108+ . segments
109+ . sort_by_key ( |existing_segment| existing_segment. id ) ;
104110 }
105111 }
106112 DeltaEvent :: SegmentRemoved { segment_id, .. } => {
@@ -256,4 +262,56 @@ mod tests {
256262 assert_eq ! ( delta_cache. get_events( ) [ 1 ] , initial_feature_event) ;
257263 assert_eq ! ( delta_cache. get_events( ) [ 2 ] , updated_feature_event) ;
258264 }
265+
266+ #[ test]
267+ fn keeps_hydration_segments_sorted_by_id_after_segment_changes ( ) {
268+ let base_event = DeltaHydrationEvent {
269+ event_id : 1 ,
270+ features : vec ! [ ClientFeature {
271+ name: "base-flag" . to_string( ) ,
272+ ..ClientFeature :: default ( )
273+ } ] ,
274+ segments : vec ! [
275+ Segment {
276+ id: 10 ,
277+ constraints: vec![ ] ,
278+ } ,
279+ Segment {
280+ id: 2 ,
281+ constraints: vec![ ] ,
282+ } ,
283+ ] ,
284+ } ;
285+ let mut delta_cache = DeltaCache :: new ( base_event, 10 ) ;
286+
287+ delta_cache. add_events ( & [
288+ DeltaEvent :: SegmentUpdated {
289+ event_id : 2 ,
290+ segment : Segment {
291+ id : 7 ,
292+ constraints : vec ! [ ] ,
293+ } ,
294+ } ,
295+ DeltaEvent :: SegmentUpdated {
296+ event_id : 3 ,
297+ segment : Segment {
298+ id : 1 ,
299+ constraints : vec ! [ ] ,
300+ } ,
301+ } ,
302+ DeltaEvent :: SegmentRemoved {
303+ event_id : 4 ,
304+ segment_id : 7 ,
305+ } ,
306+ ] ) ;
307+
308+ let segment_ids: Vec < i32 > = delta_cache
309+ . get_hydration_event ( )
310+ . segments
311+ . iter ( )
312+ . map ( |s| s. id )
313+ . collect ( ) ;
314+
315+ assert_eq ! ( segment_ids, vec![ 1 , 2 , 10 ] ) ;
316+ }
259317}
0 commit comments