| Index: components/history/core/browser/visitsegment_database.cc
|
| diff --git a/components/history/core/browser/visitsegment_database.cc b/components/history/core/browser/visitsegment_database.cc
|
| index f960b2e2c27105203746818664645bae62e9a19f..0e8244e33b0454ec5c4fefb231fb4a8d56a6bd7b 100644
|
| --- a/components/history/core/browser/visitsegment_database.cc
|
| +++ b/components/history/core/browser/visitsegment_database.cc
|
| @@ -12,6 +12,7 @@
|
| #include <string>
|
| #include <vector>
|
|
|
| +#include "base/callback.h"
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| #include "base/memory/ptr_util.h"
|
| @@ -201,8 +202,10 @@ bool VisitSegmentDatabase::IncreaseSegmentVisitCount(SegmentID segment_id,
|
| }
|
|
|
| std::vector<std::unique_ptr<PageUsageData>>
|
| -VisitSegmentDatabase::QuerySegmentUsage(base::Time from_time,
|
| - int max_result_count) {
|
| +VisitSegmentDatabase::QuerySegmentUsage(
|
| + base::Time from_time,
|
| + int max_result_count,
|
| + const base::Callback<bool(const GURL&)>& url_filter) {
|
| // This function gathers the highest-ranked segments in two queries.
|
| // The first gathers scores for all segments.
|
| // The second gathers segment data (url, title, etc.) for the highest-ranked
|
| @@ -219,13 +222,13 @@ VisitSegmentDatabase::QuerySegmentUsage(base::Time from_time,
|
| base::Time ts = from_time.LocalMidnight();
|
| statement.BindInt64(0, ts.ToInternalValue());
|
|
|
| - std::vector<std::unique_ptr<PageUsageData>> results;
|
| + std::vector<std::unique_ptr<PageUsageData>> segments;
|
| base::Time now = base::Time::Now();
|
| SegmentID previous_segment_id = 0;
|
| while (statement.Step()) {
|
| SegmentID segment_id = statement.ColumnInt64(0);
|
| if (segment_id != previous_segment_id) {
|
| - results.push_back(base::WrapUnique(new PageUsageData(segment_id)));
|
| + segments.push_back(base::WrapUnique(new PageUsageData(segment_id)));
|
| previous_segment_id = segment_id;
|
| }
|
|
|
| @@ -243,18 +246,15 @@ VisitSegmentDatabase::QuerySegmentUsage(base::Time from_time,
|
| // at the limit of how far we reach into the past.
|
| float recency_boost = 1.0f + (2.0f * (1.0f / (1.0f + days_ago/7.0f)));
|
| float score = recency_boost * day_visits_score;
|
| - results.back()->SetScore(results.back()->GetScore() + score);
|
| + segments.back()->SetScore(segments.back()->GetScore() + score);
|
| }
|
|
|
| - // Limit to the top |max_result_count| results.
|
| - std::sort(results.begin(), results.end(),
|
| + // Order by descending scores.
|
| + std::sort(segments.begin(), segments.end(),
|
| [](const std::unique_ptr<PageUsageData>& lhs,
|
| const std::unique_ptr<PageUsageData>& rhs) {
|
| return lhs->GetScore() > rhs->GetScore();
|
| });
|
| - DCHECK_GE(max_result_count, 0);
|
| - if (results.size() > static_cast<size_t>(max_result_count))
|
| - results.resize(max_result_count);
|
|
|
| // Now fetch the details about the entries we care about.
|
| sql::Statement statement2(GetDB().GetCachedStatement(SQL_FROM_HERE,
|
| @@ -265,11 +265,19 @@ VisitSegmentDatabase::QuerySegmentUsage(base::Time from_time,
|
| if (!statement2.is_valid())
|
| return std::vector<std::unique_ptr<PageUsageData>>();
|
|
|
| - for (std::unique_ptr<PageUsageData>& pud : results) {
|
| + std::vector<std::unique_ptr<PageUsageData>> results;
|
| + DCHECK_GE(max_result_count, 0);
|
| + for (std::unique_ptr<PageUsageData>& pud : segments) {
|
| statement2.BindInt64(0, pud->GetID());
|
| if (statement2.Step()) {
|
| - pud->SetURL(GURL(statement2.ColumnString(0)));
|
| - pud->SetTitle(statement2.ColumnString16(1));
|
| + GURL url(statement2.ColumnString(0));
|
| + if (url_filter.is_null() || url_filter.Run(url)) {
|
| + pud->SetURL(url);
|
| + pud->SetTitle(statement2.ColumnString16(1));
|
| + results.push_back(std::move(pud));
|
| + if (results.size() >= static_cast<size_t>(max_result_count))
|
| + break;
|
| + }
|
| }
|
| statement2.Reset(true);
|
| }
|
|
|