diff --git a/rebench/model/data_point.py b/rebench/model/data_point.py index 58775ff8..65b9834a 100644 --- a/rebench/model/data_point.py +++ b/rebench/model/data_point.py @@ -53,7 +53,22 @@ def add_measurement(self, measurement): "'total' measurement.") self._total = measurement + def _get_measurements_reordered(self): + # re-order so that total is last. + out = [m for m in self._measurements if not m.is_total()] + def _find_total(measurements): + for measurement in measurements: + if measurement.is_total(): + return measurement # Highlander + return None + total = _find_total(self._measurements) + if total is not None: + out.append(total) + return out + def get_measurements(self): + if self._measurements and not self._measurements[-1].is_total(): + return self._get_measurements_reordered() return self._measurements def get_total_value(self): diff --git a/rebench/tests/features/issue_31_multivariate_data_points_test.py b/rebench/tests/features/issue_31_multivariate_data_points_test.py index 72e94202..4e1f1923 100644 --- a/rebench/tests/features/issue_31_multivariate_data_points_test.py +++ b/rebench/tests/features/issue_31_multivariate_data_points_test.py @@ -65,8 +65,8 @@ def test_associates_measurements_and_data_points_correctly(self): for point, i in zip(data_points, list(range(0, 10))): self.assertEqual(4, point.number_of_measurements()) - for criterion, unit, measurement in zip(["bar", "total", "baz", "foo"], - ["ms", "ms", "kbyte", "kerf"], + for criterion, unit, measurement in zip(["bar", "baz", "foo", "total"], + ["ms", "kbyte", "kerf", "ms"], point.get_measurements()): self.assertEqual(criterion, measurement.criterion) self.assertEqual(i, int(measurement.value)) @@ -81,3 +81,11 @@ def test_is_compatible_to_issue16_format(self): point.get_measurements()): self.assertEqual(criterion, measurement.criterion) self.assertEqual(i, int(measurement.value)) + + def test_measurement_ordering(self): + # certain parts of persistency require measurements to be ordered total-last. + # see _DataPointPersistence._process_lines + data_points = self._records_data_points('Test1', 10) + for point in data_points: + measurements = point.get_measurements() + self.assertTrue(measurements[-1].is_total()) \ No newline at end of file