Skip to content

Commit 81e16b4

Browse files
committed
Add more iterator methods and unit tests
1 parent f84d26c commit 81e16b4

1 file changed

Lines changed: 65 additions & 5 deletions

File tree

  • datafusion/physical-expr-common/src/metrics

datafusion/physical-expr-common/src/metrics/mod.rs

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
450464
impl 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

Comments
 (0)