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