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