Advertisement
giGii

best match

Dec 19th, 2022
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 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.     // тут два set по + и - словам
  14.     SearchServer::PlusMinusWords prepared_query = ParseQuery(raw_query);
  15.  
  16.     // вытягиваю слова документа из сервера, других вариантов кроме как по map пройтись
  17.     // у меня нет, только разве сами дукумменты хранить в сервере в виде векторов
  18.     // типа map<int, vector<string>> -- документ и его слова
  19.  
  20.     std::vector<const std::string*> words(TF_by_id_.at(document_id).size());
  21.     std::transform(std::execution::par,
  22.                    TF_by_id_.at(document_id).begin(), TF_by_id_.at(document_id).end(),
  23.                    words.begin(),
  24.                    [](auto& item) { return &item.first; });
  25.  
  26.     bool is_minus_words_in_document = any_of(words.begin(), words.end(),
  27.                                              [&prepared_query](const std::string* word) {
  28.                                                 return prepared_query.minus_words.count(*word);
  29.                                             });
  30.  
  31.     if (is_minus_words_in_document) {
  32.         return {std::vector<std::string>{}, document_info_.at(document_id).status};
  33.     }
  34.  
  35.     std::vector<const std::string*> result_intersection_ptrs(std::min(prepared_query.plus_words.size(), words.size()));
  36.     std::copy_if(std::execution::par,
  37.                  words.begin(), words.end(),
  38.                  result_intersection_ptrs.begin(),
  39.                  [&prepared_query](const std::string* word) { return prepared_query.plus_words.count(*word) != 0; });
  40.    
  41.     std::vector<std::string> result_intersection(result_intersection_ptrs.size());
  42.     std::transform(std::execution::par,
  43.                    result_intersection_ptrs.begin(), result_intersection_ptrs.end(),
  44.                    result_intersection.begin(),
  45.                    [](const std::string* word) { return word != nullptr ? *word : ""s; });
  46.    
  47.     std::sort(std::execution::par,
  48.               result_intersection.begin(), result_intersection.end());
  49.  
  50.     auto start = std::upper_bound(result_intersection.begin(), result_intersection.end(), ""s);
  51.  
  52.     // std::vector<std::string> result;
  53.     // std::move(start, result_intersection.end(), std::back_inserter(result));
  54.  
  55.     // return {result, document_info_.at(document_id).status};
  56.     return {{start, result_intersection.end()}, document_info_.at(document_id).status};
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement