# HG changeset patch # User Sebastien Jodogne # Date 1544551371 -3600 # Node ID 5ae3ff2398e9163c518af8dab99abcb09731de92 # Parent 9ceb7dafae2e2424e4f062ee97cbf8bb710eacf3 refactoring OrthancFindRequestHandler using LookupResource::IVisitor diff -r 9ceb7dafae2e -r 5ae3ff2398e9 OrthancServer/OrthancFindRequestHandler.cpp --- a/OrthancServer/OrthancFindRequestHandler.cpp Tue Dec 11 18:36:52 2018 +0100 +++ b/OrthancServer/OrthancFindRequestHandler.cpp Tue Dec 11 19:02:51 2018 +0100 @@ -521,6 +521,47 @@ } + class OrthancFindRequestHandler::LookupVisitor : public LookupResource::IVisitor + { + private: + DicomFindAnswers& answers_; + ServerContext& context_; + ResourceType level_; + const DicomMap& filteredInput_; + const std::list& sequencesToReturn_; + DicomArray query_; + + public: + LookupVisitor(DicomFindAnswers& answers, + ServerContext& context, + ResourceType level, + const DicomMap& filteredInput, + const std::list& sequencesToReturn) : + answers_(answers), + context_(context), + level_(level), + filteredInput_(filteredInput), + sequencesToReturn_(sequencesToReturn), + query_(filteredInput) + { + answers_.SetComplete(false); + } + + virtual void MarkAsComplete() + { + answers_.SetComplete(true); + } + + virtual void Visit(const std::string& publicId, + const std::string& instanceId, + const Json::Value& dicom) + { + std::auto_ptr counters(ComputeCounters(context_, instanceId, level_, filteredInput_)); + AddAnswer(answers_, dicom, query_, sequencesToReturn_, counters.get()); + } + }; + + void OrthancFindRequestHandler::Handle(DicomFindAnswers& answers, const DicomMap& input, const std::list& sequencesToReturn, @@ -649,6 +690,15 @@ size_t limit = (level == ResourceType_Instance) ? maxInstances_ : maxResults_; + +#if 1 + LookupVisitor visitor(answers, context_, level, *filteredInput, sequencesToReturn); + context_.Apply(visitor, lookup, 0 /* "since" is not relevant to C-FIND */, limit); + +#else + // Backup - Implementation of Orthanc <= 1.5.0 + // TODO - Remove this code + // TODO - Use ServerContext::Apply() at this point, in order to // share the code with the "/tools/find" REST URI std::vector resources, instances; @@ -685,6 +735,7 @@ LOG(INFO) << "Number of matching resources: " << answers.GetSize(); answers.SetComplete(complete); +#endif } diff -r 9ceb7dafae2e -r 5ae3ff2398e9 OrthancServer/OrthancFindRequestHandler.h --- a/OrthancServer/OrthancFindRequestHandler.h Tue Dec 11 18:36:52 2018 +0100 +++ b/OrthancServer/OrthancFindRequestHandler.h Tue Dec 11 19:02:51 2018 +0100 @@ -41,6 +41,8 @@ class OrthancFindRequestHandler : public IFindRequestHandler { private: + class LookupVisitor; + ServerContext& context_; unsigned int maxResults_; unsigned int maxInstances_; diff -r 9ceb7dafae2e -r 5ae3ff2398e9 OrthancServer/OrthancRestApi/OrthancRestResources.cpp --- a/OrthancServer/OrthancRestApi/OrthancRestResources.cpp Tue Dec 11 18:36:52 2018 +0100 +++ b/OrthancServer/OrthancRestApi/OrthancRestResources.cpp Tue Dec 11 19:02:51 2018 +0100 @@ -1289,7 +1289,8 @@ } virtual void Visit(const std::string& publicId, - const Json::Value& dicom) + const std::string& instanceId /* unused */, + const Json::Value& dicom /* unused */) { resources_.push_back(publicId); } diff -r 9ceb7dafae2e -r 5ae3ff2398e9 OrthancServer/Search/LookupResource.h --- a/OrthancServer/Search/LookupResource.h Tue Dec 11 18:36:52 2018 +0100 +++ b/OrthancServer/Search/LookupResource.h Tue Dec 11 19:02:51 2018 +0100 @@ -92,6 +92,7 @@ virtual void MarkAsComplete() = 0; virtual void Visit(const std::string& publicId, + const std::string& instanceId, const Json::Value& dicom) = 0; }; diff -r 9ceb7dafae2e -r 5ae3ff2398e9 OrthancServer/ServerContext.cpp --- a/OrthancServer/ServerContext.cpp Tue Dec 11 18:36:52 2018 +0100 +++ b/OrthancServer/ServerContext.cpp Tue Dec 11 19:02:51 2018 +0100 @@ -781,10 +781,13 @@ std::vector resources, instances; GetIndex().FindCandidates(resources, instances, lookup); + LOG(INFO) << "Number of candidate resources after fast DB filtering: " << resources.size(); + assert(resources.size() == instances.size()); size_t countResults = 0; size_t skipped = 0; + bool complete = true; for (size_t i = 0; i < instances.size(); i++) { @@ -802,17 +805,24 @@ else if (limit != 0 && countResults >= limit) { - return; // too many results, don't mark as complete + // Too many results, don't mark as complete + complete = false; + break; } else { - visitor.Visit(resources[i], dicom); + visitor.Visit(resources[i], instances[i], dicom); countResults ++; } } } - visitor.MarkAsComplete(); + if (complete) + { + visitor.MarkAsComplete(); + } + + LOG(INFO) << "Number of matching resources: " << countResults; }