Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Side by Side Diff: chrome/browser/predictors/resource_prefetch_predictor_tables.cc

Issue 2388783002: predictors: Refactor resource_prefetch_predictor_tables. (Closed)
Patch Set: Remove duplication. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h" 5 #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
11 #include <utility> 11 #include <utility>
12 12
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/metrics/histogram_macros.h" 14 #include "base/metrics/histogram_macros.h"
15 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
16 #include "content/public/browser/browser_thread.h" 16 #include "content/public/browser/browser_thread.h"
17 #include "sql/meta_table.h" 17 #include "sql/meta_table.h"
18 #include "sql/statement.h" 18 #include "sql/statement.h"
19 #include "sql/transaction.h" 19 #include "sql/transaction.h"
20 20
21 using content::BrowserThread; 21 using content::BrowserThread;
22 using sql::Statement; 22 using sql::Statement;
23 23
24 namespace { 24 namespace {
25 25
26 using ResourceData = predictors::ResourceData; 26 using PrefetchData = predictors::PrefetchData;
27 using RedirectData = predictors::RedirectData; 27 using RedirectData = predictors::RedirectData;
28 using ::google::protobuf::MessageLite;
28 29
29 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; 30 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata";
Benoit L 2016/10/04 15:43:57 The metadata table names are only used in DropTabl
alexilin 2016/10/04 17:25:46 Done.
30 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; 31 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url";
31 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata"; 32 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata";
32 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect"; 33 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect";
33 const char kHostResourceTableName[] = "resource_prefetch_predictor_host"; 34 const char kHostResourceTableName[] = "resource_prefetch_predictor_host";
34 const char kHostMetadataTableName[] = 35 const char kHostMetadataTableName[] =
35 "resource_prefetch_predictor_host_metadata"; 36 "resource_prefetch_predictor_host_metadata";
36 const char kHostRedirectTableName[] = 37 const char kHostRedirectTableName[] =
37 "resource_prefetch_predictor_host_redirect"; 38 "resource_prefetch_predictor_host_redirect";
38 39
39 const char kCreateGlobalMetadataStatementTemplate[] = 40 const char kCreateGlobalMetadataStatementTemplate[] =
40 "CREATE TABLE %s ( " 41 "CREATE TABLE %s ( "
41 "key TEXT, value INTEGER, " 42 "key TEXT, value INTEGER, "
42 "PRIMARY KEY (key))"; 43 "PRIMARY KEY (key))";
43 const char kCreateResourceTableStatementTemplate[] = 44 const char kCreateProtoTableStatementTemplate[] =
44 "CREATE TABLE %s ( " 45 "CREATE TABLE %s ( "
45 "main_page_url TEXT, " 46 "key TEXT, "
46 "resource_url TEXT, "
47 "proto BLOB, " 47 "proto BLOB, "
48 "PRIMARY KEY(main_page_url, resource_url))"; 48 "PRIMARY KEY(key))";
49 const char kCreateMetadataTableStatementTemplate[] = 49 const char kInsertProtoTableStatementTemplate[] =
50 "CREATE TABLE %s ( " 50 "INSERT INTO %s (key, proto) VALUES (?,?)";
51 "main_page_url TEXT, " 51 const char kDeleteProtoTableStatementTemplate[] = "DELETE FROM %s WHERE key=?";
52 "last_visit_time INTEGER, "
53 "PRIMARY KEY(main_page_url))";
54 const char kCreateRedirectTableStatementTemplate[] =
55 "CREATE TABLE %s ( "
56 "main_page_url TEXT, "
57 "proto BLOB, "
58 "PRIMARY KEY(main_page_url))";
59 52
60 const char kInsertResourceTableStatementTemplate[] = 53 void BindProtoDataToStatement(const std::string& key,
61 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)"; 54 const MessageLite& data,
62 const char kInsertRedirectTableStatementTemplate[] = 55 Statement* statement) {
63 "INSERT INTO %s (main_page_url, proto) VALUES (?,?)";
64 const char kInsertMetadataTableStatementTemplate[] =
65 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)";
66 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?";
67
68 void BindResourceDataToStatement(const ResourceData& data,
69 const std::string& primary_key,
70 Statement* statement) {
71 int size = data.ByteSize(); 56 int size = data.ByteSize();
72 DCHECK_GT(size, 0); 57 DCHECK_GT(size, 0);
73 std::vector<char> proto_buffer(size); 58 std::vector<char> proto_buffer(size);
74 data.SerializeToArray(&proto_buffer[0], size); 59 data.SerializeToArray(&proto_buffer[0], size);
75 60
76 statement->BindString(0, primary_key); 61 statement->BindString(0, key);
77 statement->BindString(1, data.resource_url());
78 statement->BindBlob(2, &proto_buffer[0], size);
79 }
80
81 void BindRedirectDataToStatement(const RedirectData& data,
82 Statement* statement) {
83 int size = data.ByteSize();
84 DCHECK_GT(size, 0);
85 std::vector<char> proto_buffer(size);
86 data.SerializeToArray(&proto_buffer[0], size);
87
88 statement->BindString(0, data.primary_key());
89 statement->BindBlob(1, &proto_buffer[0], size); 62 statement->BindBlob(1, &proto_buffer[0], size);
90 } 63 }
91 64
92 bool StepAndInitializeResourceData(Statement* statement, 65 bool StepAndInitializeProtoData(Statement* statement,
93 ResourceData* data, 66 std::string* key,
94 std::string* primary_key) { 67 MessageLite* data) {
95 if (!statement->Step()) 68 if (!statement->Step())
96 return false; 69 return false;
97 70
98 *primary_key = statement->ColumnString(0); 71 *key = statement->ColumnString(0);
99 int size = statement->ColumnByteLength(2);
100 const void* blob = statement->ColumnBlob(2);
101 DCHECK(blob);
102 data->ParseFromArray(blob, size);
103
104 std::string resource_url = statement->ColumnString(1);
105 DCHECK(resource_url == data->resource_url());
106
107 return true;
108 }
109
110 bool StepAndInitializeRedirectData(Statement* statement,
111 RedirectData* data,
112 std::string* primary_key) {
113 if (!statement->Step())
114 return false;
115
116 *primary_key = statement->ColumnString(0);
117 72
118 int size = statement->ColumnByteLength(1); 73 int size = statement->ColumnByteLength(1);
119 const void* blob = statement->ColumnBlob(1); 74 const void* blob = statement->ColumnBlob(1);
120 DCHECK(blob); 75 DCHECK(blob);
121 data->ParseFromArray(blob, size); 76 data->ParseFromArray(blob, size);
122 77
123 DCHECK(data->primary_key() == *primary_key);
124
125 return true; 78 return true;
126 } 79 }
127 80
128 } // namespace 81 } // namespace
129 82
130 namespace predictors { 83 namespace predictors {
131 84
132 // static 85 // static
133 void ResourcePrefetchPredictorTables::SortResources( 86 void ResourcePrefetchPredictorTables::TrimResources(
134 std::vector<ResourceData>* resources) { 87 PrefetchData* data,
135 std::sort(resources->begin(), resources->end(), 88 size_t max_consecutive_misses) {
89 auto new_end = std::remove_if(
90 data->mutable_resources()->begin(), data->mutable_resources()->end(),
91 [max_consecutive_misses](const ResourceData& x) {
92 return x.consecutive_misses() >= max_consecutive_misses;
93 });
94 data->mutable_resources()->erase(new_end, data->mutable_resources()->end());
95 }
96
97 // static
98 void ResourcePrefetchPredictorTables::SortResources(PrefetchData* data) {
99 std::sort(data->mutable_resources()->begin(),
100 data->mutable_resources()->end(),
136 [](const ResourceData& x, const ResourceData& y) { 101 [](const ResourceData& x, const ResourceData& y) {
137 return ComputeResourceScore(x) > ComputeResourceScore(y); 102 return ComputeResourceScore(x) > ComputeResourceScore(y);
138 }); 103 });
139 } 104 }
140 105
141 // static 106 // static
142 void ResourcePrefetchPredictorTables::SortRedirects( 107 void ResourcePrefetchPredictorTables::TrimRedirects(
143 std::vector<RedirectStat>* redirects) { 108 RedirectData* data,
144 std::sort(redirects->begin(), redirects->end(), 109 size_t max_consecutive_misses) {
110 auto new_end =
111 std::remove_if(data->mutable_redirect_endpoints()->begin(),
112 data->mutable_redirect_endpoints()->end(),
113 [max_consecutive_misses](const RedirectStat& x) {
114 return x.consecutive_misses() >= max_consecutive_misses;
115 });
116 data->mutable_redirect_endpoints()->erase(
117 new_end, data->mutable_redirect_endpoints()->end());
118 }
119
120 // static
121 void ResourcePrefetchPredictorTables::SortRedirects(RedirectData* data) {
122 std::sort(data->mutable_redirect_endpoints()->begin(),
123 data->mutable_redirect_endpoints()->end(),
145 [](const RedirectStat& x, const RedirectStat& y) { 124 [](const RedirectStat& x, const RedirectStat& y) {
146 return ComputeRedirectScore(x) > ComputeRedirectScore(y); 125 return ComputeRedirectScore(x) > ComputeRedirectScore(y);
147 }); 126 });
148 } 127 }
149 128
150 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData(
151 PrefetchKeyType i_key_type,
152 const std::string& i_primary_key)
153 : key_type(i_key_type),
154 primary_key(i_primary_key) {
155 }
156
157 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData(
158 const PrefetchData& other)
159 : key_type(other.key_type),
160 primary_key(other.primary_key),
161 last_visit(other.last_visit),
162 resources(other.resources) {
163 }
164
165 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() {
166 }
167
168 void ResourcePrefetchPredictorTables::GetAllData( 129 void ResourcePrefetchPredictorTables::GetAllData(
169 PrefetchDataMap* url_data_map, 130 PrefetchDataMap* url_data_map,
170 PrefetchDataMap* host_data_map, 131 PrefetchDataMap* host_data_map,
171 RedirectDataMap* url_redirect_data_map, 132 RedirectDataMap* url_redirect_data_map,
172 RedirectDataMap* host_redirect_data_map) { 133 RedirectDataMap* host_redirect_data_map) {
173 DCHECK_CURRENTLY_ON(BrowserThread::DB); 134 DCHECK_CURRENTLY_ON(BrowserThread::DB);
174 if (CantAccessDatabase()) 135 if (CantAccessDatabase())
175 return; 136 return;
176 137
177 DCHECK(url_data_map); 138 DCHECK(url_data_map);
178 DCHECK(host_data_map); 139 DCHECK(host_data_map);
179 DCHECK(url_redirect_data_map); 140 DCHECK(url_redirect_data_map);
180 DCHECK(host_redirect_data_map); 141 DCHECK(host_redirect_data_map);
181 url_data_map->clear(); 142 url_data_map->clear();
182 host_data_map->clear(); 143 host_data_map->clear();
183 url_redirect_data_map->clear(); 144 url_redirect_data_map->clear();
184 host_redirect_data_map->clear(); 145 host_redirect_data_map->clear();
185 146
186 std::vector<std::string> urls_to_delete, hosts_to_delete; 147 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map);
187 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, 148 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map);
188 &urls_to_delete);
189 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map,
190 &hosts_to_delete);
191 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map); 149 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map);
192 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map); 150 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map);
193
194 if (!urls_to_delete.empty() || !hosts_to_delete.empty())
195 DeleteResourceData(urls_to_delete, hosts_to_delete);
196 } 151 }
197 152
198 void ResourcePrefetchPredictorTables::UpdateData( 153 void ResourcePrefetchPredictorTables::UpdateData(
199 const PrefetchData& url_data, 154 const PrefetchData& url_data,
200 const PrefetchData& host_data, 155 const PrefetchData& host_data,
201 const RedirectData& url_redirect_data, 156 const RedirectData& url_redirect_data,
202 const RedirectData& host_redirect_data) { 157 const RedirectData& host_redirect_data) {
203 DCHECK_CURRENTLY_ON(BrowserThread::DB); 158 DCHECK_CURRENTLY_ON(BrowserThread::DB);
204 if (CantAccessDatabase()) 159 if (CantAccessDatabase())
205 return; 160 return;
206 161
207 DCHECK(!url_data.is_host() && host_data.is_host()); 162 DCHECK(url_data.has_primary_key() || host_data.has_primary_key() ||
208 DCHECK(!url_data.primary_key.empty() || !host_data.primary_key.empty() ||
209 url_redirect_data.has_primary_key() || 163 url_redirect_data.has_primary_key() ||
210 host_redirect_data.has_primary_key()); 164 host_redirect_data.has_primary_key());
211 165
212 DB()->BeginTransaction(); 166 DB()->BeginTransaction();
213 167
214 bool success = 168 bool success =
215 (url_data.primary_key.empty() || 169 (!url_data.has_primary_key() ||
216 UpdateResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data)) && 170 UpdateDataHelper(PREFETCH_KEY_TYPE_URL, PrefetchDataType::RESOURCE,
217 (host_data.primary_key.empty() || 171 url_data.primary_key(), url_data)) &&
218 UpdateResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data)) && 172 (!host_data.has_primary_key() ||
173 UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::RESOURCE,
174 host_data.primary_key(), host_data)) &&
219 (!url_redirect_data.has_primary_key() || 175 (!url_redirect_data.has_primary_key() ||
220 UpdateRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data)) && 176 UpdateDataHelper(PREFETCH_KEY_TYPE_URL, PrefetchDataType::REDIRECT,
177 url_redirect_data.primary_key(), url_redirect_data)) &&
221 (!host_redirect_data.has_primary_key() || 178 (!host_redirect_data.has_primary_key() ||
222 UpdateRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data)); 179 UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::REDIRECT,
180 host_redirect_data.primary_key(), host_redirect_data));
223 if (!success) 181 if (!success)
224 DB()->RollbackTransaction(); 182 DB()->RollbackTransaction();
225 else 183 else
226 DB()->CommitTransaction(); 184 DB()->CommitTransaction();
227 } 185 }
228 186
229 void ResourcePrefetchPredictorTables::DeleteResourceData( 187 void ResourcePrefetchPredictorTables::DeleteResourceData(
230 const std::vector<std::string>& urls, 188 const std::vector<std::string>& urls,
231 const std::vector<std::string>& hosts) { 189 const std::vector<std::string>& hosts) {
232 DCHECK_CURRENTLY_ON(BrowserThread::DB); 190 DCHECK_CURRENTLY_ON(BrowserThread::DB);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 const std::string& key, 228 const std::string& key,
271 PrefetchKeyType key_type) { 229 PrefetchKeyType key_type) {
272 DCHECK_CURRENTLY_ON(BrowserThread::DB); 230 DCHECK_CURRENTLY_ON(BrowserThread::DB);
273 if (CantAccessDatabase()) 231 if (CantAccessDatabase())
274 return; 232 return;
275 233
276 DeleteDataHelper(key_type, PrefetchDataType::REDIRECT, {key}); 234 DeleteDataHelper(key_type, PrefetchDataType::REDIRECT, {key});
277 } 235 }
278 236
279 void ResourcePrefetchPredictorTables::DeleteAllData() { 237 void ResourcePrefetchPredictorTables::DeleteAllData() {
238 DCHECK_CURRENTLY_ON(BrowserThread::DB);
280 if (CantAccessDatabase()) 239 if (CantAccessDatabase())
281 return; 240 return;
282 241
283 Statement deleter; 242 Statement deleter;
284 for (const char* table_name : 243 for (const char* table_name :
285 {kUrlResourceTableName, kUrlMetadataTableName, kUrlRedirectTableName, 244 {kUrlResourceTableName, kUrlRedirectTableName, kHostResourceTableName,
286 kHostResourceTableName, kHostMetadataTableName,
287 kHostRedirectTableName}) { 245 kHostRedirectTableName}) {
288 deleter.Assign(DB()->GetUniqueStatement( 246 deleter.Assign(DB()->GetUniqueStatement(
289 base::StringPrintf("DELETE FROM %s", table_name).c_str())); 247 base::StringPrintf("DELETE FROM %s", table_name).c_str()));
290 deleter.Run(); 248 deleter.Run();
291 } 249 }
292 } 250 }
293 251
294 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() 252 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables()
295 : PredictorTableBase() { 253 : PredictorTableBase() {}
296 }
297 254
298 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() { 255 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() {}
299 }
300 256
301 void ResourcePrefetchPredictorTables::GetAllResourceDataHelper( 257 void ResourcePrefetchPredictorTables::GetAllResourceDataHelper(
302 PrefetchKeyType key_type, 258 PrefetchKeyType key_type,
303 PrefetchDataMap* data_map, 259 PrefetchDataMap* data_map) {
304 std::vector<std::string>* to_delete) { 260 // Read the resources table and organize it per primary key.
305 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 261 const char* table_name = GetTableName(key_type, PrefetchDataType::RESOURCE);
262 Statement resource_reader(DB()->GetUniqueStatement(
263 base::StringPrintf("SELECT * FROM %s", table_name).c_str()));
306 264
307 // Read the resources table and organize it per primary key. 265 PrefetchData data;
308 const char* resource_table_name = is_host ? kHostResourceTableName : 266 std::string key;
309 kUrlResourceTableName; 267 while (StepAndInitializeProtoData(&resource_reader, &key, &data))
310 Statement resource_reader(DB()->GetUniqueStatement( 268 data_map->insert(std::make_pair(key, data));
Benoit L 2016/10/04 15:43:57 Can you re-introduce the DCHECK() you've removed f
alexilin 2016/10/04 17:25:46 Done.
311 base::StringPrintf("SELECT * FROM %s", resource_table_name).c_str()));
312 269
313 ResourceData resource; 270 // Sort each of the resource vectors by score.
314 std::string primary_key; 271 for (auto& kv : *data_map) {
315 while (StepAndInitializeResourceData(&resource_reader, &resource, 272 SortResources(&(kv.second));
316 &primary_key)) {
317 PrefetchDataMap::iterator it = data_map->find(primary_key);
318 if (it == data_map->end()) {
319 it = data_map->insert(std::make_pair(
320 primary_key, PrefetchData(key_type, primary_key))).first;
321 }
322 it->second.resources.push_back(resource);
323 }
324
325 // Sort each of the resource row vectors by score.
326 for (auto& kv : *data_map)
327 SortResources(&(kv.second.resources));
328
329 // Read the metadata and keep track of entries that have metadata, but no
330 // resource entries, so they can be deleted.
331 const char* metadata_table_name =
332 is_host ? kHostMetadataTableName : kUrlMetadataTableName;
333 Statement metadata_reader(DB()->GetUniqueStatement(
334 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str()));
335
336 while (metadata_reader.Step()) {
337 std::string primary_key = metadata_reader.ColumnString(0);
338
339 PrefetchDataMap::iterator it = data_map->find(primary_key);
340 if (it != data_map->end()) {
341 int64_t last_visit = metadata_reader.ColumnInt64(1);
342 it->second.last_visit = base::Time::FromInternalValue(last_visit);
343 } else {
344 to_delete->push_back(primary_key);
345 }
346 } 273 }
347 } 274 }
348 275
349 void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper( 276 void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper(
350 PrefetchKeyType key_type, 277 PrefetchKeyType key_type,
351 RedirectDataMap* redirect_map) { 278 RedirectDataMap* data_map) {
352 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 279 // Read the redirects table and organize it per primary key.
353 280 const char* table_name = GetTableName(key_type, PrefetchDataType::REDIRECT);
354 const char* redirect_table_name =
355 is_host ? kHostRedirectTableName : kUrlRedirectTableName;
356 Statement redirect_reader(DB()->GetUniqueStatement( 281 Statement redirect_reader(DB()->GetUniqueStatement(
357 base::StringPrintf("SELECT * FROM %s", redirect_table_name).c_str())); 282 base::StringPrintf("SELECT * FROM %s", table_name).c_str()));
358 283
359 RedirectData data; 284 RedirectData data;
360 std::string primary_key; 285 std::string key;
361 while (StepAndInitializeRedirectData(&redirect_reader, &data, &primary_key)) { 286 while (StepAndInitializeProtoData(&redirect_reader, &key, &data))
362 auto result = redirect_map->insert(std::make_pair(primary_key, data)); 287 data_map->insert(std::make_pair(key, data));
Benoit L 2016/10/04 15:43:57 ditto.
alexilin 2016/10/04 17:25:46 Done.
363 DCHECK(result.second); 288
289 // Sort each of the redirect vectors by score.
290 for (auto& kv : *data_map) {
291 SortRedirects(&(kv.second));
alexilin 2016/10/04 09:43:49 I had forgotten to sort redirects while reading. S
Benoit L 2016/10/04 15:43:57 Acknowledged.
364 } 292 }
365 } 293 }
366 294
367 bool ResourcePrefetchPredictorTables::UpdateResourceDataHelper( 295 bool ResourcePrefetchPredictorTables::UpdateDataHelper(
368 PrefetchKeyType key_type, 296 PrefetchKeyType key_type,
369 const PrefetchData& data) { 297 PrefetchDataType data_type,
370 DCHECK(!data.primary_key.empty()); 298 const std::string& key,
371 299 const MessageLite& data) {
372 if (!StringsAreSmallerThanDBLimit(data)) {
373 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true);
Benoit L 2016/10/04 15:43:57 You should also mark the histogram as deprecated i
alexilin 2016/10/04 17:25:46 Ok. Actually, it looks like this statement became
374 return false;
375 }
376
377 // Delete the older data from both the tables.
Benoit L 2016/10/04 15:43:57 Nice! No code is best code.
alexilin 2016/10/04 17:25:46 Done.
378 std::unique_ptr<Statement> deleter(GetTableUpdateStatement(
379 key_type, PrefetchDataType::RESOURCE, TableOperationType::REMOVE));
380 deleter->BindString(0, data.primary_key);
381 if (!deleter->Run())
382 return false;
383
384 deleter = GetTableUpdateStatement(key_type, PrefetchDataType::METADATA,
385 TableOperationType::REMOVE);
386 deleter->BindString(0, data.primary_key);
387 if (!deleter->Run())
388 return false;
389
390 // Add the new data to the tables.
391 for (const ResourceData& resource : data.resources) {
392 std::unique_ptr<Statement> resource_inserter(GetTableUpdateStatement(
393 key_type, PrefetchDataType::RESOURCE, TableOperationType::INSERT));
394 BindResourceDataToStatement(resource, data.primary_key,
395 resource_inserter.get());
396 if (!resource_inserter->Run())
397 return false;
398 }
399
400 std::unique_ptr<Statement> metadata_inserter(GetTableUpdateStatement(
401 key_type, PrefetchDataType::METADATA, TableOperationType::INSERT));
402 metadata_inserter->BindString(0, data.primary_key);
403 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue());
404 return metadata_inserter->Run();
405 }
406
407 bool ResourcePrefetchPredictorTables::UpdateRedirectDataHelper(
408 PrefetchKeyType key_type,
409 const RedirectData& data) {
410 DCHECK(data.has_primary_key());
411
412 if (!StringsAreSmallerThanDBLimit(data)) {
413 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true);
414 return false;
415 }
416
417 // Delete the older data from the table. 300 // Delete the older data from the table.
418 std::unique_ptr<Statement> deleter(GetTableUpdateStatement( 301 std::unique_ptr<Statement> deleter(
419 key_type, PrefetchDataType::REDIRECT, TableOperationType::REMOVE)); 302 GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE));
420 deleter->BindString(0, data.primary_key()); 303 deleter->BindString(0, key);
421 if (!deleter->Run()) 304 if (!deleter->Run())
422 return false; 305 return false;
423 306
424 // Add the new data to the table. 307 // Add the new data to the table.
425 std::unique_ptr<Statement> inserter(GetTableUpdateStatement( 308 std::unique_ptr<Statement> inserter(
426 key_type, PrefetchDataType::REDIRECT, TableOperationType::INSERT)); 309 GetTableUpdateStatement(key_type, data_type, TableOperationType::INSERT));
427 BindRedirectDataToStatement(data, inserter.get()); 310 BindProtoDataToStatement(key, data, inserter.get());
428 return inserter->Run(); 311 return inserter->Run();
429 } 312 }
430 313
431 void ResourcePrefetchPredictorTables::DeleteDataHelper( 314 void ResourcePrefetchPredictorTables::DeleteDataHelper(
432 PrefetchKeyType key_type, 315 PrefetchKeyType key_type,
433 PrefetchDataType data_type, 316 PrefetchDataType data_type,
434 const std::vector<std::string>& keys) { 317 const std::vector<std::string>& keys) {
435 bool is_resource = data_type == PrefetchDataType::RESOURCE;
436
437 for (const std::string& key : keys) { 318 for (const std::string& key : keys) {
438 std::unique_ptr<Statement> deleter(GetTableUpdateStatement( 319 std::unique_ptr<Statement> deleter(GetTableUpdateStatement(
439 key_type, data_type, TableOperationType::REMOVE)); 320 key_type, data_type, TableOperationType::REMOVE));
440 deleter->BindString(0, key); 321 deleter->BindString(0, key);
441 deleter->Run(); 322 deleter->Run();
442
443 if (is_resource) {
444 // Delete corresponding resource metadata as well.
445 deleter = GetTableUpdateStatement(key_type, PrefetchDataType::METADATA,
446 TableOperationType::REMOVE);
447 deleter->BindString(0, key);
448 deleter->Run();
449 }
450 } 323 }
451 } 324 }
452 325
453 // static 326 // static
454 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit(
455 const PrefetchData& data) {
456 if (data.primary_key.length() > kMaxStringLength)
457 return false;
458
459 for (const ResourceData& resource : data.resources) {
460 if (resource.resource_url().length() > kMaxStringLength)
461 return false;
462 }
463 return true;
464 }
465
466 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit(
467 const RedirectData& data) {
468 if (data.primary_key().length() > kMaxStringLength)
469 return false;
470
471 for (const RedirectStat& redirect : data.redirect_endpoints()) {
472 if (redirect.url().length() > kMaxStringLength)
473 return false;
474 }
475 return true;
476 }
477
478 // static
479 float ResourcePrefetchPredictorTables::ComputeResourceScore( 327 float ResourcePrefetchPredictorTables::ComputeResourceScore(
480 const ResourceData& data) { 328 const ResourceData& data) {
481 // The score is calculated so that when the rows are sorted, stylesheets, 329 // The score is calculated so that when the rows are sorted, stylesheets,
482 // scripts and fonts appear first, sorted by position(ascending) and then the 330 // scripts and fonts appear first, sorted by position(ascending) and then the
483 // rest of the resources sorted by position (ascending). 331 // rest of the resources sorted by position (ascending).
484 static const int kMaxResourcesPerType = 100; 332 static const int kMaxResourcesPerType = 100;
485 switch (data.resource_type()) { 333 switch (data.resource_type()) {
486 case ResourceData::RESOURCE_TYPE_STYLESHEET: 334 case ResourceData::RESOURCE_TYPE_STYLESHEET:
487 case ResourceData::RESOURCE_TYPE_SCRIPT: 335 case ResourceData::RESOURCE_TYPE_SCRIPT:
488 case ResourceData::RESOURCE_TYPE_FONT_RESOURCE: 336 case ResourceData::RESOURCE_TYPE_FONT_RESOURCE:
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 if (CantAccessDatabase()) 412 if (CantAccessDatabase())
565 return; 413 return;
566 414
567 // Database initialization is all-or-nothing. 415 // Database initialization is all-or-nothing.
568 sql::Connection* db = DB(); 416 sql::Connection* db = DB();
569 sql::Transaction transaction{db}; 417 sql::Transaction transaction{db};
570 bool success = transaction.Begin(); 418 bool success = transaction.Begin();
571 419
572 success = success && DropTablesIfOutdated(db); 420 success = success && DropTablesIfOutdated(db);
573 421
574 success = 422 for (const char* table_name :
575 success && 423 {kUrlResourceTableName, kHostResourceTableName, kUrlRedirectTableName,
576 (db->DoesTableExist(kUrlResourceTableName) || 424 kHostRedirectTableName}) {
577 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, 425 success = success &&
578 kUrlResourceTableName) 426 (db->DoesTableExist(table_name) ||
579 .c_str())) && 427 db->Execute(base::StringPrintf(
580 (db->DoesTableExist(kUrlMetadataTableName) || 428 kCreateProtoTableStatementTemplate, table_name)
581 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, 429 .c_str()));
582 kUrlMetadataTableName) 430 }
583 .c_str())) &&
584 (db->DoesTableExist(kUrlRedirectTableName) ||
585 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate,
586 kUrlRedirectTableName)
587 .c_str())) &&
588 (db->DoesTableExist(kHostResourceTableName) ||
589 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate,
590 kHostResourceTableName)
591 .c_str())) &&
592 (db->DoesTableExist(kHostMetadataTableName) ||
593 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate,
594 kHostMetadataTableName)
595 .c_str())) &&
596 (db->DoesTableExist(kHostRedirectTableName) ||
597 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate,
598 kHostRedirectTableName)
599 .c_str()));
600 431
601 if (success) 432 if (success)
602 success = transaction.Commit(); 433 success = transaction.Commit();
603 else 434 else
604 transaction.Rollback(); 435 transaction.Rollback();
605 436
606 if (!success) 437 if (!success)
607 ResetDB(); 438 ResetDB();
608 } 439 }
609 440
(...skipping 16 matching lines...) Expand all
626 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount", 457 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount",
627 statement.ColumnInt(0)); 458 statement.ColumnInt(0));
628 } 459 }
629 460
630 std::unique_ptr<Statement> 461 std::unique_ptr<Statement>
631 ResourcePrefetchPredictorTables::GetTableUpdateStatement( 462 ResourcePrefetchPredictorTables::GetTableUpdateStatement(
632 PrefetchKeyType key_type, 463 PrefetchKeyType key_type,
633 PrefetchDataType data_type, 464 PrefetchDataType data_type,
634 TableOperationType op_type) { 465 TableOperationType op_type) {
635 sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) | 466 sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) |
636 (static_cast<int>(op_type) << 3)); 467 (static_cast<int>(op_type) << 2));
637 const char* statement_template = 468 const char* statement_template = (op_type == TableOperationType::REMOVE
638 GetTableUpdateStatementTemplate(op_type, data_type); 469 ? kDeleteProtoTableStatementTemplate
639 const char* table_name = 470 : kInsertProtoTableStatementTemplate);
640 GetTableUpdateStatementTableName(key_type, data_type); 471 const char* table_name = GetTableName(key_type, data_type);
641 return base::MakeUnique<Statement>(DB()->GetCachedStatement( 472 return base::MakeUnique<Statement>(DB()->GetCachedStatement(
642 id, base::StringPrintf(statement_template, table_name).c_str())); 473 id, base::StringPrintf(statement_template, table_name).c_str()));
643 } 474 }
644 475
645 // static 476 // static
646 const char* ResourcePrefetchPredictorTables::GetTableUpdateStatementTemplate( 477 const char* ResourcePrefetchPredictorTables::GetTableName(
647 TableOperationType op_type,
648 PrefetchDataType data_type) {
649 switch (op_type) {
650 case TableOperationType::REMOVE:
651 return kDeleteStatementTemplate;
652 case TableOperationType::INSERT:
653 switch (data_type) {
654 case PrefetchDataType::RESOURCE:
655 return kInsertResourceTableStatementTemplate;
656 case PrefetchDataType::REDIRECT:
657 return kInsertRedirectTableStatementTemplate;
658 case PrefetchDataType::METADATA:
659 return kInsertMetadataTableStatementTemplate;
660 }
661 }
662
663 NOTREACHED();
664 return nullptr;
665 }
666
667 // static
668 const char* ResourcePrefetchPredictorTables::GetTableUpdateStatementTableName(
669 PrefetchKeyType key_type, 478 PrefetchKeyType key_type,
670 PrefetchDataType data_type) { 479 PrefetchDataType data_type) {
671 DCHECK(key_type == PREFETCH_KEY_TYPE_URL ||
672 key_type == PREFETCH_KEY_TYPE_HOST);
673 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 480 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
674 switch (data_type) { 481 switch (data_type) {
675 case PrefetchDataType::RESOURCE: 482 case PrefetchDataType::RESOURCE:
676 return is_host ? kHostResourceTableName : kUrlResourceTableName; 483 return is_host ? kHostResourceTableName : kUrlResourceTableName;
677 case PrefetchDataType::REDIRECT: 484 case PrefetchDataType::REDIRECT:
678 return is_host ? kHostRedirectTableName : kUrlRedirectTableName; 485 return is_host ? kHostRedirectTableName : kUrlRedirectTableName;
679 case PrefetchDataType::METADATA:
680 return is_host ? kHostMetadataTableName : kUrlMetadataTableName;
681 } 486 }
682 487
683 NOTREACHED(); 488 NOTREACHED();
684 return nullptr; 489 return nullptr;
685 } 490 }
686 491
687 } // namespace predictors 492 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698