Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- tuple<vector<string_view>, DocumentStatus> SearchServer::MatchDocument(const string_view raw_query, int document_id) const {
- return MatchDocument(execution::seq, raw_query, document_id);
- }
- tuple<vector<string_view>, DocumentStatus> SearchServer::MatchDocument(execution::sequenced_policy policy,
- const string_view raw_query, int document_id) const {
- //LOG_DURATION_STREAM("MatchDocument"s, cout);
- if (document_id < 0 || word_frequencies_in_document_.count(document_id) == 0) {
- throw out_of_range("Документа с указанным id не существует.");
- }
- const Query query = ParseQuery(raw_query);
- vector<string_view> matched_words;
- for (const string_view word : query.plus_words) {
- if (word_to_document_freqs_.count(word) == 0) {
- continue;
- }
- if (word_to_document_freqs_.at(string(word)).count(document_id)) {
- matched_words.push_back(word);
- }
- }
- for (const string_view word : query.minus_words) {
- if (word_to_document_freqs_.count(string(word)) == 0) {
- continue;
- }
- if (word_to_document_freqs_.at(string(word)).count(document_id)) {
- matched_words.clear();
- break;
- }
- }
- return { matched_words, documents_.at(document_id).status };
- }
- tuple<vector<string_view>, DocumentStatus> SearchServer::MatchDocument(execution::parallel_policy policy,
- const string_view raw_query, int document_id) const {
- if (document_id < 0 || word_frequencies_in_document_.count(document_id) == 0) {
- throw out_of_range("Документа с указанным id не существует.");
- }
- Query query = ParseQuery(raw_query, false);
- if (any_of(policy, query.minus_words.begin(), query.minus_words.end(),
- [this, &document_id](const string_view minus_word) {
- return word_frequencies_in_document_.at(document_id).count(minus_word);
- })) {
- return { {}, documents_.at(document_id).status };
- }
- vector<string_view> matched_words(query.plus_words.size());
- vector<string_view>::iterator end_new_size = copy_if(policy, query.plus_words.begin(), query.plus_words.end(),
- matched_words.begin(),
- [this, &document_id](const string_view plus_word) {
- return word_frequencies_in_document_.at(document_id).count(plus_word);
- });
- matched_words.resize(distance(matched_words.begin(), end_new_size));
- sort(policy, matched_words.begin(), matched_words.end());
- matched_words.erase(unique(policy, matched_words.begin(), matched_words.end()), matched_words.end());
- return { matched_words, documents_.at(document_id).status };
- }
Advertisement
Add Comment
Please, Sign In to add comment