1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_types.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <limits>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/stl_util-inl.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history {
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// URLRow ----------------------------------------------------------------------
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRow::URLRow() {
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Initialize();
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRow::URLRow(const GURL& url) : url_(url) {
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Initialize will not set the URL, so our initialization above will stay.
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Initialize();
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRow::URLRow(const GURL& url, URLID id) : url_(url) {
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Initialize will not set the URL, so our initialization above will stay.
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Initialize();
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Initialize will zero the id_, so set it here.
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  id_ = id;
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRow::~URLRow() {
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRow& URLRow::operator=(const URLRow& other) {
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  id_ = other.id_;
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url_ = other.url_;
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  title_ = other.title_;
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  visit_count_ = other.visit_count_;
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  typed_count_ = other.typed_count_;
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  last_visit_ = other.last_visit_;
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  hidden_ = other.hidden_;
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return *this;
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid URLRow::Swap(URLRow* other) {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(id_, other->id_);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url_.Swap(&other->url_);
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  title_.swap(other->title_);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(visit_count_, other->visit_count_);
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(typed_count_, other->typed_count_);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(last_visit_, other->last_visit_);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(hidden_, other->hidden_);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid URLRow::Initialize() {
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  id_ = 0;
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  visit_count_ = 0;
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  typed_count_ = 0;
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  last_visit_ = base::Time();
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  hidden_ = false;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// VisitRow --------------------------------------------------------------------
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochVisitRow::VisitRow()
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : visit_id(0),
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      url_id(0),
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      referring_visit(0),
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      transition(PageTransition::LINK),
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      segment_id(0),
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_indexed(false) {
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochVisitRow::VisitRow(URLID arg_url_id,
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                   base::Time arg_visit_time,
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   VisitID arg_referring_visit,
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   PageTransition::Type arg_transition,
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   SegmentID arg_segment_id)
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : visit_id(0),
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      url_id(arg_url_id),
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      visit_time(arg_visit_time),
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      referring_visit(arg_referring_visit),
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      transition(arg_transition),
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      segment_id(arg_segment_id),
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_indexed(false) {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickVisitRow::~VisitRow() {
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Favicons -------------------------------------------------------------------
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenImportedFaviconUsage::ImportedFaviconUsage() {
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenImportedFaviconUsage::~ImportedFaviconUsage() {
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// StarredEntry ----------------------------------------------------------------
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochStarredEntry::StarredEntry()
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : id(0),
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      parent_folder_id(0),
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      folder_id(0),
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      visual_order(0),
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      type(URL),
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      url_id(0) {
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickStarredEntry::~StarredEntry() {
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid StarredEntry::Swap(StarredEntry* other) {
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(id, other->id);
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  title.swap(other->title);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(date_added, other->date_added);
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::swap(parent_folder_id, other->parent_folder_id);
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::swap(folder_id, other->folder_id);
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(visual_order, other->visual_order);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(type, other->type);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url.Swap(&other->url);
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(url_id, other->url_id);
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::swap(date_folder_modified, other->date_folder_modified);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// URLResult -------------------------------------------------------------------
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLResult::URLResult() {
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLResult::URLResult(const GURL& url, base::Time visit_time)
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : URLRow(url),
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      visit_time_(visit_time) {
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLResult::URLResult(const GURL& url,
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                     const Snippet::MatchPositions& title_matches)
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : URLRow(url) {
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  title_match_positions_ = title_matches;
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLResult::~URLResult() {
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid URLResult::SwapResult(URLResult* other) {
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLRow::Swap(other);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(visit_time_, other->visit_time_);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  snippet_.Swap(&other->snippet_);
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  title_match_positions_.swap(other->title_match_positions_);
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// QueryResults ----------------------------------------------------------------
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochQueryResults::QueryResults() : reached_beginning_(false) {
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochQueryResults::~QueryResults() {
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Free all the URL objects.
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  STLDeleteContainerPointers(results_.begin(), results_.end());
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst size_t* QueryResults::MatchesForURL(const GURL& url,
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          size_t* num_matches) const {
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLToResultIndices::const_iterator found = url_to_results_.find(url);
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (found == url_to_results_.end()) {
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (num_matches)
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *num_matches = 0;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NULL;
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // All entries in the map should have at least one index, otherwise it
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // shouldn't be in the map.
174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(!found->second->empty());
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (num_matches)
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *num_matches = found->second->size();
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return &found->second->front();
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::Swap(QueryResults* other) {
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(first_time_searched_, other->first_time_searched_);
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(reached_beginning_, other->reached_beginning_);
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  results_.swap(other->results_);
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url_to_results_.swap(other->url_to_results_);
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::AppendURLBySwapping(URLResult* result) {
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLResult* new_result = new URLResult;
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  new_result->SwapResult(result);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  results_.push_back(new_result);
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddURLUsageAtIndex(new_result->url(), results_.size() - 1);
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::AppendResultsBySwapping(QueryResults* other,
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           bool remove_dupes) {
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (remove_dupes) {
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Delete all entries in the other array that are already in this one.
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (size_t i = 0; i < results_.size(); i++)
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      other->DeleteURL(results_[i]->url());
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (first_time_searched_ > other->first_time_searched_)
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::swap(first_time_searched_, other->first_time_searched_);
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (reached_beginning_ != other->reached_beginning_)
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::swap(reached_beginning_, other->reached_beginning_);
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < other->results_.size(); i++) {
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Just transfer pointer ownership.
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    results_.push_back(other->results_[i]);
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddURLUsageAtIndex(results_.back()->url(), results_.size() - 1);
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We just took ownership of all the results in the input vector.
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  other->results_.clear();
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  other->url_to_results_.clear();
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::DeleteURL(const GURL& url) {
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete all instances of this URL. We re-query each time since each
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // mutation will cause the indices to change.
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (const size_t* match_indices = MatchesForURL(url, NULL))
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DeleteRange(*match_indices, *match_indices);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::DeleteRange(size_t begin, size_t end) {
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(begin <= end && begin < size() && end < size());
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First delete the pointers in the given range and store all the URLs that
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // were modified. We will delete references to these later.
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::set<GURL> urls_modified;
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = begin; i <= end; i++) {
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    urls_modified.insert(results_[i]->url());
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete results_[i];
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    results_[i] = NULL;
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now just delete that range in the vector en masse (the STL ending is
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // exclusive, while ours is inclusive, hence the +1).
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  results_.erase(results_.begin() + begin, results_.begin() + end + 1);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete the indicies referencing the deleted entries.
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (std::set<GURL>::const_iterator url = urls_modified.begin();
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       url != urls_modified.end(); ++url) {
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    URLToResultIndices::iterator found = url_to_results_.find(*url);
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (found == url_to_results_.end()) {
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      continue;
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Need a signed loop type since we do -- which may take us to -1.
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (int match = 0; match < static_cast<int>(found->second->size());
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         match++) {
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (found->second[match] >= begin && found->second[match] <= end) {
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        // Remove this referece from the list.
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        found->second->erase(found->second->begin() + match);
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        match--;
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Clear out an empty lists if we just made one.
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (found->second->empty())
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      url_to_results_.erase(found);
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Shift all other indices over to account for the removed ones.
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AdjustResultMap(end + 1, std::numeric_limits<size_t>::max(),
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  -static_cast<ptrdiff_t>(end - begin + 1));
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::AddURLUsageAtIndex(const GURL& url, size_t index) {
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLToResultIndices::iterator found = url_to_results_.find(url);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (found != url_to_results_.end()) {
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The URL is already in the list, so we can just append the new index.
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    found->second->push_back(index);
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Need to add a new entry for this URL.
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StackVector<size_t, 4> new_list;
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_list->push_back(index);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url_to_results_[url] = new_list;
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::AdjustResultMap(size_t begin, size_t end, ptrdiff_t delta) {
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (URLToResultIndices::iterator i = url_to_results_.begin();
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       i != url_to_results_.end(); ++i) {
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (size_t match = 0; match < i->second->size(); match++) {
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      size_t match_index = i->second[match];
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (match_index >= begin && match_index <= end)
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        i->second[match] += delta;
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// QueryOptions ----------------------------------------------------------------
298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
299731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickQueryOptions::QueryOptions() : max_count(0) {}
300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid QueryOptions::SetRecentDayRange(int days_ago) {
302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  end_time = base::Time::Now();
303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  begin_time = end_time - base::TimeDelta::FromDays(days_ago);
304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// KeywordSearchTermVisit -----------------------------------------------------
307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
308731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickKeywordSearchTermVisit::KeywordSearchTermVisit() {}
309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
310731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickKeywordSearchTermVisit::~KeywordSearchTermVisit() {}
311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// KeywordSearchTermRow --------------------------------------------------------
3133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
3143f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenKeywordSearchTermRow::KeywordSearchTermRow() : keyword_id(0), url_id(0) {}
3153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
3163f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenKeywordSearchTermRow::~KeywordSearchTermRow() {}
3173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// MostVisitedURL --------------------------------------------------------------
319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
320731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickMostVisitedURL::MostVisitedURL() {}
321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
322731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickMostVisitedURL::MostVisitedURL(const GURL& in_url,
323731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                               const GURL& in_favicon_url,
324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                               const string16& in_title)
325731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : url(in_url),
326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      favicon_url(in_favicon_url),
327731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      title(in_title) {
328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
330731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickMostVisitedURL::~MostVisitedURL() {}
331731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Images ---------------------------------------------------------------------
333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
334731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickImages::Images() {}
335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
336731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickImages::~Images() {}
337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
33821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// TopSitesDelta --------------------------------------------------------------
33921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
34021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTopSitesDelta::TopSitesDelta() {}
34121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
34221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTopSitesDelta::~TopSitesDelta() {}
34321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// HistoryAddPageArgs ---------------------------------------------------------
345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHistoryAddPageArgs::HistoryAddPageArgs(
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const GURL& arg_url,
3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    base::Time arg_time,
3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const void* arg_id_scope,
3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int32 arg_page_id,
3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const GURL& arg_referrer,
3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const history::RedirectList& arg_redirects,
3533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    PageTransition::Type arg_transition,
3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    VisitSource arg_source,
3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool arg_did_replace_entry)
3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : url(arg_url),
3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        time(arg_time),
3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        id_scope(arg_id_scope),
3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        page_id(arg_page_id),
3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        referrer(arg_referrer),
3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        redirects(arg_redirects),
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        transition(arg_transition),
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        visit_source(arg_source),
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        did_replace_entry(arg_did_replace_entry) {
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
367731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickHistoryAddPageArgs::~HistoryAddPageArgs() {}
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHistoryAddPageArgs* HistoryAddPageArgs::Clone() const {
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return new HistoryAddPageArgs(
3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      url, time, id_scope, page_id, referrer, redirects, transition,
3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      visit_source, did_replace_entry);
3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
37521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenThumbnailMigration::ThumbnailMigration() {}
37621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
37721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenThumbnailMigration::~ThumbnailMigration() {}
37821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
37921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenMostVisitedThumbnails::MostVisitedThumbnails() {}
38021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
38121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenMostVisitedThumbnails::~MostVisitedThumbnails() {}
382513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
383dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Autocomplete thresholds -----------------------------------------------------
384dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
385dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst int kLowQualityMatchTypedLimit = 1;
386dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst int kLowQualityMatchVisitLimit = 3;
387dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst int kLowQualityMatchAgeLimitInDays = 3;
388dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
389dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbase::Time AutocompleteAgeThreshold() {
390dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return (base::Time::Now() -
391dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          base::TimeDelta::FromDays(kLowQualityMatchAgeLimitInDays));
392dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
393dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
394dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool RowQualifiesAsSignificant(const URLRow& row,
395dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                               const base::Time& threshold) {
396dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const base::Time& real_threshold =
397dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      threshold.is_null() ? AutocompleteAgeThreshold() : threshold;
398dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return (row.typed_count() > kLowQualityMatchTypedLimit) ||
399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         (row.visit_count() > kLowQualityMatchVisitLimit) ||
400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         (row.last_visit() >= real_threshold);
401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// IconMapping ----------------------------------------------------------------
404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIconMapping::IconMapping()
406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : mapping_id(0),
407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      icon_id(0),
408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      icon_type(INVALID_ICON) {
409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIconMapping::~IconMapping() {}
412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenFaviconData::FaviconData()
415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  : known_icon(false),
416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    expired(false),
417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    icon_type(history::INVALID_ICON) {
418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenFaviconData::~FaviconData() {}
421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool FaviconData::is_valid() {
423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return known_icon && image_data.get() && image_data->size();
424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace history
427