| Index: tools/telemetry/telemetry/value/list_of_scalar_values.py
|
| diff --git a/tools/telemetry/telemetry/value/list_of_scalar_values.py b/tools/telemetry/telemetry/value/list_of_scalar_values.py
|
| index 1886625b4538f653dba0e930531c243f69e7fcee..698957ad571e6a73aaf48d0b20572788af9af4f6 100644
|
| --- a/tools/telemetry/telemetry/value/list_of_scalar_values.py
|
| +++ b/tools/telemetry/telemetry/value/list_of_scalar_values.py
|
| @@ -5,22 +5,26 @@
|
| import numbers
|
|
|
| from telemetry import value as value_module
|
| +from telemetry.value import none_values
|
|
|
|
|
| def _Mean(values):
|
| return float(sum(values)) / len(values) if len(values) > 0 else 0.0
|
|
|
| +
|
| class ListOfScalarValues(value_module.Value):
|
| def __init__(self, page, name, units, values,
|
| - important=True, description=None,
|
| + important=True, description=None, none_value_reason=None,
|
| same_page_merge_policy=value_module.CONCATENATE):
|
| super(ListOfScalarValues, self).__init__(page, name, units, important,
|
| description)
|
| - assert len(values) > 0
|
| - assert isinstance(values, list)
|
| - for v in values:
|
| - assert isinstance(v, numbers.Number)
|
| + if values is not None:
|
| + assert isinstance(values, list)
|
| + assert len(values) > 0
|
| + assert all(isinstance(v, numbers.Number) for v in values)
|
| + none_values.ValidateNoneValueReason(values, none_value_reason)
|
| self.values = values
|
| + self.none_value_reason = none_value_reason
|
| self.same_page_merge_policy = same_page_merge_policy
|
|
|
| def __repr__(self):
|
| @@ -67,6 +71,10 @@ class ListOfScalarValues(value_module.Value):
|
| def AsDict(self):
|
| d = super(ListOfScalarValues, self).AsDict()
|
| d['values'] = self.values
|
| +
|
| + if self.none_value_reason is not None:
|
| + d['none_value_reason'] = self.none_value_reason
|
| +
|
| return d
|
|
|
| @staticmethod
|
| @@ -74,6 +82,9 @@ class ListOfScalarValues(value_module.Value):
|
| kwargs = value_module.Value.GetConstructorKwArgs(value_dict, page_dict)
|
| kwargs['values'] = value_dict['values']
|
|
|
| + if 'none_value_reason' in value_dict:
|
| + kwargs['none_value_reason'] = value_dict['none_value_reason']
|
| +
|
| return ListOfScalarValues(**kwargs)
|
|
|
| @classmethod
|
| @@ -86,32 +97,34 @@ class ListOfScalarValues(value_module.Value):
|
| v0.page, v0.name, v0.units,
|
| values[0].values,
|
| important=v0.important,
|
| - same_page_merge_policy=v0.same_page_merge_policy)
|
| + same_page_merge_policy=v0.same_page_merge_policy,
|
| + none_value_reason=v0.none_value_reason)
|
|
|
| assert v0.same_page_merge_policy == value_module.CONCATENATE
|
| - all_values = []
|
| - for v in values:
|
| - all_values.extend(v.values)
|
| - return ListOfScalarValues(
|
| - v0.page, v0.name, v0.units,
|
| - all_values,
|
| - important=v0.important,
|
| - same_page_merge_policy=v0.same_page_merge_policy)
|
| + return cls._MergeLikeValues(values, v0.page, v0.name)
|
|
|
| @classmethod
|
| def MergeLikeValuesFromDifferentPages(cls, values,
|
| group_by_name_suffix=False):
|
| assert len(values) > 0
|
| v0 = values[0]
|
| - all_values = []
|
| + name = v0.name_suffix if group_by_name_suffix else v0.name
|
| + return cls._MergeLikeValues(values, None, name)
|
| +
|
| + @classmethod
|
| + def _MergeLikeValues(cls, values, page, name):
|
| + v0 = values[0]
|
| + merged_values = []
|
| + none_value_reason = None
|
| for v in values:
|
| - all_values.extend(v.values)
|
| - if not group_by_name_suffix:
|
| - name = v0.name
|
| - else:
|
| - name = v0.name_suffix
|
| + if v.values is None:
|
| + merged_values = None
|
| + none_value_reason = none_values.MERGE_FAILURE_REASON
|
| + break
|
| + merged_values.extend(v.values)
|
| return ListOfScalarValues(
|
| - None, name, v0.units,
|
| - all_values,
|
| + page, name, v0.units,
|
| + merged_values,
|
| important=v0.important,
|
| - same_page_merge_policy=v0.same_page_merge_policy)
|
| + same_page_merge_policy=v0.same_page_merge_policy,
|
| + none_value_reason=none_value_reason)
|
|
|