history_data.h revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright 2013 The Chromium Authors. All rights reserved. 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Use of this source code is governed by a BSD-style license that can be 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// found in the LICENSE file. 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_HISTORY_DATA_H_ 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#define CHROME_BROWSER_UI_APP_LIST_SEARCH_HISTORY_DATA_H_ 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include <deque> 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include <map> 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include <string> 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "base/basictypes.h" 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "base/memory/scoped_ptr.h" 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "base/memory/weak_ptr.h" 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "base/observer_list.h" 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "base/time.h" 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "chrome/browser/ui/app_list/search/history_types.h" 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chennamespace app_list { 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenclass HistoryDataObserver; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenclass HistoryDataStore; 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// HistoryData stores the associations of the user typed queries and launched 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// search result id. There are two types of association: primary and secondary. 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Primary is a 1-to-1 mapping between the query and result id. Secondary 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// is a 1-to-many mapping and only kept the last 5 to limit the data size. 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// If an association is added for the first time, it is added as a primary 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// association. Further associations added to the same query are added as 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// secondary. However, if a secondary association is added twice in a row, it 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// is promoted to primary and the current primary mapping is demoted into 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// secondary. 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenclass HistoryData : public base::SupportsWeakPtr<HistoryData> { 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public: 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen typedef std::deque<std::string> SecondaryDeque; 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Defines data to be associated with a query. 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen struct Data { 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Data(); 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen ~Data(); 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Primary result associated with the query. 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen std::string primary; 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Secondary results associated with the query from oldest to latest. 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen SecondaryDeque secondary; 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Last update time. 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen base::Time update_time; 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen }; 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen typedef std::map<std::string, Data> Associations; 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Constructor of HistoryData. |store| is the storage to persist the data. 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // |max_primary| is the maximum number of the most recent primary associations 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // to keep. |max_secondary| is the maximum number of secondary associations to 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // keep. 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen HistoryData(HistoryDataStore* store, 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen size_t max_primary, 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen size_t max_secondary); 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen ~HistoryData(); 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Adds an association. 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen void Add(const std::string& query, const std::string& result_id); 64 65 // Gets all known search results that were launched using the given |query| 66 // or the queries that |query| is a prefix of. 67 scoped_ptr<KnownResults> GetKnownResults(const std::string& query) const; 68 69 void AddObserver(HistoryDataObserver* observer); 70 void RemoveObserver(HistoryDataObserver* observer); 71 72 const Associations& associations() const { return associations_; } 73 74 private: 75 // Invoked from |store| with loaded data. 76 void OnStoreLoaded(scoped_ptr<Associations> loaded_data); 77 78 // Trims the data to keep the most recent |max_primary_| queries. 79 void TrimEntries(); 80 81 HistoryDataStore* store_; // Not owned. 82 const size_t max_primary_; 83 const size_t max_secondary_; 84 ObserverList<HistoryDataObserver, true> observers_; 85 86 Associations associations_; 87 88 DISALLOW_COPY_AND_ASSIGN(HistoryData); 89}; 90 91} // namespace app_list 92 93#endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_HISTORY_DATA_H_ 94