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 COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_INDEX_H_ 6 #define COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_INDEX_H_ 7 8 #include <map> 9 #include <set> 10 #include <string> 11 #include <vector> 12 13 #include "base/basictypes.h" 14 #include "base/strings/string16.h" 15 #include "components/query_parser/query_parser.h" 16 17 class BookmarkNode; 18 19 namespace bookmarks { 20 21 class BookmarkClient; 22 struct BookmarkMatch; 23 24 // BookmarkIndex maintains an index of the titles and URLs of bookmarks for 25 // quick look up. BookmarkIndex is owned and maintained by BookmarkModel, you 26 // shouldn't need to interact directly with BookmarkIndex. 27 // 28 // BookmarkIndex maintains the index (index_) as a map of sets. The map (type 29 // Index) maps from a lower case string to the set (type NodeSet) of 30 // BookmarkNodes that contain that string in their title or URL. 31 class BookmarkIndex { 32 public: 33 // |languages| is used to help parse IDNs in URLs for the bookmark index. 34 BookmarkIndex(BookmarkClient* client, 35 const std::string& languages); 36 ~BookmarkIndex(); 37 38 // Invoked when a bookmark has been added to the model. 39 void Add(const BookmarkNode* node); 40 41 // Invoked when a bookmark has been removed from the model. 42 void Remove(const BookmarkNode* node); 43 44 // Returns up to |max_count| of bookmarks containing each term from 45 // the text |query| in either the title or the URL. 46 void GetBookmarksMatching( 47 const base::string16& query, 48 size_t max_count, 49 std::vector<BookmarkMatch>* results); 50 51 private: 52 typedef std::vector<const BookmarkNode*> Nodes; 53 typedef std::set<const BookmarkNode*> NodeSet; 54 typedef std::map<base::string16, NodeSet> Index; 55 56 struct Match; 57 typedef std::vector<Match> Matches; 58 59 // Extracts |matches.nodes| into Nodes, sorts the pairs in decreasing order of 60 // typed count (if supported by the client), and then de-dupes the matches. 61 void SortMatches(const Matches& matches, Nodes* sorted_nodes) const; 62 63 // Add |node| to |results| if the node matches the query. 64 void AddMatchToResults( 65 const BookmarkNode* node, 66 query_parser::QueryParser* parser, 67 const query_parser::QueryNodeStarVector& query_nodes, 68 std::vector<BookmarkMatch>* results); 69 70 // Populates |matches| for the specified term. If |first_term| is true, this 71 // is the first term in the query. Returns true if there is at least one node 72 // matching the term. 73 bool GetBookmarksMatchingTerm(const base::string16& term, 74 bool first_term, 75 Matches* matches); 76 77 // Iterates over |matches| updating each Match's nodes to contain the 78 // intersection of the Match's current nodes and the nodes at |index_i|. 79 // If the intersection is empty, the Match is removed. 80 // 81 // This is invoked from GetBookmarksMatchingTerm. 82 void CombineMatchesInPlace(const Index::const_iterator& index_i, 83 Matches* matches); 84 85 // Iterates over |current_matches| calculating the intersection between the 86 // Match's nodes and the nodes at |index_i|. If the intersection between the 87 // two is non-empty, a new match is added to |result|. 88 // 89 // This differs from CombineMatchesInPlace in that if the intersection is 90 // non-empty the result is added to result, not combined in place. This 91 // variant is used for prefix matching. 92 // 93 // This is invoked from GetBookmarksMatchingTerm. 94 void CombineMatches(const Index::const_iterator& index_i, 95 const Matches& current_matches, 96 Matches* result); 97 98 // Returns the set of query words from |query|. 99 std::vector<base::string16> ExtractQueryWords(const base::string16& query); 100 101 // Adds |node| to |index_|. 102 void RegisterNode(const base::string16& term, const BookmarkNode* node); 103 104 // Removes |node| from |index_|. 105 void UnregisterNode(const base::string16& term, const BookmarkNode* node); 106 107 Index index_; 108 109 BookmarkClient* const client_; 110 111 // Languages used to help parse IDNs in URLs for the bookmark index. 112 const std::string languages_; 113 114 DISALLOW_COPY_AND_ASSIGN(BookmarkIndex); 115 }; 116 117 } // namespace bookmarks 118 119 #endif // COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_INDEX_H_ 120