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)#include "chrome/browser/ui/app_list/search/history.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/app_list/search/history_data.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/app_list/search/history_data_store.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/app_list/search/tokenized_string.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace app_list {
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace {
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Normalize the given string by joining all its tokens with a space.
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)std::string NormalizeString(const std::string& utf8) {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TokenizedString tokenized(base::UTF8ToUTF16(utf8));
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::UTF16ToUTF8(JoinString(tokenized.tokens(), ' '));
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHistory::History(scoped_refptr<HistoryDataStore> store)
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : store_(store),
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      data_loaded_(false) {
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const size_t kMaxQueryEntries = 1000;
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const size_t kMaxSecondaryQueries = 5;
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  data_.reset(
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new HistoryData(store_.get(), kMaxQueryEntries, kMaxSecondaryQueries));
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  data_->AddObserver(this);
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)History::~History() {
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  data_->RemoveObserver(this);
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool History::IsReady() const {
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return data_loaded_;
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void History::AddLaunchEvent(const std::string& query,
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             const std::string& result_id) {
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(IsReady());
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  data_->Add(NormalizeString(query), result_id);
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)scoped_ptr<KnownResults> History::GetKnownResults(
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string& query) const {
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(IsReady());
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return data_->GetKnownResults(NormalizeString(query)).Pass();
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void History::OnHistoryDataLoadedFromStore() {
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  data_loaded_ = true;
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace app_list
61