@@ -112,25 +112,37 @@ impl OwnedCompactStateAgg {
112
112
113
113
let earlier_len = earlier. combined_durations . len ( ) ;
114
114
115
- let mut added_entries = 0 ;
116
- for dis in later. durations . iter ( ) {
117
- let merged_duration_to_update = merged_durations. iter_mut ( ) . find ( |merged_dis| {
118
- merged_dis. state . materialize ( & merged_states) == dis. state . materialize ( & later_states)
119
- } ) ;
120
- if let Some ( merged_duration_to_update) = merged_duration_to_update {
121
- merged_duration_to_update. duration += dis. duration ;
122
- } else {
123
- let state = dis
124
- . state
125
- . materialize ( & later_states)
126
- . entry ( & mut merged_states) ;
127
- merged_durations. push ( DurationInState {
128
- state,
129
- duration : dis. duration ,
130
- } ) ;
131
- added_entries += 1 ;
115
+ let mut merged_last_state = None ;
116
+ for ( later_idx, dis) in later. durations . iter ( ) . enumerate ( ) {
117
+ let materialized_dis = dis. state . materialize ( & later_states) ;
118
+ let merged_duration_info =
119
+ merged_durations
120
+ . iter_mut ( )
121
+ . enumerate ( )
122
+ . find ( |( _, merged_dis) | {
123
+ merged_dis. state . materialize ( & merged_states) == materialized_dis
124
+ } ) ;
125
+
126
+ let merged_idx =
127
+ if let Some ( ( merged_idx, merged_duration_to_update) ) = merged_duration_info {
128
+ merged_duration_to_update. duration += dis. duration ;
129
+ merged_idx
130
+ } else {
131
+ let state = materialized_dis. entry ( & mut merged_states) ;
132
+ merged_durations. push ( DurationInState {
133
+ state,
134
+ duration : dis. duration ,
135
+ } ) ;
136
+ merged_durations. len ( ) - 1
137
+ } ;
138
+
139
+ if later_idx == later. last_state as usize {
140
+ // this is the last state
141
+ merged_last_state = Some ( merged_idx) ;
132
142
} ;
133
143
}
144
+ let merged_last_state =
145
+ merged_last_state. expect ( "later last_state not in later.durations" ) as u32 ;
134
146
135
147
let mut combined_durations = earlier
136
148
. combined_durations
@@ -187,8 +199,8 @@ impl OwnedCompactStateAgg {
187
199
188
200
first_time : earlier. first_time ,
189
201
last_time : later. last_time ,
190
- first_state : earlier. first_state ,
191
- last_state : added_entries + later . last_state ,
202
+ first_state : earlier. first_state , // indexes into earlier durations are same for merged_durations
203
+ last_state : merged_last_state ,
192
204
193
205
// these values are always the same for both
194
206
compact : earlier. compact ,
0 commit comments