Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(282)

Side by Side Diff: components/query_parser/query_parser.h

Issue 703553002: Allow systematic prefix search in bookmarks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressed comments at https://codereview.chromium.org/701553002/ Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef COMPONENTS_QUERY_PARSER_QUERY_PARSER_H_ 5 #ifndef COMPONENTS_QUERY_PARSER_QUERY_PARSER_H_
6 #define COMPONENTS_QUERY_PARSER_QUERY_PARSER_H_ 6 #define COMPONENTS_QUERY_PARSER_QUERY_PARSER_H_
7 7
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
11 #include "base/strings/string16.h" 11 #include "base/strings/string16.h"
12 #include "components/query_parser/snippet.h" 12 #include "components/query_parser/snippet.h"
13 13
14 namespace query_parser { 14 namespace query_parser {
15 15
16 class QueryNodeList; 16 class QueryNodeList;
17 17
18 // Used by HasMatchIn. 18 // Used by HasMatchIn.
19 struct QueryWord { 19 struct QueryWord {
20 // The work to match against. 20 // The work to match against.
21 base::string16 word; 21 base::string16 word;
22 22
23 // The starting position of the word in the original text. 23 // The starting position of the word in the original text.
24 size_t position; 24 size_t position;
25 }; 25 };
26 26
27 enum class MatchingAlgorithm {
28 // Only words long enough are considered for prefix search. Shorter words are
29 // considered for exact matches.
30 DEFAULT,
31 // All words are considered for a prefix search.
32 ALWAYS_PREFIX_SEARCH,
33 };
34
27 typedef std::vector<query_parser::QueryWord> QueryWordVector; 35 typedef std::vector<query_parser::QueryWord> QueryWordVector;
28 36
29 // QueryNode is used by QueryParser to represent the elements that constitute a 37 // QueryNode is used by QueryParser to represent the elements that constitute a
30 // query. While QueryNode is exposed by way of ParseQuery, it really isn't meant 38 // query. While QueryNode is exposed by way of ParseQuery, it really isn't meant
31 // for external usage. 39 // for external usage.
32 class QueryNode { 40 class QueryNode {
33 public: 41 public:
34 virtual ~QueryNode() {} 42 virtual ~QueryNode() {}
35 43
36 // Serialize ourselves out to a string that can be passed to SQLite. Returns 44 // Serialize ourselves out to a string that can be passed to SQLite. Returns
(...skipping 28 matching lines...) Expand all
65 public: 73 public:
66 QueryParser(); 74 QueryParser();
67 75
68 // For CJK ideographs and Korean Hangul, even a single character 76 // For CJK ideographs and Korean Hangul, even a single character
69 // can be useful in prefix matching, but that may give us too many 77 // can be useful in prefix matching, but that may give us too many
70 // false positives. Moreover, the current ICU word breaker gives us 78 // false positives. Moreover, the current ICU word breaker gives us
71 // back every single Chinese character as a word so that there's no 79 // back every single Chinese character as a word so that there's no
72 // point doing anything for them and we only adjust the minimum length 80 // point doing anything for them and we only adjust the minimum length
73 // to 2 for Korean Hangul while using 3 for others. This is a temporary 81 // to 2 for Korean Hangul while using 3 for others. This is a temporary
74 // hack until we have a segmentation support. 82 // hack until we have a segmentation support.
75 static bool IsWordLongEnoughForPrefixSearch(const base::string16& word); 83 static bool IsWordLongEnoughForPrefixSearch(
84 const base::string16& word,
85 const MatchingAlgorithm matching_algorithm);
76 86
77 // Parse a query into a SQLite query. The resulting query is placed in 87 // Parse a query into a SQLite query. The resulting query is placed in
78 // |sqlite_query| and the number of words is returned. 88 // |sqlite_query| and the number of words is returned.
79 int ParseQuery(const base::string16& query, base::string16* sqlite_query); 89 int ParseQuery(const base::string16& query,
90 const MatchingAlgorithm matching_algorithm,
91 base::string16* sqlite_query);
80 92
81 // Parses |query|, returning the words that make up it. Any words in quotes 93 // Parses |query|, returning the words that make up it. Any words in quotes
82 // are put in |words| without the quotes. For example, the query text 94 // are put in |words| without the quotes. For example, the query text
83 // "foo bar" results in two entries being added to words, one for foo and one 95 // "foo bar" results in two entries being added to words, one for foo and one
84 // for bar. 96 // for bar.
85 void ParseQueryWords(const base::string16& query, 97 void ParseQueryWords(const base::string16& query,
98 const MatchingAlgorithm matching_algorithm,
86 std::vector<base::string16>* words); 99 std::vector<base::string16>* words);
87 100
88 // Parses |query|, returning the nodes that constitute the valid words in the 101 // Parses |query|, returning the nodes that constitute the valid words in the
89 // query. This is intended for later usage with DoesQueryMatch. Ownership of 102 // query. This is intended for later usage with DoesQueryMatch. Ownership of
90 // the nodes passes to the caller. 103 // the nodes passes to the caller.
91 void ParseQueryNodes(const base::string16& query, 104 void ParseQueryNodes(const base::string16& query,
105 const MatchingAlgorithm matching_algorithm,
92 QueryNodeStarVector* nodes); 106 QueryNodeStarVector* nodes);
93 107
94 // Returns true if the string text matches the query nodes created by a call 108 // Returns true if the string text matches the query nodes created by a call
95 // to ParseQuery. If the query does match, each of the matching positions in 109 // to ParseQuery. If the query does match, each of the matching positions in
96 // the text is added to |match_positions|. 110 // the text is added to |match_positions|.
97 bool DoesQueryMatch(const base::string16& text, 111 bool DoesQueryMatch(const base::string16& text,
98 const QueryNodeStarVector& nodes, 112 const QueryNodeStarVector& nodes,
99 Snippet::MatchPositions* match_positions); 113 Snippet::MatchPositions* match_positions);
100 114
101 // Returns true if all of the |words| match the query |nodes| created by a 115 // Returns true if all of the |words| match the query |nodes| created by a
102 // call to ParseQuery. 116 // call to ParseQuery.
103 bool DoesQueryMatch(const QueryWordVector& words, 117 bool DoesQueryMatch(const QueryWordVector& words,
104 const QueryNodeStarVector& nodes); 118 const QueryNodeStarVector& nodes);
105 119
106 // Extracts the words from |text|, placing each word into |words|. 120 // Extracts the words from |text|, placing each word into |words|.
107 void ExtractQueryWords(const base::string16& text, 121 void ExtractQueryWords(const base::string16& text,
108 QueryWordVector* words); 122 QueryWordVector* words);
109 123
110 // Sorts the match positions in |matches| by their first index, then 124 // Sorts the match positions in |matches| by their first index, then
111 // coalesces any match positions that intersect each other. 125 // coalesces any match positions that intersect each other.
112 static void SortAndCoalesceMatchPositions(Snippet::MatchPositions* matches); 126 static void SortAndCoalesceMatchPositions(Snippet::MatchPositions* matches);
113 127
114 private: 128 private:
115 // Does the work of parsing |query|; creates nodes in |root| as appropriate. 129 // Does the work of parsing |query|; creates nodes in |root| as appropriate.
116 // This is invoked from both of the ParseQuery methods. 130 // This is invoked from both of the ParseQuery methods.
117 bool ParseQueryImpl(const base::string16& query, QueryNodeList* root); 131 bool ParseQueryImpl(const base::string16& query,
132 const MatchingAlgorithm matching_algorithm,
sky 2014/11/04 03:32:05 Are we really using const for these? Isn't the enu
Kibeom Kim (inactive) 2014/11/04 08:38:31 Done.
133 QueryNodeList* root);
118 134
119 DISALLOW_COPY_AND_ASSIGN(QueryParser); 135 DISALLOW_COPY_AND_ASSIGN(QueryParser);
120 }; 136 };
121 137
122 } // namespace query_parser 138 } // namespace query_parser
123 139
124 #endif // COMPONENTS_QUERY_PARSER_QUERY_PARSER_H_ 140 #endif // COMPONENTS_QUERY_PARSER_QUERY_PARSER_H_
OLDNEW
« no previous file with comments | « components/history/core/browser/url_database.cc ('k') | components/query_parser/query_parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698