MD Downloads: UI review feedback
[chromium-blink-merge.git] / chrome / browser / predictors / resource_prefetch_predictor_tables.h
blob84f0eba6c78214a4c88af7c5994bb1b1b80053d1
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.
5 #ifndef CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TABLES_H_
6 #define CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TABLES_H_
9 #include <map>
10 #include <string>
11 #include <vector>
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"
19 namespace sql {
20 class Statement;
23 namespace predictors {
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.
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.
34 class 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;
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;
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;
63 // Not stored.
64 float score;
66 typedef std::vector<ResourceRow> ResourceRows;
68 // Sorts the ResourceRows by score, descending.
69 struct ResourceRowSorter {
70 bool operator()(const ResourceRow& x, const ResourceRow& y) const;
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;
82 bool is_host() const { return key_type == PREFETCH_KEY_TYPE_HOST; }
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.
88 base::Time last_visit;
89 ResourceRows resources;
91 // Map from primary key to PrefetchData for the key.
92 typedef std::map<std::string, PrefetchData> PrefetchDataMap;
94 // Returns data for all Urls and Hosts.
95 virtual void GetAllData(PrefetchDataMap* url_data_map,
96 PrefetchDataMap* host_data_map);
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);
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);
109 // Wrapper over DeleteData for convenience.
110 virtual void DeleteSingleDataPoint(const std::string& key,
111 PrefetchKeyType key_type);
113 // Deletes all data in all the tables.
114 virtual void DeleteAllData();
116 // The maximum length of the string that can be stored in the DB.
117 static const size_t kMaxStringLength;
119 private:
120 friend class PredictorDatabaseInternal;
121 friend class MockResourcePrefetchPredictorTables;
123 ResourcePrefetchPredictorTables();
124 ~ResourcePrefetchPredictorTables() override;
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);
135 // Returns true if the strings in the |data| are less than |kMaxStringLength|
136 // in length.
137 bool StringsAreSmallerThanDBLimit(const PrefetchData& data) const;
139 // PredictorTableBase methods.
140 void CreateTableIfNonExistent() override;
141 void LogDatabaseStats() override;
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();
150 sql::Statement* GetHostResourceDeleteStatement();
151 sql::Statement* GetHostResourceUpdateStatement();
152 sql::Statement* GetHostMetadataDeleteStatement();
153 sql::Statement* GetHostMetadataUpdateStatement();
155 DISALLOW_COPY_AND_ASSIGN(ResourcePrefetchPredictorTables);
158 } // namespace predictors
160 #endif // CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TABLES_H_