Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/autocomplete/search_provider.h" | 5 #include "chrome/browser/autocomplete/search_provider.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "base/base64.h" | 10 #include "base/base64.h" |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 238 match.allowed_to_be_default_match = true; | 238 match.allowed_to_be_default_match = true; |
| 239 matches_.push_back(match); | 239 matches_.push_back(match); |
| 240 } | 240 } |
| 241 Stop(true); | 241 Stop(true); |
| 242 return; | 242 return; |
| 243 } | 243 } |
| 244 | 244 |
| 245 input_ = input; | 245 input_ = input; |
| 246 | 246 |
| 247 DoHistoryQuery(minimal_changes); | 247 DoHistoryQuery(minimal_changes); |
| 248 // Answers needs the scored history results before any suggest query has been | |
| 249 // started. | |
| 250 if (OmniboxFieldTrial::EnableAnswersInSuggest()) { | |
|
groby-ooo-7-16
2014/08/22 23:09:56
Do we want a UMA histogram for the time spent here
| |
| 251 scored_default_history_results_.clear(); | |
| 252 scored_keyword_history_results_.clear(); | |
| 253 ScoreHistoryResultsMultiWord( | |
| 254 default_history_results_, false, &scored_default_history_results_); | |
| 255 ScoreHistoryResultsMultiWord( | |
| 256 keyword_history_results_, true, &scored_keyword_history_results_); | |
| 257 } | |
| 248 DoAnswersQuery(input); | 258 DoAnswersQuery(input); |
| 249 StartOrStopSuggestQuery(minimal_changes); | 259 StartOrStopSuggestQuery(minimal_changes); |
| 250 UpdateMatches(); | 260 UpdateMatches(); |
| 251 } | 261 } |
| 252 | 262 |
| 253 void SearchProvider::Stop(bool clear_cached_results) { | 263 void SearchProvider::Stop(bool clear_cached_results) { |
| 254 StopSuggest(); | 264 StopSuggest(); |
| 255 done_ = true; | 265 done_ = true; |
| 256 | 266 |
| 257 if (clear_cached_results) | 267 if (clear_cached_results) |
| (...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 866 } | 876 } |
| 867 | 877 |
| 868 void SearchProvider::AddHistoryResultsToMap(const HistoryResults& results, | 878 void SearchProvider::AddHistoryResultsToMap(const HistoryResults& results, |
| 869 bool is_keyword, | 879 bool is_keyword, |
| 870 int did_not_accept_suggestion, | 880 int did_not_accept_suggestion, |
| 871 MatchMap* map) { | 881 MatchMap* map) { |
| 872 if (results.empty()) | 882 if (results.empty()) |
| 873 return; | 883 return; |
| 874 | 884 |
| 875 base::TimeTicks start_time(base::TimeTicks::Now()); | 885 base::TimeTicks start_time(base::TimeTicks::Now()); |
| 876 bool prevent_inline_autocomplete = input_.prevent_inline_autocomplete() || | |
| 877 (input_.type() == metrics::OmniboxInputType::URL); | |
| 878 const base::string16& input_text = | |
| 879 is_keyword ? keyword_input_.text() : input_.text(); | |
| 880 bool input_multiple_words = HasMultipleWords(input_text); | |
| 881 | 886 |
| 882 SearchSuggestionParser::SuggestResults scored_results; | 887 // Until Answers becomes default, scoring of history results will still happen |
| 883 if (!prevent_inline_autocomplete && input_multiple_words) { | 888 // here for non-Answers Chrome, to prevent any impact on timing measurements. |
| 884 // ScoreHistoryResults() allows autocompletion of multi-word, 1-visit | 889 // Answers FieldTrials will instead use scoring results obtained previously. |
| 885 // queries if the input also has multiple words. But if we were already | 890 SearchSuggestionParser::SuggestResults local_scored_results; |
| 886 // scoring a multi-word, multi-visit query aggressively, and the current | 891 const SearchSuggestionParser::SuggestResults* scored_results = NULL; |
| 887 // input is still a prefix of it, then changing the suggestion suddenly | 892 if (!OmniboxFieldTrial::EnableAnswersInSuggest()) { |
|
groby-ooo-7-16
2014/08/22 23:09:56
Since scoring can now take two different paths - s
| |
| 888 // feels wrong. To detect this case, first score as if only one word has | 893 ScoreHistoryResultsMultiWord(results, is_keyword, &local_scored_results); |
| 889 // been typed, then check if the best result came from aggressive search | 894 scored_results = &local_scored_results; |
| 890 // history scoring. If it did, then just keep that score set. This | 895 } else { |
| 891 // 1200 the lowest possible score in CalculateRelevanceForHistory()'s | 896 scored_results = is_keyword ? &scored_keyword_history_results_ |
| 892 // aggressive-scoring curve. | 897 : &scored_default_history_results_; |
| 893 scored_results = ScoreHistoryResults(results, prevent_inline_autocomplete, | |
| 894 false, input_text, is_keyword); | |
| 895 if ((scored_results.front().relevance() < 1200) || | |
| 896 !HasMultipleWords(scored_results.front().suggestion())) | |
| 897 scored_results.clear(); // Didn't detect the case above, score normally. | |
| 898 } | 898 } |
| 899 if (scored_results.empty()) | 899 DCHECK(scored_results); |
| 900 scored_results = ScoreHistoryResults(results, prevent_inline_autocomplete, | 900 |
| 901 input_multiple_words, input_text, | |
| 902 is_keyword); | |
| 903 for (SearchSuggestionParser::SuggestResults::const_iterator i( | 901 for (SearchSuggestionParser::SuggestResults::const_iterator i( |
| 904 scored_results.begin()); i != scored_results.end(); ++i) { | 902 scored_results->begin()); i != scored_results->end(); ++i) { |
| 905 AddMatchToMap(*i, std::string(), did_not_accept_suggestion, true, | 903 AddMatchToMap(*i, std::string(), did_not_accept_suggestion, true, |
| 906 providers_.GetKeywordProviderURL() != NULL, map); | 904 providers_.GetKeywordProviderURL() != NULL, map); |
| 907 } | 905 } |
| 908 UMA_HISTOGRAM_TIMES("Omnibox.SearchProvider.AddHistoryResultsTime", | 906 UMA_HISTOGRAM_TIMES("Omnibox.SearchProvider.AddHistoryResultsTime", |
| 909 base::TimeTicks::Now() - start_time); | 907 base::TimeTicks::Now() - start_time); |
| 910 } | 908 } |
| 911 | 909 |
| 912 SearchSuggestionParser::SuggestResults SearchProvider::ScoreHistoryResults( | 910 SearchSuggestionParser::SuggestResults SearchProvider::ScoreHistoryResults( |
| 913 const HistoryResults& results, | 911 const HistoryResults& results, |
| 914 bool base_prevent_inline_autocomplete, | 912 bool base_prevent_inline_autocomplete, |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1014 for (SearchSuggestionParser::SuggestResults::iterator i( | 1012 for (SearchSuggestionParser::SuggestResults::iterator i( |
| 1015 scored_results.begin()); i != scored_results.end(); ++i) { | 1013 scored_results.begin()); i != scored_results.end(); ++i) { |
| 1016 if ((last_relevance != 0) && (i->relevance() >= last_relevance)) | 1014 if ((last_relevance != 0) && (i->relevance() >= last_relevance)) |
| 1017 i->set_relevance(last_relevance - 1); | 1015 i->set_relevance(last_relevance - 1); |
| 1018 last_relevance = i->relevance(); | 1016 last_relevance = i->relevance(); |
| 1019 } | 1017 } |
| 1020 | 1018 |
| 1021 return scored_results; | 1019 return scored_results; |
| 1022 } | 1020 } |
| 1023 | 1021 |
| 1022 void SearchProvider::ScoreHistoryResultsMultiWord( | |
| 1023 const HistoryResults& results, | |
| 1024 bool is_keyword, | |
| 1025 SearchSuggestionParser::SuggestResults* scored_results) { | |
| 1026 bool prevent_inline_autocomplete = | |
| 1027 input_.prevent_inline_autocomplete() || | |
| 1028 (input_.type() == metrics::OmniboxInputType::URL); | |
| 1029 const base::string16& input_text = | |
| 1030 is_keyword ? keyword_input_.text() : input_.text(); | |
| 1031 bool input_multiple_words = HasMultipleWords(input_text); | |
| 1032 | |
| 1033 if (!prevent_inline_autocomplete && input_multiple_words) { | |
| 1034 // ScoreHistoryResults() allows autocompletion of multi-word, 1-visit | |
| 1035 // queries if the input also has multiple words. But if we were already | |
| 1036 // scoring a multi-word, multi-visit query aggressively, and the current | |
| 1037 // input is still a prefix of it, then changing the suggestion suddenly | |
| 1038 // feels wrong. To detect this case, first score as if only one word has | |
| 1039 // been typed, then check if the best result came from aggressive search | |
| 1040 // history scoring. If it did, then just keep that score set. This | |
| 1041 // 1200 the lowest possible score in CalculateRelevanceForHistory()'s | |
| 1042 // aggressive-scoring curve. | |
| 1043 *scored_results = ScoreHistoryResults( | |
| 1044 results, prevent_inline_autocomplete, false, input_text, is_keyword); | |
| 1045 if ((scored_results->front().relevance() < 1200) || | |
| 1046 !HasMultipleWords(scored_results->front().suggestion())) | |
| 1047 scored_results->clear(); // Didn't detect the case above, score normally. | |
| 1048 } | |
| 1049 if (scored_results->empty()) | |
| 1050 *scored_results = ScoreHistoryResults(results, prevent_inline_autocomplete, | |
| 1051 input_multiple_words, input_text, | |
| 1052 is_keyword); | |
| 1053 } | |
| 1054 | |
| 1024 void SearchProvider::AddSuggestResultsToMap( | 1055 void SearchProvider::AddSuggestResultsToMap( |
| 1025 const SearchSuggestionParser::SuggestResults& results, | 1056 const SearchSuggestionParser::SuggestResults& results, |
| 1026 const std::string& metadata, | 1057 const std::string& metadata, |
| 1027 MatchMap* map) { | 1058 MatchMap* map) { |
| 1028 for (size_t i = 0; i < results.size(); ++i) { | 1059 for (size_t i = 0; i < results.size(); ++i) { |
| 1029 AddMatchToMap(results[i], metadata, i, false, | 1060 AddMatchToMap(results[i], metadata, i, false, |
| 1030 providers_.GetKeywordProviderURL() != NULL, map); | 1061 providers_.GetKeywordProviderURL() != NULL, map); |
| 1031 } | 1062 } |
| 1032 } | 1063 } |
| 1033 | 1064 |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1260 last_answer_seen_.query_type = match->answer_type; | 1291 last_answer_seen_.query_type = match->answer_type; |
| 1261 } | 1292 } |
| 1262 | 1293 |
| 1263 void SearchProvider::DoAnswersQuery(const AutocompleteInput& input) { | 1294 void SearchProvider::DoAnswersQuery(const AutocompleteInput& input) { |
| 1264 // If the query text starts with trimmed input, this is valid prefetch data. | 1295 // If the query text starts with trimmed input, this is valid prefetch data. |
| 1265 prefetch_data_ = StartsWith(last_answer_seen_.full_query_text, | 1296 prefetch_data_ = StartsWith(last_answer_seen_.full_query_text, |
| 1266 base::CollapseWhitespace(input.text(), false), | 1297 base::CollapseWhitespace(input.text(), false), |
| 1267 false) ? | 1298 false) ? |
| 1268 last_answer_seen_ : AnswersQueryData(); | 1299 last_answer_seen_ : AnswersQueryData(); |
| 1269 } | 1300 } |
| OLD | NEW |