103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file. 403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/omnibox/answers_cache.h" 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/strings/string_util.h" 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)AnswersQueryData::AnswersQueryData() { 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)AnswersQueryData::AnswersQueryData(const base::string16& text, 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::string16& type) 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : full_query_text(text), query_type(type) { 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)AnswersCache::AnswersCache(size_t max_entries) : max_entries_(max_entries) { 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)AnswersCache::~AnswersCache() { 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)AnswersQueryData AnswersCache::GetTopAnswerEntry(const base::string16& query) { 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::string16 collapsed_query = base::CollapseWhitespace(query, false); 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (Cache::iterator it = cache_.begin(); it != cache_.end(); ++it) { 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // If the query text starts with trimmed input, this is valid prefetch data. 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (StartsWith(it->full_query_text, collapsed_query, false)) { 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Move the touched item to the front of the list. 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) cache_.splice(cache_.begin(), cache_, it); 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return cache_.front(); 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return AnswersQueryData(); 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AnswersCache::UpdateRecentAnswers(const base::string16& full_query_text, 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::string16& query_type) { 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // If this entry is already part of the cache, just update recency. 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (Cache::iterator it = cache_.begin(); it != cache_.end(); ++it) { 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (full_query_text == it->full_query_text && 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) query_type == it->query_type) { 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) cache_.splice(cache_.begin(), cache_, it); 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return; 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Evict if cache size is exceeded. 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (cache_.size() >= max_entries_) 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) cache_.pop_back(); 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) cache_.push_front(AnswersQueryData(full_query_text, query_type)); 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 52