190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_HISTORY_H_
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define CHROME_BROWSER_UI_APP_LIST_SEARCH_HISTORY_H_
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <map>
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <string>
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/basictypes.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/ref_counted.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/app_list/search/history_data_observer.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/app_list/search/history_types.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace app_list {
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class HistoryData;
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class HistoryDataStore;
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace test {
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class SearchHistoryTest;
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// History tracks the launch events of the search results and uses HistoryData
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// to build user learning data out of these events. The learning data is stored
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// as associations between user typed query and launched result id. There are
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// primary and secondary associations. See HistoryData comments to see how
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// they are built. The learning data is sent to the mixer to boost results that
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// have been launched before.
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class History : public KeyedService, public HistoryDataObserver {
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit History(scoped_refptr<HistoryDataStore> store);
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~History();
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Returns true if the service is ready.
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool IsReady() const;
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Adds a launch event to the learning data.
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddLaunchEvent(const std::string& query, const std::string& result_id);
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Gets all known search results that were launched using the given |query|
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // or using queries that |query| is a prefix of.
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<KnownResults> GetKnownResults(const std::string& query) const;
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class app_list::test::SearchHistoryTest;
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // HistoryDataObserver overrides:
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnHistoryDataLoadedFromStore() OVERRIDE;
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<HistoryData> data_;
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<HistoryDataStore> store_;
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool data_loaded_;
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(History);
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace app_list
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_HISTORY_H_
64