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