diff OrthancServer/Sources/OrthancRestApi/OrthancRestResources.cpp @ 5690:708952bd869c find-refactoring

integration tests are passing with ResourceFinder
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 09 Jul 2024 18:05:54 +0200
parents d0a264b803f1
children 023787ecaff2
line wrap: on
line diff
--- a/OrthancServer/Sources/OrthancRestApi/OrthancRestResources.cpp	Tue Jul 09 15:56:53 2024 +0200
+++ b/OrthancServer/Sources/OrthancRestApi/OrthancRestResources.cpp	Tue Jul 09 18:05:54 2024 +0200
@@ -3329,7 +3329,7 @@
       throw OrthancException(ErrorCode_BadRequest, 
                              "Field \"" + std::string(KEY_LABELS_CONSTRAINT) + "\" must be an array of strings");
     }
-    else if (false)
+    else if (true)
     {
       /**
        * EXPERIMENTAL VERSION
@@ -3379,6 +3379,39 @@
         finder.SetLimits(since, limit);
       }
 
+      {
+        bool caseSensitive = false;
+        if (request.isMember(KEY_CASE_SENSITIVE))
+        {
+          caseSensitive = request[KEY_CASE_SENSITIVE].asBool();
+        }
+
+        DatabaseLookup query;
+
+        Json::Value::Members members = request[KEY_QUERY].getMemberNames();
+        for (size_t i = 0; i < members.size(); i++)
+        {
+          if (request[KEY_QUERY][members[i]].type() != Json::stringValue)
+          {
+            throw OrthancException(ErrorCode_BadRequest,
+                                   "Tag \"" + members[i] + "\" must be associated with a string");
+          }
+
+          const std::string value = request[KEY_QUERY][members[i]].asString();
+
+          if (!value.empty())
+          {
+            // An empty string corresponds to an universal constraint,
+            // so we ignore it. This mimics the behavior of class
+            // "OrthancFindRequestHandler"
+            query.AddRestConstraint(FromDcmtkBridge::ParseTag(members[i]),
+                                    value, caseSensitive, true);
+          }
+        }
+
+        finder.SetDatabaseLookup(query);
+      }
+
       if (request.isMember(KEY_REQUESTED_TAGS))
       {
         std::set<DicomTag> requestedTags;