blob: 30ba08f9ee0f5b2e54ffefd5e9c82a32b6924a0e [file] [log] [blame]
// Copyright 2020 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_1_1/aggregation_procedures/select_first_aggregation_procedure.h"
#include "src/lib/statusor/status_macros.h"
#include "src/logger/encoder.h"
#include "src/pb/observation.pb.h"
namespace cobalt::local_aggregation {
SelectFirstAggregationProcedure::SelectFirstAggregationProcedure(const MetricDefinition &metric,
const ReportDefinition &report)
: AggregationProcedure(metric, report) {
// Record only the first event vector that is logged for each aggregation period.
SetEventVectorBufferMax(1);
}
void SelectFirstAggregationProcedure::UpdateAggregateData(
const logger::EventRecord & /*event_record*/, AggregateData *aggregate_data,
EventCodeAggregate * /*aggregate*/) {
aggregate_data->set_at_least_once(true);
}
std::string SelectFirstAggregationProcedure::DebugString() const { return "SELECT_FIRST"; }
lib::statusor::StatusOr<std::unique_ptr<Observation>>
SelectFirstAggregationProcedure::GenerateSingleObservation(
const std::vector<EventCodeAggregate *> & /*aggregates*/,
const std::set<std::vector<uint32_t>> &event_vectors) {
std::vector<std::tuple<std::vector<uint32_t>, int64_t>> data;
data.reserve(event_vectors.size());
for (const auto &event_vector : event_vectors) {
data.emplace_back(std::make_tuple(event_vector, 1));
}
if (data.empty()) {
return {nullptr};
}
return logger::Encoder::EncodeIntegerObservation(data);
}
} // namespace cobalt::local_aggregation