Advertisement
giGii

par_match_document

Dec 18th, 2022
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. std::tuple<std::vector<std::string>, DocumentStatus> SearchServer::MatchDocument(std::execution::parallel_policy, const std::string& raw_query, int document_id) const {
  2.  
  3.     //ThrowSpecialSymbolInText(raw_query);
  4.  
  5.     if (IsNegativeDocumentId(document_id)) {
  6.         throw std::invalid_argument("Negative document id"s);
  7.     }
  8.  
  9.     if (IsNonexistentDocumentId(document_id)) {
  10.         throw std::invalid_argument("Nonexistent document id"s);
  11.     }
  12.  
  13.     SearchServer::PlusMinusWords prepared_query = ParseQuery(raw_query);
  14.  
  15.     std::vector<const std::string*> words(TF_by_id_.at(document_id).size());
  16.     std::transform(std::execution::par,
  17.                    TF_by_id_.at(document_id).begin(), TF_by_id_.at(document_id).end(),
  18.                    words.begin(),
  19.                    [](auto& item) { return &item.first; });
  20.  
  21.     bool is_minus_words_in_document = any_of(words.begin(), words.end(),
  22.                                              [&prepared_query](const std::string* word) {
  23.                                                 return prepared_query.minus_words.count(*word);
  24.                                             });
  25.  
  26.     if (is_minus_words_in_document) {
  27.         return {std::vector<std::string>{}, document_info_.at(document_id).status};
  28.     }
  29.  
  30.     std::vector<const std::string*> result_intersection_ptrs(prepared_query.plus_words.size());
  31.     std::copy_if(std::execution::par,
  32.                  words.begin(), words.end(),
  33.                  result_intersection_ptrs.begin(),
  34.                  [&prepared_query](const std::string* word) { return prepared_query.plus_words.count(*word) != 0; });
  35.    
  36.     std::vector<std::string> result_intersection(result_intersection_ptrs.size());
  37.     std::transform(std::execution::par,
  38.                    result_intersection_ptrs.begin(), result_intersection_ptrs.end(),
  39.                    result_intersection.begin(),
  40.                    [](const std::string* word) { return *word; });
  41.    
  42.     return {result_intersection, document_info_.at(document_id).status};
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement