summaryrefslogtreecommitdiff
path: root/chromium/components/segmentation_platform/internal/database/signal_storage_config.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/segmentation_platform/internal/database/signal_storage_config.cc')
-rw-r--r--chromium/components/segmentation_platform/internal/database/signal_storage_config.cc135
1 files changed, 105 insertions, 30 deletions
diff --git a/chromium/components/segmentation_platform/internal/database/signal_storage_config.cc b/chromium/components/segmentation_platform/internal/database/signal_storage_config.cc
index a3c5efaf2a1..e35d2bbd5bd 100644
--- a/chromium/components/segmentation_platform/internal/database/signal_storage_config.cc
+++ b/chromium/components/segmentation_platform/internal/database/signal_storage_config.cc
@@ -6,7 +6,7 @@
#include "base/callback_helpers.h"
#include "base/containers/contains.h"
-#include "components/segmentation_platform/internal/database/metadata_utils.h"
+#include "components/segmentation_platform/internal/metadata/metadata_utils.h"
namespace segmentation_platform {
namespace {
@@ -63,11 +63,13 @@ void SignalStorageConfig::OnDataLoaded(
proto::SignalStorageConfig* SignalStorageConfig::FindSignal(
uint64_t signal_hash,
+ uint64_t event_hash,
proto::SignalType signal_type) {
// TODO(shaktisahu): May be have an internal map of signals.
for (int i = 0; i < config_.signals().size(); ++i) {
auto* signal_config = config_.mutable_signals(i);
if (signal_config->name_hash() == signal_hash &&
+ signal_config->event_hash() == event_hash &&
signal_config->signal_type() == signal_type) {
return signal_config;
}
@@ -75,16 +77,61 @@ proto::SignalStorageConfig* SignalStorageConfig::FindSignal(
return nullptr;
}
+bool SignalStorageConfig::UpdateConfigForSignal(int signal_storage_length,
+ uint64_t signal_hash,
+ uint64_t event_hash,
+ proto::SignalType signal_type) {
+ proto::SignalStorageConfig* config =
+ FindSignal(signal_hash, event_hash, signal_type);
+ if (config) {
+ if (config->storage_length_s() < signal_storage_length) {
+ // We found a model that has a longer storage length requirement. Update
+ // it to DB.
+ config->set_storage_length_s(signal_storage_length);
+ return true;
+ }
+ } else {
+ // This is the first time we have encountered this signal. Just create an
+ // entry in the DB, and set collection start time.
+ proto::SignalStorageConfig* signal_config = config_.add_signals();
+ signal_config->set_name_hash(signal_hash);
+ if (signal_type == proto::SignalType::UKM_EVENT)
+ signal_config->set_event_hash(event_hash);
+ signal_config->set_signal_type(signal_type);
+ signal_config->set_storage_length_s(signal_storage_length);
+ signal_config->set_collection_start_time_s(
+ clock_->Now().ToDeltaSinceWindowsEpoch().InSeconds());
+ return true;
+ }
+ return false;
+}
+
+bool SignalStorageConfig::MeetsSignalCollectionRequirementForSignal(
+ base::TimeDelta min_signal_collection_length,
+ uint64_t signal_hash,
+ uint64_t event_hash,
+ proto::SignalType signal_type) {
+ const proto::SignalStorageConfig* config =
+ FindSignal(signal_hash, event_hash, signal_type);
+ if (!config || config->collection_start_time_s() == 0)
+ return false;
+
+ base::Time collection_start_time = base::Time::FromDeltaSinceWindowsEpoch(
+ base::Seconds(config->collection_start_time_s()));
+ return clock_->Now() - collection_start_time >= min_signal_collection_length;
+}
+
bool SignalStorageConfig::MeetsSignalCollectionRequirement(
- const proto::SegmentationModelMetadata& model_metadata) {
+ const proto::SegmentationModelMetadata& model_metadata,
+ bool include_outputs) {
base::TimeDelta min_signal_collection_length =
model_metadata.min_signal_collection_length() *
metadata_utils::GetTimeUnit(model_metadata);
// Loop through all the signals specified in the model, and check if they have
// been collected long enough.
- auto features = metadata_utils::GetAllUmaFeatures(model_metadata,
- /*include_outputs=*/false);
+ auto features =
+ metadata_utils::GetAllUmaFeatures(model_metadata, include_outputs);
for (auto const& feature : features) {
// Skip the signals that has bucket_count set to 0. These ones are only for
// collection purposes and hence don't get used in model evaluation.
@@ -96,15 +143,35 @@ bool SignalStorageConfig::MeetsSignalCollectionRequirement(
continue;
}
- proto::SignalStorageConfig* config =
- FindSignal(feature.name_hash(), feature.type());
- if (!config || config->collection_start_time_s() == 0)
+ if (!MeetsSignalCollectionRequirementForSignal(min_signal_collection_length,
+ feature.name_hash(), 0,
+ feature.type())) {
return false;
+ };
+ }
- base::Time collection_start_time = base::Time::FromDeltaSinceWindowsEpoch(
- base::Seconds(config->collection_start_time_s()));
- if (clock_->Now() - collection_start_time < min_signal_collection_length)
- return false;
+ // Loop through sql features.
+ for (auto const& feature : model_metadata.input_features()) {
+ if (!feature.has_sql_feature())
+ continue;
+
+ if (metadata_utils::ValidateMetadataSqlFeature(feature.sql_feature()) !=
+ metadata_utils::ValidationResult::kValidationSuccess) {
+ continue;
+ }
+
+ const proto::SignalFilterConfig& sql_config =
+ feature.sql_feature().signal_filter();
+
+ for (auto const& event : sql_config.ukm_events()) {
+ for (auto const& metric_hash : event.metric_hash_filter()) {
+ if (!MeetsSignalCollectionRequirementForSignal(
+ min_signal_collection_length, metric_hash, event.event_hash(),
+ proto::SignalType::UKM_EVENT)) {
+ return false;
+ };
+ }
+ }
}
return true;
@@ -125,26 +192,33 @@ void SignalStorageConfig::OnSignalCollectionStarted(
metadata_utils::ValidationResult::kValidationSuccess) {
continue;
}
+ if (UpdateConfigForSignal(signal_storage_length, feature.name_hash(), 0,
+ feature.type())) {
+ is_dirty = true;
+ }
+ }
- proto::SignalStorageConfig* config =
- FindSignal(feature.name_hash(), feature.type());
- if (config) {
- if (config->storage_length_s() < signal_storage_length) {
- // We found a model that has a longer storage length requirement. Update
- // it to DB.
- config->set_storage_length_s(signal_storage_length);
- is_dirty = true;
+ // Add signals for sql features.
+ for (auto const& feature : model_metadata.input_features()) {
+ if (!feature.has_sql_feature())
+ continue;
+
+ if (metadata_utils::ValidateMetadataSqlFeature(feature.sql_feature()) !=
+ metadata_utils::ValidationResult::kValidationSuccess) {
+ continue;
+ }
+
+ const proto::SignalFilterConfig& sql_config =
+ feature.sql_feature().signal_filter();
+
+ for (auto const& event : sql_config.ukm_events()) {
+ for (auto const& metric_hash : event.metric_hash_filter()) {
+ if (UpdateConfigForSignal(signal_storage_length, metric_hash,
+ event.event_hash(),
+ proto::SignalType::UKM_EVENT)) {
+ is_dirty = true;
+ }
}
- } else {
- // This is the first time we have encountered this signal. Just create an
- // entry in the DB, and set collection start time.
- proto::SignalStorageConfig* signal_config = config_.add_signals();
- signal_config->set_name_hash(feature.name_hash());
- signal_config->set_signal_type(feature.type());
- signal_config->set_storage_length_s(signal_storage_length);
- signal_config->set_collection_start_time_s(
- clock_->Now().ToDeltaSinceWindowsEpoch().InSeconds());
- is_dirty = true;
}
}
@@ -157,6 +231,7 @@ void SignalStorageConfig::GetSignalsForCleanup(
std::vector<std::tuple<uint64_t, proto::SignalType, base::Time>>& result)
const {
// Collect the signals that have longer than required data.
+ // TODO(haileywang): Handle UKM signals.
for (int i = 0; i < config_.signals_size(); ++i) {
const auto& signal_config = config_.signals(i);
base::Time collection_start_time = base::Time::FromDeltaSinceWindowsEpoch(
@@ -201,7 +276,7 @@ void SignalStorageConfig::UpdateSignalsForCleanup(
base::Time timestamp = std::get<2>(tuple);
proto::SignalStorageConfig* signal_config =
- FindSignal(name_hash, signal_type);
+ FindSignal(name_hash, 0, signal_type);
if (!signal_config)
continue;