history_types.cc revision 513209b27ff55e2841eac0e4120199c23acce758
13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 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 Murdochusing base::Time;
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickusing base::TimeDelta;
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history {
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// URLRow ----------------------------------------------------------------------
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRow::URLRow() {
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Initialize();
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRow::URLRow(const GURL& url) : url_(url) {
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Initialize will not set the URL, so our initialization above will stay.
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Initialize();
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRow::URLRow(const GURL& url, URLID id) : url_(url) {
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Initialize will not set the URL, so our initialization above will stay.
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Initialize();
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Initialize will zero the id_, so set it here.
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  id_ = id;
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRow::~URLRow() {
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLRow& URLRow::operator=(const URLRow& other) {
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  id_ = other.id_;
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url_ = other.url_;
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  title_ = other.title_;
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  visit_count_ = other.visit_count_;
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  typed_count_ = other.typed_count_;
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  last_visit_ = other.last_visit_;
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  hidden_ = other.hidden_;
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  favicon_id_ = other.favicon_id_;
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return *this;
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid URLRow::Swap(URLRow* other) {
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(id_, other->id_);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url_.Swap(&other->url_);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  title_.swap(other->title_);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(visit_count_, other->visit_count_);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(typed_count_, other->typed_count_);
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(last_visit_, other->last_visit_);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(hidden_, other->hidden_);
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(favicon_id_, other->favicon_id_);
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid URLRow::Initialize() {
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  id_ = 0;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  visit_count_ = false;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typed_count_ = false;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  last_visit_ = Time();
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  hidden_ = false;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  favicon_id_ = 0;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// VisitRow --------------------------------------------------------------------
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochVisitRow::VisitRow()
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : visit_id(0),
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      url_id(0),
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      referring_visit(0),
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      transition(PageTransition::LINK),
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      segment_id(0),
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_indexed(false) {
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochVisitRow::VisitRow(URLID arg_url_id,
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   Time arg_visit_time,
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   VisitID arg_referring_visit,
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   PageTransition::Type arg_transition,
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   SegmentID arg_segment_id)
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : visit_id(0),
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      url_id(arg_url_id),
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      visit_time(arg_visit_time),
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      referring_visit(arg_referring_visit),
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      transition(arg_transition),
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      segment_id(arg_segment_id),
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_indexed(false) {
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickVisitRow::~VisitRow() {
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Favicons -------------------------------------------------------------------
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
100731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickImportedFavIconUsage::ImportedFavIconUsage() {
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
103731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickImportedFavIconUsage::~ImportedFavIconUsage() {
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// StarredEntry ----------------------------------------------------------------
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochStarredEntry::StarredEntry()
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : id(0),
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      parent_group_id(0),
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      group_id(0),
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      visual_order(0),
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      type(URL),
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      url_id(0) {
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickStarredEntry::~StarredEntry() {
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid StarredEntry::Swap(StarredEntry* other) {
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(id, other->id);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  title.swap(other->title);
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(date_added, other->date_added);
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(parent_group_id, other->parent_group_id);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(group_id, other->group_id);
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(visual_order, other->visual_order);
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(type, other->type);
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url.Swap(&other->url);
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(url_id, other->url_id);
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(date_group_modified, other->date_group_modified);
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// URLResult -------------------------------------------------------------------
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLResult::URLResult() {
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLResult::URLResult(const GURL& url, base::Time visit_time)
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : URLRow(url),
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      visit_time_(visit_time) {
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLResult::URLResult(const GURL& url,
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                     const Snippet::MatchPositions& title_matches)
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : URLRow(url) {
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  title_match_positions_ = title_matches;
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickURLResult::~URLResult() {
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid URLResult::Swap(URLResult* other) {
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLRow::Swap(other);
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(visit_time_, other->visit_time_);
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  snippet_.Swap(&other->snippet_);
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  title_match_positions_.swap(other->title_match_positions_);
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// QueryResults ----------------------------------------------------------------
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochQueryResults::QueryResults() : reached_beginning_(false) {
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochQueryResults::~QueryResults() {
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Free all the URL objects.
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  STLDeleteContainerPointers(results_.begin(), results_.end());
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst size_t* QueryResults::MatchesForURL(const GURL& url,
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          size_t* num_matches) const {
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLToResultIndices::const_iterator found = url_to_results_.find(url);
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (found == url_to_results_.end()) {
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (num_matches)
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *num_matches = 0;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NULL;
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // All entries in the map should have at least one index, otherwise it
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // shouldn't be in the map.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(found->second->size() > 0);
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (num_matches)
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *num_matches = found->second->size();
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return &found->second->front();
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::Swap(QueryResults* other) {
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(first_time_searched_, other->first_time_searched_);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::swap(reached_beginning_, other->reached_beginning_);
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  results_.swap(other->results_);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url_to_results_.swap(other->url_to_results_);
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::AppendURLBySwapping(URLResult* result) {
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLResult* new_result = new URLResult;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_result->Swap(result);
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  results_.push_back(new_result);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddURLUsageAtIndex(new_result->url(), results_.size() - 1);
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::AppendResultsBySwapping(QueryResults* other,
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           bool remove_dupes) {
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (remove_dupes) {
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Delete all entries in the other array that are already in this one.
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (size_t i = 0; i < results_.size(); i++)
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      other->DeleteURL(results_[i]->url());
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (first_time_searched_ > other->first_time_searched_)
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::swap(first_time_searched_, other->first_time_searched_);
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (reached_beginning_ != other->reached_beginning_)
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::swap(reached_beginning_, other->reached_beginning_);
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < other->results_.size(); i++) {
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Just transfer pointer ownership.
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    results_.push_back(other->results_[i]);
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddURLUsageAtIndex(results_.back()->url(), results_.size() - 1);
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We just took ownership of all the results in the input vector.
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  other->results_.clear();
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  other->url_to_results_.clear();
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::DeleteURL(const GURL& url) {
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete all instances of this URL. We re-query each time since each
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // mutation will cause the indices to change.
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (const size_t* match_indices = MatchesForURL(url, NULL))
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DeleteRange(*match_indices, *match_indices);
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::DeleteRange(size_t begin, size_t end) {
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(begin <= end && begin < size() && end < size());
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First delete the pointers in the given range and store all the URLs that
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // were modified. We will delete references to these later.
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::set<GURL> urls_modified;
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = begin; i <= end; i++) {
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    urls_modified.insert(results_[i]->url());
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete results_[i];
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    results_[i] = NULL;
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now just delete that range in the vector en masse (the STL ending is
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // exclusive, while ours is inclusive, hence the +1).
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  results_.erase(results_.begin() + begin, results_.begin() + end + 1);
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete the indicies referencing the deleted entries.
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (std::set<GURL>::const_iterator url = urls_modified.begin();
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       url != urls_modified.end(); ++url) {
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    URLToResultIndices::iterator found = url_to_results_.find(*url);
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (found == url_to_results_.end()) {
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      continue;
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Need a signed loop type since we do -- which may take us to -1.
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (int match = 0; match < static_cast<int>(found->second->size());
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         match++) {
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (found->second[match] >= begin && found->second[match] <= end) {
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        // Remove this referece from the list.
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        found->second->erase(found->second->begin() + match);
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        match--;
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Clear out an empty lists if we just made one.
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (found->second->empty())
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      url_to_results_.erase(found);
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Shift all other indices over to account for the removed ones.
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AdjustResultMap(end + 1, std::numeric_limits<size_t>::max(),
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  -static_cast<ptrdiff_t>(end - begin + 1));
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::AddURLUsageAtIndex(const GURL& url, size_t index) {
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLToResultIndices::iterator found = url_to_results_.find(url);
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (found != url_to_results_.end()) {
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The URL is already in the list, so we can just append the new index.
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    found->second->push_back(index);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Need to add a new entry for this URL.
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StackVector<size_t, 4> new_list;
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_list->push_back(index);
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url_to_results_[url] = new_list;
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid QueryResults::AdjustResultMap(size_t begin, size_t end, ptrdiff_t delta) {
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (URLToResultIndices::iterator i = url_to_results_.begin();
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       i != url_to_results_.end(); ++i) {
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (size_t match = 0; match < i->second->size(); match++) {
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      size_t match_index = i->second[match];
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (match_index >= begin && match_index <= end)
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        i->second[match] += delta;
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// QueryOptions ----------------------------------------------------------------
304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
305731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickQueryOptions::QueryOptions() : max_count(0) {}
306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid QueryOptions::SetRecentDayRange(int days_ago) {
308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  end_time = base::Time::Now();
309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  begin_time = end_time - base::TimeDelta::FromDays(days_ago);
310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// KeywordSearchTermVisit -----------------------------------------------------
313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
314731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickKeywordSearchTermVisit::KeywordSearchTermVisit() {}
315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
316731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickKeywordSearchTermVisit::~KeywordSearchTermVisit() {}
317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
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
338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// HistoryAddPageArgs ---------------------------------------------------------
339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHistoryAddPageArgs::HistoryAddPageArgs(
3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const GURL& arg_url,
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    base::Time arg_time,
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const void* arg_id_scope,
3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int32 arg_page_id,
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const GURL& arg_referrer,
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const history::RedirectList& arg_redirects,
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    PageTransition::Type arg_transition,
3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    VisitSource arg_source,
3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool arg_did_replace_entry)
3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : url(arg_url),
3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        time(arg_time),
3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        id_scope(arg_id_scope),
3533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        page_id(arg_page_id),
3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        referrer(arg_referrer),
3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        redirects(arg_redirects),
3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        transition(arg_transition),
3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        visit_source(arg_source),
3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        did_replace_entry(arg_did_replace_entry) {
3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
361731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickHistoryAddPageArgs::~HistoryAddPageArgs() {}
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHistoryAddPageArgs* HistoryAddPageArgs::Clone() const {
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return new HistoryAddPageArgs(
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      url, time, id_scope, page_id, referrer, redirects, transition,
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      visit_source, did_replace_entry);
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
369513209b27ff55e2841eac0e4120199c23acce758Ben MurdochMostVisitedThumbnails::MostVisitedThumbnails() {
370513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
371513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace history
373