bool SearchResult::matches(SearchQuery& aQuery, const string& aLocalSearchToken) const noexcept { if (!user.user->isNMDC()) { // ADC if (aLocalSearchToken != token) { return false; } } else { // NMDC results must be matched manually // Exludes if (aQuery.isExcluded(path)) { return false; } if (aQuery.root && *aQuery.root != tth) { return false; } } // All clients can't handle this correctly if (aQuery.itemType == SearchQuery::TYPE_FILE && type != SearchResult::TYPE_FILE) { return false; } return true; }
/** * Alright, the main point here is that when searching, a search string is most often found in * the filename, not directory name, so we want to make that case faster. Also, we want to * avoid changing StringLists unless we absolutely have to --> this should only be done if a string * has been matched in the directory name. This new stringlist should also be used in all descendants, * but not the parents... */ void ShareManager::Directory::search(SearchResultList& results, SearchQuery& query, size_t maxResults) const noexcept { if(query.isExcluded(name)) return; // Find any matches in the directory name and removed matched terms from the query. StringSearch::List newTerms; for(auto& term: query.include) { if(term.match(name)) { if(!newTerms.empty()) { newTerms = query.include; } newTerms.erase(remove(newTerms.begin(), newTerms.end(), term), newTerms.end()); } } // auto const old = query.include; if(!newTerms.empty()) { query.include = newTerms; } if(query.include.empty() && query.ext.empty() && query.gt == 0) { // We satisfied all the search words! Add the directory... /// @todo send the directory hash when we have one results.push_back(new SearchResult(SearchResult::TYPE_DIRECTORY, getSize(), getFullName(), TTHValue(string(39, 'A')))); ShareManager::getInstance()->addHits(1); } if(!query.isDirectory) { for(auto& i: files) { if(!i.tth) { continue; } // check the size if(!(i.getSize() >= query.gt)) { continue; } else if(!(i.getSize() <= query.lt)) { continue; } if(query.isExcluded(i.getName())) continue; // check if the name matches auto j = query.include.begin(); for(; j != query.include.end() && j->match(i.getName()); ++j) ; // Empty if(j != query.include.end()) continue; // check extensions if(!query.hasExt(i.getName())) continue; results.push_back(new SearchResult(SearchResult::TYPE_FILE, i.getSize(), getFullName() + i.getName(), (i.tth))); ShareManager::getInstance()->addHits(1); if(results.size() >= maxResults) { return; } } } for(auto& dir: directories) { dir.second->search(results, query, maxResults); if(results.size() >= maxResults) { return; } } }