Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / predictors / resource_prefetch_predictor_tables.h
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
19 namespace sql {
20 class Statement;
21 }
22
23 namespace 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.
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;
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   ~ResourcePrefetchPredictorTables() override;
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   void CreateTableIfNonExistent() override;
141   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_