1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TABLES_H_
6#define CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TABLES_H_
7
8
9#include <map>
10#include <string>
11#include <vector>
12
13#include "base/time/time.h"
14#include "chrome/browser/predictors/predictor_table_base.h"
15#include "chrome/browser/predictors/resource_prefetch_common.h"
16#include "content/public/common/resource_type.h"
17#include "url/gurl.h"
18
19namespace sql {
20class Statement;
21}
22
23namespace predictors {
24
25// Interface for database tables used by the ResourcePrefetchPredictor.
26// All methods except the constructor and destructor need to be called on the DB
27// thread.
28//
29// Currently manages:
30//  - UrlResourceTable - resources per Urls.
31//  - UrlMetadataTable - misc data for Urls (like last visit time).
32//  - HostResourceTable - resources per host.
33//  - HostMetadataTable - misc data for hosts.
34class ResourcePrefetchPredictorTables : public PredictorTableBase {
35 public:
36  // Used in the UrlResourceTable and HostResourceTable to store resources
37  // required for the page or host.
38  struct ResourceRow {
39    ResourceRow();
40    ResourceRow(const ResourceRow& other);
41    ResourceRow(const std::string& main_frame_url,
42                const std::string& resource_url,
43                content::ResourceType resource_type,
44                int number_of_hits,
45                int number_of_misses,
46                int consecutive_misses,
47                double average_position);
48    void UpdateScore();
49    bool operator==(const ResourceRow& rhs) const;
50
51    // Stores the host for host based data, main frame Url for the Url based
52    // data. This field is cleared for efficiency reasons and the code outside
53    // this class should not assume it is set.
54    std::string primary_key;
55
56    GURL resource_url;
57    content::ResourceType resource_type;
58    size_t number_of_hits;
59    size_t number_of_misses;
60    size_t consecutive_misses;
61    double average_position;
62
63    // Not stored.
64    float score;
65  };
66  typedef std::vector<ResourceRow> ResourceRows;
67
68  // Sorts the ResourceRows by score, descending.
69  struct ResourceRowSorter {
70    bool operator()(const ResourceRow& x, const ResourceRow& y) const;
71  };
72
73  // Aggregated data for a Url or Host. Although the data differs slightly, we
74  // store them in the same structure, because most of the fields are common and
75  // it allows us to use the same functions.
76  struct PrefetchData {
77    PrefetchData(PrefetchKeyType key_type, const std::string& primary_key);
78    PrefetchData(const PrefetchData& other);
79    ~PrefetchData();
80    bool operator==(const PrefetchData& rhs) const;
81
82    bool is_host() const { return key_type == PREFETCH_KEY_TYPE_HOST; }
83
84    // Is the data a host as opposed to a Url?
85    PrefetchKeyType key_type;  // Not const to be able to assign.
86    std::string primary_key;  // is_host() ? main frame url : host.
87
88    base::Time last_visit;
89    ResourceRows resources;
90  };
91  // Map from primary key to PrefetchData for the key.
92  typedef std::map<std::string, PrefetchData> PrefetchDataMap;
93
94  // Returns data for all Urls and Hosts.
95  virtual void GetAllData(PrefetchDataMap* url_data_map,
96                          PrefetchDataMap* host_data_map);
97
98  // Updates data for a Url and a host. If either of the |url_data| or
99  // |host_data| has an empty primary key, it will be ignored.
100  // Note that the Urls and primary key in |url_data| and |host_data| should be
101  // less than |kMaxStringLength| in length.
102  virtual void UpdateData(const PrefetchData& url_data,
103                          const PrefetchData& host_data);
104
105  // Delete data for the input |urls| and |hosts|.
106  virtual void DeleteData(const std::vector<std::string>& urls,
107                  const std::vector<std::string>& hosts);
108
109  // Wrapper over DeleteData for convenience.
110  virtual void DeleteSingleDataPoint(const std::string& key,
111                                     PrefetchKeyType key_type);
112
113  // Deletes all data in all the tables.
114  virtual void DeleteAllData();
115
116  // The maximum length of the string that can be stored in the DB.
117  static const size_t kMaxStringLength;
118
119 private:
120  friend class PredictorDatabaseInternal;
121  friend class MockResourcePrefetchPredictorTables;
122
123  ResourcePrefetchPredictorTables();
124  virtual ~ResourcePrefetchPredictorTables();
125
126  // Helper functions below help perform functions on the Url and host table
127  // using the same code.
128  void GetAllDataHelper(PrefetchKeyType key_type,
129                        PrefetchDataMap* data_map,
130                        std::vector<std::string>* to_delete);
131  bool UpdateDataHelper(const PrefetchData& data);
132  void DeleteDataHelper(PrefetchKeyType key_type,
133                        const std::vector<std::string>& keys);
134
135  // Returns true if the strings in the |data| are less than |kMaxStringLength|
136  // in length.
137  bool StringsAreSmallerThanDBLimit(const PrefetchData& data) const;
138
139  // PredictorTableBase methods.
140  virtual void CreateTableIfNonExistent() OVERRIDE;
141  virtual void LogDatabaseStats() OVERRIDE;
142
143  // Helpers to return Statements for cached Statements. The caller must take
144  // ownership of the return Statements.
145  sql::Statement* GetUrlResourceDeleteStatement();
146  sql::Statement* GetUrlResourceUpdateStatement();
147  sql::Statement* GetUrlMetadataDeleteStatement();
148  sql::Statement* GetUrlMetadataUpdateStatement();
149
150  sql::Statement* GetHostResourceDeleteStatement();
151  sql::Statement* GetHostResourceUpdateStatement();
152  sql::Statement* GetHostMetadataDeleteStatement();
153  sql::Statement* GetHostMetadataUpdateStatement();
154
155  DISALLOW_COPY_AND_ASSIGN(ResourcePrefetchPredictorTables);
156};
157
158}  // namespace predictors
159
160#endif  // CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TABLES_H_
161