From 549cc1941da8f03670b476e445d1b37e2c3bdcbf Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Mon, 4 Dec 2023 14:30:14 +0100
Subject: [PATCH] Add getObjectClasses()

---
 .../client/class/ClassReader.cpp              | 40 +++++++++++++++++++
 .../armem_objects/client/class/ClassReader.h  | 14 +++++--
 2 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp
index bceba7d96..aa16a8441 100644
--- a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp
@@ -1,5 +1,9 @@
 #include "ClassReader.h"
 
+#include <RobotAPI/libraries/armem/client/query.h>
+#include <RobotAPI/libraries/armem_objects/aron_conversions.h>
+#include <RobotAPI/libraries/armem_objects/types.h>
+
 namespace armarx::armem::obj::clazz
 {
     std::optional<armem::clazz::ObjectClass>
@@ -27,6 +31,42 @@ namespace armarx::armem::obj::clazz
         return std::nullopt;
     }
 
+    std::map<ObjectID, armem::clazz::ObjectClass>
+    ClassReader::getObjectClasses(const std::vector<ObjectID>& objectIDs)
+    {
+        armem::client::query::Builder builder;
+        auto entities = builder.coreSegments()
+                            .withName(properties().coreSegmentName)
+                            .providerSegments()
+                            .all()
+                            .entities();
+
+        for (const ObjectID& objectID : objectIDs)
+        {
+            entities.withName(objectID.getClassID().str()).snapshots().latest();
+        }
+
+        const armem::client::QueryResult result = memoryReader().query(builder);
+        if (not result.success)
+        {
+            throw armem::error::QueryFailed(result.errorMessage);
+        }
+
+        std::map<ObjectID, armem::clazz::ObjectClass> objectClasses;
+
+        result.memory.forEachInstance(
+            [&objectClasses](const armem::wm::EntityInstance& instance) -> bool
+            {
+                const ObjectID classID = ObjectID::FromString(instance.id().entityName);
+                auto aron = instance.dataAs<armarx::armem::arondto::ObjectClass>();
+                armarx::armem::clazz::fromAron(aron, objectClasses[classID]);
+
+                return true;
+            });
+
+        return objectClasses;
+    }
+
     std::string
     ClassReader::propertyPrefix() const
     {
diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h
index 4d2805b4f..8dd50018a 100644
--- a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h
+++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h
@@ -21,11 +21,10 @@
 
 #pragma once
 
-#include <mutex>
+#include <map>
 #include <optional>
 
 #include <RobotAPI/libraries/armem/client/util/SimpleReaderBase.h>
-#include <RobotAPI/libraries/armem_objects/aron_conversions.h>
 #include <RobotAPI/libraries/armem_objects/types.h>
 
 namespace armarx::armem::obj::clazz
@@ -38,11 +37,18 @@ namespace armarx::armem::obj::clazz
         std::optional<armem::clazz::ObjectClass> getObjectClass(const std::string& providerName,
                                                                 const armarx::ObjectID& id);
 
+        /**
+         * @brief Get object class information for object class IDs.
+         * @param objectIDs The object class IDs.
+         * @return The corresponding object classes.
+         * @throw armarx::armem::error::QueryFailed If the memory query failed.
+         */
+        std::map<armarx::ObjectID, armem::clazz::ObjectClass>
+        getObjectClasses(const std::vector<armarx::ObjectID>& objectIDs);
+
     protected:
         std::string propertyPrefix() const final;
         Properties defaultProperties() const final;
-
-    private:
     };
 
 
-- 
GitLab