From a2dee547e0fe396413ceca59709247af49f305a4 Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Mon, 28 Oct 2024 04:52:21 +0100
Subject: [PATCH] object class reader: +getAllObjectClasses

---
 .../client/class/ClassReader.cpp              | 42 +++++++++++++++++--
 .../armem_objects/client/class/ClassReader.h  |  2 +
 2 files changed, 40 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 ca365080d..de1a50c49 100644
--- a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp
@@ -36,10 +36,10 @@ namespace armarx::armem::obj::clazz
     {
         armem::client::query::Builder builder;
         auto& entities = builder.coreSegments()
-                            .withName(properties().coreSegmentName)
-                            .providerSegments()
-                            .all()
-                            .entities();
+                             .withName(properties().coreSegmentName)
+                             .providerSegments()
+                             .all()
+                             .entities();
 
         for (const ObjectID& objectID : objectIDs)
         {
@@ -67,6 +67,40 @@ namespace armarx::armem::obj::clazz
         return objectClasses;
     }
 
+    std::map<ObjectID, armem::clazz::ObjectClass>
+    ClassReader::getAllObjectClasses()
+    {
+        armem::client::query::Builder builder;
+        
+        // clang-format off
+        builder
+            .coreSegments().withName(properties().coreSegmentName)
+            .providerSegments().all()
+            .entities().all()
+            .snapshots().latest();
+        // clang-format on
+
+        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 8dd50018a..4fe194389 100644
--- a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h
+++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h
@@ -46,6 +46,8 @@ namespace armarx::armem::obj::clazz
         std::map<armarx::ObjectID, armem::clazz::ObjectClass>
         getObjectClasses(const std::vector<armarx::ObjectID>& objectIDs);
 
+        std::map<armarx::ObjectID, armem::clazz::ObjectClass> getAllObjectClasses();
+
     protected:
         std::string propertyPrefix() const final;
         Properties defaultProperties() const final;
-- 
GitLab