on_device_clustering_backend.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef COMPONENTS_HISTORY_CLUSTERS_CORE_ON_DEVICE_CLUSTERING_BACKEND_H_
  5. #define COMPONENTS_HISTORY_CLUSTERS_CORE_ON_DEVICE_CLUSTERING_BACKEND_H_
  6. #include "base/containers/flat_map.h"
  7. #include "base/containers/flat_set.h"
  8. #include "base/containers/lru_cache.h"
  9. #include "base/containers/unique_ptr_adapters.h"
  10. #include "base/memory/scoped_refptr.h"
  11. #include "base/memory/weak_ptr.h"
  12. #include "base/sequence_checker.h"
  13. #include "base/task/sequenced_task_runner.h"
  14. #include "base/task/task_traits.h"
  15. #include "base/time/time.h"
  16. #include "components/history_clusters/core/cluster_finalizer.h"
  17. #include "components/history_clusters/core/cluster_processor.h"
  18. #include "components/history_clusters/core/clusterer.h"
  19. #include "components/history_clusters/core/clustering_backend.h"
  20. namespace optimization_guide {
  21. class BatchEntityMetadataTask;
  22. struct EntityMetadata;
  23. class EntityMetadataProvider;
  24. class NewOptimizationGuideDecider;
  25. } // namespace optimization_guide
  26. namespace site_engagement {
  27. class SiteEngagementScoreProvider;
  28. } // namespace site_engagement
  29. namespace history_clusters {
  30. // A clustering backend that clusters visits on device.
  31. class OnDeviceClusteringBackend : public ClusteringBackend {
  32. public:
  33. OnDeviceClusteringBackend(
  34. optimization_guide::EntityMetadataProvider* entity_metadata_provider,
  35. site_engagement::SiteEngagementScoreProvider* engagement_score_provider,
  36. optimization_guide::NewOptimizationGuideDecider*
  37. optimization_guide_decider,
  38. base::flat_set<std::string> mid_blocklist);
  39. ~OnDeviceClusteringBackend() override;
  40. // ClusteringBackend:
  41. void GetClusters(ClusteringRequestSource clustering_request_source,
  42. ClustersCallback callback,
  43. std::vector<history::AnnotatedVisit> visits) override;
  44. private:
  45. // Callback invoked when batch entity metadata has been received from
  46. // |completed_task|. This will normalize |annotated_visits| and proceed to
  47. // cluster them after normalization.
  48. void OnBatchEntityMetadataRetrieved(
  49. ClusteringRequestSource clustering_request_source,
  50. optimization_guide::BatchEntityMetadataTask* completed_task,
  51. std::vector<history::AnnotatedVisit> annotated_visits,
  52. absl::optional<base::TimeTicks> entity_metadata_start,
  53. ClustersCallback callback,
  54. const base::flat_map<std::string, optimization_guide::EntityMetadata>&
  55. entity_metadata_map);
  56. // ProcessVisits adds additional metadata that might be used for clustering or
  57. // Journeys to each visit in |annotated_visits|, such as human-readable
  58. // entities and categories, site engagement, etc.
  59. void ProcessVisits(
  60. ClusteringRequestSource clustering_request_source,
  61. optimization_guide::BatchEntityMetadataTask* completed_task,
  62. std::vector<history::AnnotatedVisit> annotated_visits,
  63. absl::optional<base::TimeTicks> entity_metadata_start,
  64. ClustersCallback callback,
  65. const base::flat_map<std::string, optimization_guide::EntityMetadata>&
  66. entity_metadata_map);
  67. // Called when all visits have been processed.
  68. void OnAllVisitsFinishedProcessing(
  69. ClusteringRequestSource clustering_request_source,
  70. optimization_guide::BatchEntityMetadataTask* completed_task,
  71. std::vector<history::ClusterVisit> cluster_visits,
  72. base::flat_map<std::string, optimization_guide::EntityMetadata>
  73. human_readable_entity_name_to_entity_metadata_map,
  74. ClustersCallback callback);
  75. // Clusters |visits| on background thread.
  76. static std::vector<history::Cluster> ClusterVisitsOnBackgroundThread(
  77. ClusteringRequestSource clustering_request_source,
  78. bool engagement_score_provider_is_valid,
  79. std::vector<history::ClusterVisit> visits,
  80. base::flat_map<std::string, optimization_guide::EntityMetadata>
  81. human_readable_entity_name_to_entity_metadata_map);
  82. // The object to fetch entity metadata from. Not owned. Must outlive |this|.
  83. optimization_guide::EntityMetadataProvider* entity_metadata_provider_ =
  84. nullptr;
  85. // The object to get engagement scores from. Not owned. Must outlive |this|.
  86. site_engagement::SiteEngagementScoreProvider* engagement_score_provider_ =
  87. nullptr;
  88. // The object to fetch page load metadata from. Not owned. Must outlive
  89. // |this|.
  90. optimization_guide::NewOptimizationGuideDecider* optimization_guide_decider_ =
  91. nullptr;
  92. // The set of batch entity metadata tasks currently in flight.
  93. base::flat_set<std::unique_ptr<optimization_guide::BatchEntityMetadataTask>,
  94. base::UniquePtrComparator>
  95. in_flight_batch_entity_metadata_tasks_;
  96. // The task runners to run clustering passes on.
  97. // |user_visible_priority_background_task_runner_| should be used iff
  98. // clustering is blocking content on a page that user is actively looking at.
  99. const base::TaskTraits user_visible_task_traits_;
  100. const base::TaskTraits continue_on_shutdown_user_visible_task_traits_;
  101. scoped_refptr<base::SequencedTaskRunner>
  102. user_visible_priority_background_task_runner_;
  103. const base::TaskTraits best_effort_task_traits_;
  104. const base::TaskTraits continue_on_shutdown_best_effort_task_traits_;
  105. scoped_refptr<base::SequencedTaskRunner>
  106. best_effort_priority_background_task_runner_;
  107. // Last time |engagement_score_cache_| was refreshed.
  108. base::TimeTicks engagement_score_cache_last_refresh_timestamp_;
  109. // URL host to score mapping.
  110. base::HashingLRUCache<std::string, float> engagement_score_cache_;
  111. // The set of mid strings that should be blocked from included in the backend
  112. // for both clustering and keywords.
  113. base::flat_set<std::string> mid_blocklist_;
  114. SEQUENCE_CHECKER(sequence_checker_);
  115. base::WeakPtrFactory<OnDeviceClusteringBackend> weak_ptr_factory_{this};
  116. };
  117. } // namespace history_clusters
  118. #endif // COMPONENTS_HISTORY_CLUSTERS_CORE_ON_DEVICE_CLUSTERING_BACKEND_H_