Chromium Code Reviews| Index: chrome/browser/autocomplete/history_contents_provider.cc |
| diff --git a/chrome/browser/autocomplete/history_contents_provider.cc b/chrome/browser/autocomplete/history_contents_provider.cc |
| index 61749a2841155cb1e5615ab0b1762d8d4bdb6df4..ab779fd380927f9936b71afb360e7d8a76d7b4f9 100644 |
| --- a/chrome/browser/autocomplete/history_contents_provider.cc |
| +++ b/chrome/browser/autocomplete/history_contents_provider.cc |
| @@ -24,19 +24,27 @@ namespace { |
| // time it will take. |
| const int kDaysToSearch = 30; |
| +} // end namespace |
| + |
| // When processing the results from the history query, this structure points to |
| // a single result. It allows the results to be sorted and processed without |
| // modifying the larger and slower results structure. |
| struct MatchReference { |
| - MatchReference(const history::URLResult* result, int relevance) |
| + MatchReference(const history::URLResult* result, |
| + int relevance, |
| + float confidence) |
| : result(result), |
| - relevance(relevance) { |
| + relevance(relevance), |
| + confidence(confidence) { |
| } |
| const history::URLResult* result; |
| int relevance; // Score of relevance computed by CalculateRelevance. |
| + float confidence; // Confidence computed by CalculateConfidence. |
| }; |
| +namespace { |
|
Peter Kasting
2011/08/09 20:53:00
Nit: Don't split the anonymous namespace into two
dominich
2011/08/09 21:43:43
Done.
|
| + |
| // This is a > operator for MatchReference. |
| bool CompareMatchRelevance(const MatchReference& a, const MatchReference& b) { |
| if (a.relevance != b.relevance) |
| @@ -46,7 +54,7 @@ bool CompareMatchRelevance(const MatchReference& a, const MatchReference& b) { |
| return a.result->last_visit() > b.result->last_visit(); |
| } |
| -} // namespace |
| +} // end namespace |
| using history::HistoryDatabase; |
| @@ -187,7 +195,8 @@ void HistoryContentsProvider::ConvertResults() { |
| for (std::vector<history::URLResult*>::const_reverse_iterator i = |
| results_.rbegin(); i != results_.rend(); ++i) { |
| history::URLResult* result = *i; |
| - MatchReference ref(result, CalculateRelevance(*result)); |
| + MatchReference ref(result, CalculateRelevance(*result), |
| + CalculateConfidence(*result, results_)); |
| result_refs.push_back(ref); |
| } |
| @@ -197,8 +206,10 @@ void HistoryContentsProvider::ConvertResults() { |
| result_refs.end(), &CompareMatchRelevance); |
| matches_.clear(); |
| for (size_t i = 0; i < max_for_provider; i++) { |
| - matches_.push_back(ResultToMatch(*result_refs[i].result, |
| - result_refs[i].relevance)); |
| + AutocompleteMatch match = ResultToMatch(result_refs[i]); |
|
Peter Kasting
2011/08/09 20:53:00
Nit: I prefer constructor form to assignment form
dominich
2011/08/09 21:43:43
Done.
|
| + UMA_HISTOGRAM_COUNTS_100("Autocomplete.Confidence_HistoryContents", |
| + match.confidence * 100); |
| + matches_.push_back(match); |
| } |
| } |
| @@ -208,10 +219,13 @@ bool HistoryContentsProvider::MatchInTitle(const history::URLResult& result) { |
| } |
| AutocompleteMatch HistoryContentsProvider::ResultToMatch( |
| - const history::URLResult& result, |
| - int score) { |
| - AutocompleteMatch match(this, score, true, MatchInTitle(result) ? |
| - AutocompleteMatch::HISTORY_TITLE : AutocompleteMatch::HISTORY_BODY); |
| + const MatchReference& match_reference) { |
| + const history::URLResult& result = *match_reference.result; |
| + AutocompleteMatch match(this, match_reference.relevance, |
|
Peter Kasting
2011/08/09 20:53:00
Nit: This wrapping would be OK:
AutocompleteMat
dominich
2011/08/09 21:43:43
Done.
|
| + match_reference.confidence, true, |
| + MatchInTitle(result) ? |
| + AutocompleteMatch::HISTORY_TITLE : |
| + AutocompleteMatch::HISTORY_BODY); |
| match.contents = StringForURLDisplay(result.url(), true, trim_http_); |
| match.fill_into_edit = |
| AutocompleteInput::FormattedStringWithEquivalentMeaning(result.url(), |
| @@ -263,6 +277,30 @@ int HistoryContentsProvider::CalculateRelevance( |
| (1000 + star_title_count_++) : (550 + star_contents_count_++); |
| } |
| +float HistoryContentsProvider::CalculateConfidence( |
| + const history::URLResult& result, |
| + const history::QueryResults& results) const { |
| + // Calculate a score of [0, 0.5] based on visit count. |
| + // TODO(dominic): Include typed count? |
|
Peter Kasting
2011/08/09 20:53:00
If you're only going to use one, prefer typed_coun
dominich
2011/08/09 21:43:43
Done.
|
| + float numerator = result.visit_count(); |
| + float denominator = 0.0f; |
| + for (std::vector<history::URLResult*>::const_iterator it = results.begin(); |
| + it != results.end(); ++it) { |
| + denominator += (*it)->visit_count(); |
| + } |
| + // It should only be equal to 0 if the result is not in the results vector. |
| + DCHECK(denominator > 0); |
| + float score = 0.5f * (numerator / denominator); |
| + |
| + // Add 0.5 if the URL is bookmarked to get a final range of [0, 1]. |
|
Peter Kasting
2011/08/09 20:53:00
I think this gives far too much weight to bookmark
dominich
2011/08/09 21:43:43
Done.
|
| + if (profile_->GetBookmarkModel() && |
| + profile_->GetBookmarkModel()->IsBookmarked(result.url())) { |
| + score += 0.5f; |
| + } |
| + |
| + return score; |
| +} |
| + |
| void HistoryContentsProvider::QueryBookmarks(const AutocompleteInput& input) { |
| BookmarkModel* bookmark_model = profile_->GetBookmarkModel(); |
| if (!bookmark_model) |