blob: f6df5980d2e8a592f297c5bd71971f697f625d60 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_BOOKMARKS_BROWSER_TITLED_URL_INDEX_H_
#define COMPONENTS_BOOKMARKS_BROWSER_TITLED_URL_INDEX_H_
#include <stddef.h>
#include <map>
#include <string>
#include <vector>
#include "base/containers/flat_set.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "components/query_parser/query_parser.h"
namespace bookmarks {
class TitledUrlNode;
class TitledUrlNodeSorter;
struct TitledUrlMatch;
// TitledUrlIndex maintains an index of paired titles and URLs for quick lookup.
//
// TitledUrlIndex maintains the index (index_) as a map of sets. The map (type
// Index) maps from a lower case string to the set (type TitledUrlNodeSet) of
// TitledUrlNodes that contain that string in their title or URL.
class TitledUrlIndex {
public:
// Constructs a TitledUrlIndex. |sorter| is used to construct a sorted list
// of matches when matches are returned from the index. If null, matches are
// returned unsorted.
TitledUrlIndex(std::unique_ptr<TitledUrlNodeSorter> sorter);
~TitledUrlIndex();
// Invoked when a title/URL pair has been added to the model.
void Add(const TitledUrlNode* node);
// Invoked when a title/URL pair has been removed from the model.
void Remove(const TitledUrlNode* node);
// Returns up to |max_count| of matches containing each term from the text
// |query| in either the title or the URL.
void GetResultsMatching(const base::string16& query,
size_t max_count,
query_parser::MatchingAlgorithm matching_algorithm,
std::vector<TitledUrlMatch>* results);
private:
using TitledUrlNodes = std::vector<const TitledUrlNode*>;
using TitledUrlNodeSet = base::flat_set<const TitledUrlNode*>;
using Index = std::map<base::string16, TitledUrlNodeSet>;
// Constructs |sorted_nodes| by copying the matches in |matches| and sorting
// them.
void SortMatches(const TitledUrlNodeSet& matches,
TitledUrlNodes* sorted_nodes) const;
// Add |node| to |results| if the node matches the query.
void AddMatchToResults(const TitledUrlNode* node,
query_parser::QueryParser* parser,
const query_parser::QueryNodeVector& query_nodes,
std::vector<TitledUrlMatch>* results);
// Populates |matches| for the specified term. If |first_term| is true, this
// is the first term in the query. Returns true if there is at least one node
// matching the term.
bool GetResultsMatchingTerm(
const base::string16& term,
bool first_term,
query_parser::MatchingAlgorithm matching_algorithm,
TitledUrlNodeSet* matches);
// Returns the set of query words from |query|.
std::vector<base::string16> ExtractQueryWords(const base::string16& query);
// Adds |node| to |index_|.
void RegisterNode(const base::string16& term, const TitledUrlNode* node);
// Removes |node| from |index_|.
void UnregisterNode(const base::string16& term, const TitledUrlNode* node);
Index index_;
std::unique_ptr<TitledUrlNodeSorter> sorter_;
DISALLOW_COPY_AND_ASSIGN(TitledUrlIndex);
};
} // namespace bookmarks
#endif // COMPONENTS_BOOKMARKS_BROWSER_TITLED_URL_INDEX_H_