15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TABLES_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TABLES_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/predictors/predictor_table_base.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/predictors/resource_prefetch_common.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "webkit/common/resource_type.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace sql { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Statement; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace predictors { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Interface for database tables used by the ResourcePrefetchPredictor. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All methods except the constructor and destructor need to be called on the DB 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Currently manages: 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - UrlResourceTable - resources per Urls. 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - UrlMetadataTable - misc data for Urls (like last visit time). 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - HostResourceTable - resources per host. 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - HostMetadataTable - misc data for hosts. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourcePrefetchPredictorTables : public PredictorTableBase { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used in the UrlResourceTable and HostResourceTable to store resources 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // required for the page or host. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct ResourceRow { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceRow(); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceRow(const ResourceRow& other); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceRow(const std::string& main_frame_url, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& resource_url, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceType::Type resource_type, 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int number_of_hits, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int number_of_misses, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int consecutive_misses, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double average_position); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateScore(); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool operator==(const ResourceRow& rhs) const; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Stores the host for host based data, main frame Url for the Url based 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // data. This field is cleared for efficiency reasons and the code outside 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this class should not assume it is set. 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string primary_key; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL resource_url; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::Type resource_type; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_hits; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_misses; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int consecutive_misses; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double average_position; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not stored. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float score; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::vector<ResourceRow> ResourceRows; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sorts the ResourceRows by score, descending. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct ResourceRowSorter { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool operator()(const ResourceRow& x, const ResourceRow& y) const; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Aggregated data for a Url or Host. Although the data differs slightly, we 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // store them in the same structure, because most of the fields are common and 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it allows us to use the same functions. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct PrefetchData { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefetchData(PrefetchKeyType key_type, const std::string& primary_key); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefetchData(const PrefetchData& other); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~PrefetchData(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool operator==(const PrefetchData& rhs) const; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_host() const { return key_type == PREFETCH_KEY_TYPE_HOST; } 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Is the data a host as opposed to a Url? 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefetchKeyType key_type; // Not const to be able to assign. 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string primary_key; // is_host() ? main frame url : host. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_visit; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceRows resources; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Map from primary key to PrefetchData for the key. 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<std::string, PrefetchData> PrefetchDataMap; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns data for all Urls and Hosts. 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void GetAllData(PrefetchDataMap* url_data_map, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefetchDataMap* host_data_map); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Updates data for a Url and a host. If either of the |url_data| or 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |host_data| has an empty primary key, it will be ignored. 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that the Urls and primary key in |url_data| and |host_data| should be 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // less than |kMaxStringLength| in length. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateData(const PrefetchData& url_data, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PrefetchData& host_data); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete data for the input |urls| and |hosts|. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DeleteData(const std::vector<std::string>& urls, 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& hosts); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wrapper over DeleteData for convenience. 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DeleteSingleDataPoint(const std::string& key, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefetchKeyType key_type); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Deletes all data in all the tables. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DeleteAllData(); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The maximum length of the string that can be stored in the DB. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const size_t kMaxStringLength; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class PredictorDatabaseInternal; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class MockResourcePrefetchPredictorTables; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourcePrefetchPredictorTables(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ResourcePrefetchPredictorTables(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helper functions below help perform functions on the Url and host table 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // using the same code. 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetAllDataHelper(PrefetchKeyType key_type, 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefetchDataMap* data_map, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string>* to_delete); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool UpdateDataHelper(const PrefetchData& data); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DeleteDataHelper(PrefetchKeyType key_type, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& keys); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if the strings in the |data| are less than |kMaxStringLength| 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in length. 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool StringsAreSmallerThanDBLimit(const PrefetchData& data) const; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PredictorTableBase methods. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CreateTableIfNonExistent() OVERRIDE; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void LogDatabaseStats() OVERRIDE; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helpers to return Statements for cached Statements. The caller must take 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ownership of the return Statements. 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sql::Statement* GetUrlResourceDeleteStatement(); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sql::Statement* GetUrlResourceUpdateStatement(); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sql::Statement* GetUrlMetadataDeleteStatement(); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sql::Statement* GetUrlMetadataUpdateStatement(); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sql::Statement* GetHostResourceDeleteStatement(); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sql::Statement* GetHostResourceUpdateStatement(); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sql::Statement* GetHostMetadataDeleteStatement(); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sql::Statement* GetHostMetadataUpdateStatement(); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ResourcePrefetchPredictorTables); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace predictors 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TABLES_H_ 161