| Index: components/query_parser/query_parser.cc
|
| diff --git a/components/query_parser/query_parser.cc b/components/query_parser/query_parser.cc
|
| index b9ac349ebded8e1b4c40250dde1c214cee0ee0da..d09edff867a17aa37b34ff2877a7ab51119bfd67 100644
|
| --- a/components/query_parser/query_parser.cc
|
| +++ b/components/query_parser/query_parser.cc
|
| @@ -46,16 +46,6 @@ void CoalesceMatchesFrom(size_t index, Snippet::MatchPositions* matches) {
|
| }
|
| }
|
|
|
| -// Sorts the match positions in |matches| by their first index, then coalesces
|
| -// any match positions that intersect each other.
|
| -void CoalseAndSortMatchPositions(Snippet::MatchPositions* matches) {
|
| - std::sort(matches->begin(), matches->end(), &CompareMatchPosition);
|
| - // WARNING: we don't use iterator here as CoalesceMatchesFrom may remove
|
| - // from matches.
|
| - for (size_t i = 0; i < matches->size(); ++i)
|
| - CoalesceMatchesFrom(i, matches);
|
| -}
|
| -
|
| // Returns true if the character is considered a quote.
|
| bool IsQueryQuote(wchar_t ch) {
|
| return ch == '"' ||
|
| @@ -88,10 +78,10 @@ class QueryNodeWord : public QueryNode {
|
| virtual bool IsWord() const OVERRIDE;
|
| virtual bool Matches(const base::string16& word, bool exact) const OVERRIDE;
|
| virtual bool HasMatchIn(
|
| - const std::vector<QueryWord>& words,
|
| + const QueryWordVector& words,
|
| Snippet::MatchPositions* match_positions) const OVERRIDE;
|
| virtual bool HasMatchIn(
|
| - const std::vector<QueryWord>& words) const OVERRIDE;
|
| + const QueryWordVector& words) const OVERRIDE;
|
| virtual void AppendWords(std::vector<base::string16>* words) const OVERRIDE;
|
|
|
| private:
|
| @@ -127,7 +117,7 @@ bool QueryNodeWord::Matches(const base::string16& word, bool exact) const {
|
| (word_.compare(0, word_.size(), word, 0, word_.size()) == 0);
|
| }
|
|
|
| -bool QueryNodeWord::HasMatchIn(const std::vector<QueryWord>& words,
|
| +bool QueryNodeWord::HasMatchIn(const QueryWordVector& words,
|
| Snippet::MatchPositions* match_positions) const {
|
| bool matched = false;
|
| for (size_t i = 0; i < words.size(); ++i) {
|
| @@ -142,7 +132,7 @@ bool QueryNodeWord::HasMatchIn(const std::vector<QueryWord>& words,
|
| return matched;
|
| }
|
|
|
| -bool QueryNodeWord::HasMatchIn(const std::vector<QueryWord>& words) const {
|
| +bool QueryNodeWord::HasMatchIn(const QueryWordVector& words) const {
|
| for (size_t i = 0; i < words.size(); ++i) {
|
| if (Matches(words[i].word, false))
|
| return true;
|
| @@ -157,12 +147,10 @@ void QueryNodeWord::AppendWords(std::vector<base::string16>* words) const {
|
| // A QueryNodeList has a collection of QueryNodes which are deleted in the end.
|
| class QueryNodeList : public QueryNode {
|
| public:
|
| - typedef std::vector<QueryNode*> QueryNodeVector;
|
| -
|
| QueryNodeList();
|
| virtual ~QueryNodeList();
|
|
|
| - QueryNodeVector* children() { return &children_; }
|
| + QueryNodeStarVector* children() { return &children_; }
|
|
|
| void AddChild(QueryNode* node);
|
|
|
| @@ -174,16 +162,15 @@ class QueryNodeList : public QueryNode {
|
| virtual bool IsWord() const OVERRIDE;
|
| virtual bool Matches(const base::string16& word, bool exact) const OVERRIDE;
|
| virtual bool HasMatchIn(
|
| - const std::vector<QueryWord>& words,
|
| + const QueryWordVector& words,
|
| Snippet::MatchPositions* match_positions) const OVERRIDE;
|
| - virtual bool HasMatchIn(
|
| - const std::vector<QueryWord>& words) const OVERRIDE;
|
| + virtual bool HasMatchIn(const QueryWordVector& words) const OVERRIDE;
|
| virtual void AppendWords(std::vector<base::string16>* words) const OVERRIDE;
|
|
|
| protected:
|
| int AppendChildrenToString(base::string16* query) const;
|
|
|
| - QueryNodeVector children_;
|
| + QueryNodeStarVector children_;
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(QueryNodeList);
|
| @@ -227,13 +214,13 @@ bool QueryNodeList::Matches(const base::string16& word, bool exact) const {
|
| return false;
|
| }
|
|
|
| -bool QueryNodeList::HasMatchIn(const std::vector<QueryWord>& words,
|
| +bool QueryNodeList::HasMatchIn(const QueryWordVector& words,
|
| Snippet::MatchPositions* match_positions) const {
|
| NOTREACHED();
|
| return false;
|
| }
|
|
|
| -bool QueryNodeList::HasMatchIn(const std::vector<QueryWord>& words) const {
|
| +bool QueryNodeList::HasMatchIn(const QueryWordVector& words) const {
|
| NOTREACHED();
|
| return false;
|
| }
|
| @@ -245,7 +232,7 @@ void QueryNodeList::AppendWords(std::vector<base::string16>* words) const {
|
|
|
| int QueryNodeList::AppendChildrenToString(base::string16* query) const {
|
| int num_words = 0;
|
| - for (QueryNodeVector::const_iterator node = children_.begin();
|
| + for (QueryNodeStarVector::const_iterator node = children_.begin();
|
| node != children_.end(); ++node) {
|
| if (node != children_.begin())
|
| query->push_back(L' ');
|
| @@ -263,13 +250,12 @@ class QueryNodePhrase : public QueryNodeList {
|
| // QueryNodeList:
|
| virtual int AppendToSQLiteQuery(base::string16* query) const OVERRIDE;
|
| virtual bool HasMatchIn(
|
| - const std::vector<QueryWord>& words,
|
| + const QueryWordVector& words,
|
| Snippet::MatchPositions* match_positions) const OVERRIDE;
|
| - virtual bool HasMatchIn(
|
| - const std::vector<QueryWord>& words) const OVERRIDE;
|
| + virtual bool HasMatchIn(const QueryWordVector& words) const OVERRIDE;
|
|
|
| private:
|
| - bool MatchesAll(const std::vector<QueryWord>& words,
|
| + bool MatchesAll(const QueryWordVector& words,
|
| const QueryWord** first_word,
|
| const QueryWord** last_word) const;
|
| DISALLOW_COPY_AND_ASSIGN(QueryNodePhrase);
|
| @@ -286,7 +272,7 @@ int QueryNodePhrase::AppendToSQLiteQuery(base::string16* query) const {
|
| return num_words;
|
| }
|
|
|
| -bool QueryNodePhrase::MatchesAll(const std::vector<QueryWord>& words,
|
| +bool QueryNodePhrase::MatchesAll(const QueryWordVector& words,
|
| const QueryWord** first_word,
|
| const QueryWord** last_word) const {
|
| if (words.size() < children_.size())
|
| @@ -310,7 +296,7 @@ bool QueryNodePhrase::MatchesAll(const std::vector<QueryWord>& words,
|
| }
|
|
|
| bool QueryNodePhrase::HasMatchIn(
|
| - const std::vector<QueryWord>& words,
|
| + const QueryWordVector& words,
|
| Snippet::MatchPositions* match_positions) const {
|
| const QueryWord* first_word;
|
| const QueryWord* last_word;
|
| @@ -324,7 +310,7 @@ bool QueryNodePhrase::HasMatchIn(
|
| return false;
|
| }
|
|
|
| -bool QueryNodePhrase::HasMatchIn(const std::vector<QueryWord>& words) const {
|
| +bool QueryNodePhrase::HasMatchIn(const QueryWordVector& words) const {
|
| const QueryWord* first_word;
|
| const QueryWord* last_word;
|
| return MatchesAll(words, &first_word, &last_word);
|
| @@ -361,19 +347,19 @@ void QueryParser::ParseQueryWords(const base::string16& query,
|
| }
|
|
|
| void QueryParser::ParseQueryNodes(const base::string16& query,
|
| - std::vector<QueryNode*>* nodes) {
|
| + QueryNodeStarVector* nodes) {
|
| QueryNodeList root;
|
| if (ParseQueryImpl(base::i18n::ToLower(query), &root))
|
| nodes->swap(*root.children());
|
| }
|
|
|
| bool QueryParser::DoesQueryMatch(const base::string16& text,
|
| - const std::vector<QueryNode*>& query_nodes,
|
| + const QueryNodeStarVector& query_nodes,
|
| Snippet::MatchPositions* match_positions) {
|
| if (query_nodes.empty())
|
| return false;
|
|
|
| - std::vector<QueryWord> query_words;
|
| + QueryWordVector query_words;
|
| base::string16 lower_text = base::i18n::ToLower(text);
|
| ExtractQueryWords(lower_text, &query_words);
|
|
|
| @@ -392,14 +378,14 @@ bool QueryParser::DoesQueryMatch(const base::string16& text,
|
| // completely punt here.
|
| match_positions->clear();
|
| } else {
|
| - CoalseAndSortMatchPositions(&matches);
|
| + SortAndCoalesceMatchPositions(&matches);
|
| match_positions->swap(matches);
|
| }
|
| return true;
|
| }
|
|
|
| -bool QueryParser::DoesQueryMatch(const std::vector<QueryWord>& query_words,
|
| - const std::vector<QueryNode*>& query_nodes) {
|
| +bool QueryParser::DoesQueryMatch(const QueryWordVector& query_words,
|
| + const QueryNodeStarVector& query_nodes) {
|
| if (query_nodes.empty() || query_words.empty())
|
| return false;
|
|
|
| @@ -452,7 +438,7 @@ bool QueryParser::ParseQueryImpl(const base::string16& query,
|
| }
|
|
|
| void QueryParser::ExtractQueryWords(const base::string16& text,
|
| - std::vector<QueryWord>* words) {
|
| + QueryWordVector* words) {
|
| base::i18n::BreakIterator iter(text, base::i18n::BreakIterator::BREAK_WORD);
|
| // TODO(evanm): support a locale here
|
| if (!iter.Init())
|
| @@ -468,9 +454,19 @@ void QueryParser::ExtractQueryWords(const base::string16& text,
|
| words->push_back(QueryWord());
|
| words->back().word = word;
|
| words->back().position = iter.prev();
|
| - }
|
| + }
|
| }
|
| }
|
| }
|
|
|
| +// static
|
| +void QueryParser::SortAndCoalesceMatchPositions(
|
| + Snippet::MatchPositions* matches) {
|
| + std::sort(matches->begin(), matches->end(), &CompareMatchPosition);
|
| + // WARNING: we don't use iterator here as CoalesceMatchesFrom may remove
|
| + // from matches.
|
| + for (size_t i = 0; i < matches->size(); ++i)
|
| + CoalesceMatchesFrom(i, matches);
|
| +}
|
| +
|
| } // namespace query_parser
|
|
|