Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //search_server.h
- //...//
- struct Query {
- std::set<std::string> plus_words;
- std::set<std::string> minus_words;
- std::vector<std::string_view> str_plus_words;
- std::vector<std::string_view> str_minus_words;
- };
- //...//
- //search_server.cpp
- //...//
- tuple<vector<string>, DocumentStatus> SearchServer::MatchDocument(std::execution::parallel_policy exec_t,const string& raw_query,
- int document_id) const {
- const auto query = ParseQuery(raw_query);
- vector<string> matched_words;
- if(!document_ids_.count(document_id))
- throw out_of_range("Document don't exists");
- if (!std::all_of(exec_t,query.str_minus_words.begin(),query.str_minus_words.end(),[&](const string_view& word){
- if (word_to_document_freqs_.count(string(word)) == 0) {
- return true;
- }
- if (word_to_document_freqs_.at(string(word)).count(document_id)) {
- matched_words.clear();
- return false;
- }
- return true;
- }))
- return {matched_words, documents_.at(document_id).status};
- matched_words.reserve(query.plus_words.size());
- vector<string_view> temp;
- temp.reserve(query.plus_words.size());
- copy_if(exec_t,query.str_plus_words.begin(),query.str_plus_words.end(),back_inserter(temp),[&](const string_view& word){
- if (word_to_document_freqs_.count(string(word)) == 0) {
- return false;
- }
- if(word_to_document_freqs_.at(string(word)).count(document_id)) {
- return true;
- }
- else
- return false;
- });
- std::transform(temp.begin(),temp.end(),back_inserter(matched_words),[](const string_view& sv){
- return sv.data();
- });
- return {matched_words, documents_.at(document_id).status};
- }
- SearchServer::Query SearchServer::ParseQuery(const string& text) const {
- Query result;
- const auto string_query = SplitIntoWords(text);
- for_each (string_query.begin(),string_query.end(),[&](const string& word){
- const auto query_word = ParseQueryWord(word);
- if (!query_word.is_stop) {
- if (query_word.is_minus) {
- if (!result.minus_words.count(query_word.data)){
- result.minus_words.insert(query_word.data);
- result.str_minus_words.push_back(result.minus_words.find(query_word.data)->data());
- }
- }
- else {
- if (!result.plus_words.count(query_word.data)){
- result.plus_words.insert(query_word.data);
- result.str_plus_words.push_back(result.plus_words.find(query_word.data)->data());
- }
- }
- }
- });
- return result;
- }
- //...//
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement