Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1708)

Unified Diff: chrome/browser/autocomplete/search_provider.cc

Issue 470313004: [AiS] Use top local result for prefetch. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use top suggestion to retrieve answer. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/autocomplete/search_provider.cc
diff --git a/chrome/browser/autocomplete/search_provider.cc b/chrome/browser/autocomplete/search_provider.cc
index c2064838797c5c59c9e1d11b0a7a95885a3fc23d..f26c4a1c434b51808b58817b50072f350f4f2b77 100644
--- a/chrome/browser/autocomplete/search_provider.cc
+++ b/chrome/browser/autocomplete/search_provider.cc
@@ -246,7 +246,17 @@ void SearchProvider::Start(const AutocompleteInput& input,
input_ = input;
DoHistoryQuery(minimal_changes);
- DoAnswersQuery(input);
+ // Answers needs the scored history results before any suggest query has been
Mark P 2014/09/05 22:18:16 nit: omit "the"
groby-ooo-7-16 2014/09/10 23:21:32 Done.
+ // started.
Mark P 2014/09/05 22:18:15 Please explain why, either here or elsewhere if th
groby-ooo-7-16 2014/09/10 23:21:37 Done.
+ if (OmniboxFieldTrial::EnableAnswersInSuggest()) {
groby-ooo-7-16 2014/08/28 21:36:08 We could _always_ do the scoring after DoHistoryQu
Mark P 2014/09/05 22:18:16 I like your approach in this changelist.
groby-ooo-7-16 2014/09/10 23:21:32 Acknowledged.
+ ScoreHistoryResultsMultiWord(
+ default_history_results_, false, &scored_default_history_results_);
+ ScoreHistoryResultsMultiWord(
+ keyword_history_results_, true, &scored_keyword_history_results_);
+
+ prefetch_data_ = FindAnswersPrefetchData(input.text());
+ }
Mark P 2014/09/05 22:18:15 Consider: else { clear all relevant data }
groby-ooo-7-16 2014/09/10 23:21:33 Done.
+
StartOrStopSuggestQuery(minimal_changes);
UpdateMatches();
}
@@ -881,40 +891,39 @@ void SearchProvider::AddHistoryResultsToMap(const HistoryResults& results,
return;
base::TimeTicks start_time(base::TimeTicks::Now());
- bool prevent_inline_autocomplete = input_.prevent_inline_autocomplete() ||
- (input_.type() == metrics::OmniboxInputType::URL);
- const base::string16& input_text =
- is_keyword ? keyword_input_.text() : input_.text();
- bool input_multiple_words = HasMultipleWords(input_text);
- SearchSuggestionParser::SuggestResults scored_results;
- if (!prevent_inline_autocomplete && input_multiple_words) {
- // ScoreHistoryResults() allows autocompletion of multi-word, 1-visit
- // queries if the input also has multiple words. But if we were already
- // scoring a multi-word, multi-visit query aggressively, and the current
- // input is still a prefix of it, then changing the suggestion suddenly
- // feels wrong. To detect this case, first score as if only one word has
- // been typed, then check if the best result came from aggressive search
- // history scoring. If it did, then just keep that score set. This
- // 1200 the lowest possible score in CalculateRelevanceForHistory()'s
- // aggressive-scoring curve.
- scored_results = ScoreHistoryResults(results, prevent_inline_autocomplete,
- false, input_text, is_keyword);
- if ((scored_results.front().relevance() < 1200) ||
- !HasMultipleWords(scored_results.front().suggestion()))
- scored_results.clear(); // Didn't detect the case above, score normally.
+ // Until Answers becomes default, scoring of history results will still happen
+ // here for non-Answers Chrome, to prevent any impact on timing measurements.
Mark P 2014/09/05 22:18:16 The reason for this is not "to prevent any impact
groby-ooo-7-16 2014/09/10 23:21:33 Done.
+ // Answers FieldTrials will instead use scoring results obtained previously.
Mark P 2014/09/05 22:18:16 nit: "Answers FieldTrials" is awkward. Consider r
groby-ooo-7-16 2014/09/10 23:21:38 Done.
+ SearchSuggestionParser::SuggestResults local_scored_results;
+ const SearchSuggestionParser::SuggestResults* scored_results = NULL;
+ if (!OmniboxFieldTrial::EnableAnswersInSuggest()) {
groby-ooo-7-16 2014/08/28 21:36:08 Another repost: Do we want to run unit tests both
Mark P 2014/09/05 22:18:16 It's up to you. My typical strategy when I add a
groby-ooo-7-16 2014/09/10 23:21:33 They _shouldn't_ behave differently except for Ans
+ ScoreHistoryResultsMultiWord(results, is_keyword, &local_scored_results);
+ scored_results = &local_scored_results;
+ } else {
+ // TODO(groby): Once answers is on by default, just pass in scored results.
+ scored_results = is_keyword ? &scored_keyword_history_results_
+ : &scored_default_history_results_;
}
- if (scored_results.empty())
- scored_results = ScoreHistoryResults(results, prevent_inline_autocomplete,
- input_multiple_words, input_text,
- is_keyword);
+ DCHECK(scored_results);
+ AddScoredHistoryResultsToMap(*scored_results, did_not_accept_suggestion, map);
+ UMA_HISTOGRAM_TIMES("Omnibox.SearchProvider.AddHistoryResultsTime",
+ base::TimeTicks::Now() - start_time);
+}
+
+// TODO(groby): Can this be merged with AddSuggestResultsToMap?
groby-ooo-7-16 2014/08/28 21:36:08 I don't think it can because AddSuggestResults bec
Mark P 2014/09/05 22:18:15 You're reading this wrong. It sets |mark_as_delet
groby-ooo-7-16 2014/09/10 23:21:37 Skipping the merging, then.
+void SearchProvider::AddScoredHistoryResultsToMap(
+ const SearchSuggestionParser::SuggestResults& results,
+ int did_not_accept_suggestion,
+ MatchMap* map) {
+ if (results.empty())
Mark P 2014/09/05 22:18:16 I'm not sure the results.empty() short-circuit is
groby-ooo-7-16 2014/09/10 23:21:37 Done.
+ return;
+
for (SearchSuggestionParser::SuggestResults::const_iterator i(
- scored_results.begin()); i != scored_results.end(); ++i) {
+ results.begin()); i != results.end(); ++i) {
AddMatchToMap(*i, std::string(), did_not_accept_suggestion, true,
providers_.GetKeywordProviderURL() != NULL, map);
}
- UMA_HISTOGRAM_TIMES("Omnibox.SearchProvider.AddHistoryResultsTime",
- base::TimeTicks::Now() - start_time);
}
SearchSuggestionParser::SuggestResults SearchProvider::ScoreHistoryResults(
@@ -1029,6 +1038,42 @@ SearchSuggestionParser::SuggestResults SearchProvider::ScoreHistoryResults(
return scored_results;
}
+void SearchProvider::ScoreHistoryResultsMultiWord(
+ const HistoryResults& results,
+ bool is_keyword,
+ SearchSuggestionParser::SuggestResults* scored_results) {
+ if (results.empty())
Mark P 2014/09/05 22:18:16 Shouldn't we clear scored_results in this case?
groby-ooo-7-16 2014/09/10 23:21:33 Done.
+ return;
+
+ bool prevent_inline_autocomplete =
+ input_.prevent_inline_autocomplete() ||
Mark P 2014/09/05 22:18:16 nit: can't this go on the previous line?
groby-ooo-7-16 2014/09/10 23:21:37 It can. I blame git cl format.
+ (input_.type() == metrics::OmniboxInputType::URL);
+ const base::string16& input_text =
+ is_keyword ? keyword_input_.text() : input_.text();
Mark P 2014/09/05 22:18:15 Consider GetInput(is_keyword).text()
groby-ooo-7-16 2014/09/10 23:21:38 Done.
+ bool input_multiple_words = HasMultipleWords(input_text);
+
+ if (!prevent_inline_autocomplete && input_multiple_words) {
+ // ScoreHistoryResults() allows autocompletion of multi-word, 1-visit
+ // queries if the input also has multiple words. But if we were already
+ // scoring a multi-word, multi-visit query aggressively, and the current
+ // input is still a prefix of it, then changing the suggestion suddenly
+ // feels wrong. To detect this case, first score as if only one word has
+ // been typed, then check if the best result came from aggressive search
+ // history scoring. If it did, then just keep that score set. This
+ // 1200 the lowest possible score in CalculateRelevanceForHistory()'s
+ // aggressive-scoring curve.
+ *scored_results = ScoreHistoryResults(
+ results, prevent_inline_autocomplete, false, input_text, is_keyword);
+ if ((scored_results->front().relevance() < 1200) ||
+ !HasMultipleWords(scored_results->front().suggestion()))
+ scored_results->clear(); // Didn't detect the case above, score normally.
+ }
+ if (scored_results->empty())
Mark P 2014/09/05 22:18:15 nit: { }
groby-ooo-7-16 2014/09/10 23:21:33 Done.
+ *scored_results = ScoreHistoryResults(results, prevent_inline_autocomplete,
+ input_multiple_words, input_text,
+ is_keyword);
+}
+
void SearchProvider::AddSuggestResultsToMap(
const SearchSuggestionParser::SuggestResults& results,
const std::string& metadata,
@@ -1267,6 +1312,27 @@ void SearchProvider::RegisterDisplayedAnswers(
answers_cache_.UpdateRecentAnswers(match->fill_into_edit, match->answer_type);
}
-void SearchProvider::DoAnswersQuery(const AutocompleteInput& input) {
- prefetch_data_ = answers_cache_.GetTopAnswerEntry(input.text());
+AnswersQueryData SearchProvider::FindAnswersPrefetchData(
+ const base::string16& input) {
+ // Retrieve the top entry from scored history results.
+
+ // TODO(groby): This seems a bit of a waste. Figure out if we can either
+ // re-use a partially populated map, or if we should just scan through the
+ // results, duplicates be damned.
groby-ooo-7-16 2014/08/28 21:36:08 Re-use of the partial map extends the state the Se
Mark P 2014/09/05 22:18:16 I'm not sure I follow your proposal here. Note th
groby-ooo-7-16 2014/09/10 23:21:35 We're building the MatchMap twice - once here, onc
Mark P 2014/09/16 22:24:55 Acknowledged.
+ MatchMap map;
+ // TODO(groby): Can I just default to marking suggestions as "not accepted"?
+ // This seems to only matter for AQS....
groby-ooo-7-16 2014/08/28 21:36:08 See question above. If I share state, I'll obviou
groby-ooo-7-16 2014/08/28 21:36:08 See question above. This might also be relevant
Mark P 2014/09/05 22:18:15 No. In fact, the value of did_not_accept_suggesti
Mark P 2014/09/05 22:18:16 ditto: I'm not sure I follow your proposal here.
groby-ooo-7-16 2014/09/10 23:21:33 Shorter: Does it matter that AddTransformed...() i
groby-ooo-7-16 2014/09/10 23:21:33 Acknowledged.
+ AddScoredHistoryResultsToMap(scored_keyword_history_results_, false, &map);
Mark P 2014/09/05 22:18:16 Please do not pass false for an int without an exp
groby-ooo-7-16 2014/09/10 23:21:33 It is indeed - thanks for catching this. I read th
+ AddScoredHistoryResultsToMap(scored_default_history_results_, false, &map);
+
+ ACMatches matches;
+ for (MatchMap::const_iterator i(map.begin()); i != map.end(); ++i)
+ matches.push_back(i->second);
+ std::sort(matches.begin(), matches.end(), &AutocompleteMatch::MoreRelevant);
+
+ // If there is a top scoring entry, find the corresponding answer.
+ if (!matches.empty())
+ return answers_cache_.GetTopAnswerEntry(matches[0].contents);
+
+ return AnswersQueryData();
}

Powered by Google App Engine
This is Rietveld 408576698