Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- std::tuple<std::vector<std::string>, DocumentStatus> SearchServer::MatchDocument(std::execution::parallel_policy, const std::string& raw_query, int document_id) const {
- //ThrowSpecialSymbolInText(raw_query);
- if (IsNegativeDocumentId(document_id)) {
- throw std::invalid_argument("Negative document id"s);
- }
- if (IsNonexistentDocumentId(document_id)) {
- throw std::invalid_argument("Nonexistent document id"s);
- }
- // тут два set по + и - словам
- SearchServer::PlusMinusWords prepared_query = ParseQuery(raw_query);
- // вытягиваю слова документа из сервера, других вариантов кроме как по map пройтись
- // у меня нет, только разве сами дукумменты хранить в сервере в виде векторов
- // типа map<int, vector<string>> -- документ и его слова
- std::vector<const std::string*> words(TF_by_id_.at(document_id).size());
- std::transform(std::execution::par,
- TF_by_id_.at(document_id).begin(), TF_by_id_.at(document_id).end(),
- words.begin(),
- [](auto& item) { return &item.first; });
- bool is_minus_words_in_document = any_of(words.begin(), words.end(),
- [&prepared_query](const std::string* word) {
- return prepared_query.minus_words.count(*word);
- });
- if (is_minus_words_in_document) {
- return {std::vector<std::string>{}, document_info_.at(document_id).status};
- }
- std::vector<const std::string*> result_intersection_ptrs(std::min(prepared_query.plus_words.size(), words.size()));
- std::copy_if(std::execution::par,
- words.begin(), words.end(),
- result_intersection_ptrs.begin(),
- [&prepared_query](const std::string* word) { return prepared_query.plus_words.count(*word) != 0; });
- std::vector<std::string> result_intersection(result_intersection_ptrs.size());
- std::transform(std::execution::par,
- result_intersection_ptrs.begin(), result_intersection_ptrs.end(),
- result_intersection.begin(),
- [](const std::string* word) { return word != nullptr ? *word : ""s; });
- std::sort(std::execution::par,
- result_intersection.begin(), result_intersection.end());
- auto start = std::upper_bound(result_intersection.begin(), result_intersection.end(), ""s);
- // std::vector<std::string> result;
- // std::move(start, result_intersection.end(), std::back_inserter(result));
- // return {result, document_info_.at(document_id).status};
- return {{start, result_intersection.end()}, document_info_.at(document_id).status};
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement