1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// Copyright 2014 The Chromium Authors. All rights reserved. 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be 3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// found in the LICENSE file. 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TABLES_H_ 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TABLES_H_ 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <map> 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string> 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <vector> 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "base/time/time.h" 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "chrome/browser/predictors/predictor_table_base.h" 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "chrome/browser/predictors/resource_prefetch_common.h" 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "content/public/common/resource_type.h" 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "url/gurl.h" 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectnamespace sql { 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectclass Statement; 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectnamespace predictors { 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// Interface for database tables used by the ResourcePrefetchPredictor. 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// All methods except the constructor and destructor need to be called on the DB 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// thread. 28a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu// 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// Currently manages: 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// - UrlResourceTable - resources per Urls. 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// - UrlMetadataTable - misc data for Urls (like last visit time). 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// - HostResourceTable - resources per host. 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// - HostMetadataTable - misc data for hosts. 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectclass ResourcePrefetchPredictorTables : public PredictorTableBase { 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project public: 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Used in the UrlResourceTable and HostResourceTable to store resources 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // required for the page or host. 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project struct ResourceRow { 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ResourceRow(); 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ResourceRow(const ResourceRow& other); 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ResourceRow(const std::string& main_frame_url, 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project const std::string& resource_url, 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project content::ResourceType resource_type, 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project int number_of_hits, 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project int number_of_misses, 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project int consecutive_misses, 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project double average_position); 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void UpdateScore(); 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bool operator==(const ResourceRow& rhs) const; 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Stores the host for host based data, main frame Url for the Url based 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // data. This field is cleared for efficiency reasons and the code outside 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // this class should not assume it is set. 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project std::string primary_key; 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 56d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu GURL resource_url; 57d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu content::ResourceType resource_type; 58d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu size_t number_of_hits; 59d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu size_t number_of_misses; 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project size_t consecutive_misses; 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project double average_position; 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Not stored. 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project float score; 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project }; 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project typedef std::vector<ResourceRow> ResourceRows; 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Sorts the ResourceRows by score, descending. 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project struct ResourceRowSorter { 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bool operator()(const ResourceRow& x, const ResourceRow& y) const; 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project }; 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 73a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu // Aggregated data for a Url or Host. Although the data differs slightly, we 74a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu // store them in the same structure, because most of the fields are common and 75a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu // it allows us to use the same functions. 76a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu struct PrefetchData { 77a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu PrefetchData(PrefetchKeyType key_type, const std::string& primary_key); 78a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu PrefetchData(const PrefetchData& other); 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ~PrefetchData(); 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 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