@@ -226,12 +226,11 @@ impl MetricsSet {
226226 self . metrics . push ( metric)
227227 }
228228
229- /// Extends the current list of metrics with the provided ones
230- pub fn extend ( & mut self , metrics : impl IntoIterator < Item = Arc < Metric > > ) {
231- self . metrics . extend ( metrics)
232- }
233-
234229 /// Returns an iterator across all metrics
230+ #[ deprecated(
231+ since = "53.1.0" ,
232+ note = "use `IntoIterator for &MetricsSet` instead, e.g. `for m in &metrics_set` or `(&metrics_set).into_iter()`"
233+ ) ]
235234 pub fn iter ( & self ) -> impl Iterator < Item = & Arc < Metric > > {
236235 self . metrics . iter ( )
237236 }
@@ -447,6 +446,21 @@ impl IntoIterator for MetricsSet {
447446 }
448447}
449448
449+ impl < ' a > IntoIterator for & ' a MetricsSet {
450+ type Item = & ' a Arc < Metric > ;
451+ type IntoIter = std:: slice:: Iter < ' a , Arc < Metric > > ;
452+
453+ fn into_iter ( self ) -> Self :: IntoIter {
454+ self . metrics . iter ( )
455+ }
456+ }
457+
458+ impl Extend < Arc < Metric > > for MetricsSet {
459+ fn extend < I : IntoIterator < Item = Arc < Metric > > > ( & mut self , iter : I ) {
460+ self . metrics . extend ( iter) ;
461+ }
462+ }
463+
450464impl FromIterator < Arc < Metric > > for MetricsSet {
451465 fn from_iter < T : IntoIterator < Item = Arc < Metric > > > ( iter : T ) -> Self {
452466 Self {
@@ -783,6 +797,52 @@ mod tests {
783797 } ;
784798 }
785799
800+ #[ test]
801+ fn test_extend ( ) {
802+ let mut metrics = MetricsSet :: new ( ) ;
803+ let m1 = Arc :: new ( Metric :: new ( MetricValue :: OutputRows ( Count :: new ( ) ) , None ) ) ;
804+ let m2 = Arc :: new ( Metric :: new ( MetricValue :: SpillCount ( Count :: new ( ) ) , None ) ) ;
805+
806+ metrics. extend ( [ Arc :: clone ( & m1) , Arc :: clone ( & m2) ] ) ;
807+ assert_eq ! ( metrics. iter( ) . count( ) , 2 ) ;
808+
809+ let m3 = Arc :: new ( Metric :: new ( MetricValue :: SpilledBytes ( Count :: new ( ) ) , None ) ) ;
810+ metrics. extend ( std:: iter:: once ( Arc :: clone ( & m3) ) ) ;
811+ assert_eq ! ( metrics. iter( ) . count( ) , 3 ) ;
812+ }
813+
814+ #[ test]
815+ fn test_collect ( ) {
816+ let m1 = Arc :: new ( Metric :: new ( MetricValue :: OutputRows ( Count :: new ( ) ) , None ) ) ;
817+ let m2 = Arc :: new ( Metric :: new ( MetricValue :: SpillCount ( Count :: new ( ) ) , None ) ) ;
818+
819+ let metrics: MetricsSet =
820+ vec ! [ Arc :: clone( & m1) , Arc :: clone( & m2) ] . into_iter ( ) . collect ( ) ;
821+ assert_eq ! ( metrics. iter( ) . count( ) , 2 ) ;
822+
823+ let empty: MetricsSet = std:: iter:: empty ( ) . collect ( ) ;
824+ assert_eq ! ( empty. iter( ) . count( ) , 0 ) ;
825+ }
826+
827+ #[ test]
828+ fn test_into_iterator_by_ref ( ) {
829+ let mut metrics = MetricsSet :: new ( ) ;
830+ metrics. push ( Arc :: new ( Metric :: new (
831+ MetricValue :: OutputRows ( Count :: new ( ) ) ,
832+ None ,
833+ ) ) ) ;
834+ metrics. push ( Arc :: new ( Metric :: new (
835+ MetricValue :: SpillCount ( Count :: new ( ) ) ,
836+ None ,
837+ ) ) ) ;
838+
839+ let mut count = 0 ;
840+ for _m in & metrics {
841+ count += 1 ;
842+ }
843+ assert_eq ! ( count, 2 ) ;
844+ }
845+
786846 #[ test]
787847 fn test_sorted_for_display ( ) {
788848 let metrics = ExecutionPlanMetricsSet :: new ( ) ;
0 commit comments