blob: 062df56fb353492ab58d25f5a121b77296c94ce2 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/local_aggregation/aggregation_utils.h"
#include <optional>
#include "src/lib/util/status_builder.h"
#include "src/logging.h"
namespace cobalt::local_aggregation {
OnDeviceAggregationWindow MakeDayWindow(int num_days) {
OnDeviceAggregationWindow window;
window.set_days(static_cast<AggregationDays>(num_days));
return window;
}
OnDeviceAggregationWindow MakeHourWindow(int num_hours) {
OnDeviceAggregationWindow window;
window.set_hours(static_cast<AggregationHours>(num_hours));
return window;
}
std::tuple<Status, int64_t> GetUpdatedAggregate(
ReportDefinition::OnDeviceAggregationType aggregation_type,
std::optional<int64_t> stored_aggregate, int64_t new_value) {
if (!stored_aggregate.has_value()) {
return std::make_tuple(Status::OK, new_value);
}
switch (aggregation_type) {
case ReportDefinition::SUM:
return std::make_tuple(Status::OK, new_value + stored_aggregate.value());
case ReportDefinition::MAX:
return std::make_tuple(Status::OK, std::max(new_value, stored_aggregate.value()));
case ReportDefinition::MIN:
return std::make_tuple(Status::OK, std::min(new_value, stored_aggregate.value()));
default:
return std::make_tuple(
util::StatusBuilder(StatusCode::INVALID_ARGUMENT, "Unexpected aggregation type")
.WithContexts(aggregation_type)
.LogError()
.Build(),
0);
}
}
} // namespace cobalt::local_aggregation