From 94b541a471bb9cc5875435b6fc07987c535c49d2 Mon Sep 17 00:00:00 2001
From: Firat Yusuf Duran <uzivy@student.kit.edu>
Date: Sun, 15 Sep 2024 13:35:57 +0200
Subject: [PATCH] add loadProfiles to skillmemory

---
 .../server/SkillsMemory/SkillsMemory.cpp      |  5 ++++
 .../armem/server/SkillsMemory/SkillsMemory.h  |  1 +
 .../server/segment/ProfileLibrarySegment.cpp  | 29 +++++++++++++++++++
 .../server/segment/ProfileLibrarySegment.h    |  3 ++
 .../SkillManagerComponentPluginUser.cpp       |  7 +++++
 .../manager/SkillManagerComponentPluginUser.h |  1 +
 6 files changed, 46 insertions(+)

diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
index 1119465a1..a02a8f8af 100644
--- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
+++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
@@ -256,4 +256,9 @@ namespace armarx
     {
         profileCoreSegment.addProfile(profile);
     }
+
+    std::optional<std::vector<skills::manager::arondto::FluxioProfile>> SkillsMemory::loadProfiles()
+    {
+        return profileCoreSegment.getProfiles();
+    }
 } // namespace armarx
diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h
index 1155b05d8..8f117a5cb 100644
--- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h
+++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h
@@ -118,6 +118,7 @@ namespace armarx
         std::optional<std::vector<skills::manager::arondto::FluxioSkill>> loadCompositeSkillsOfProvider(const std::string& providerId) override;
 
         void addProfile(const skills::manager::arondto::FluxioProfile& profile) override;
+        std::optional<std::vector<skills::manager::arondto::FluxioProfile>> loadProfiles() override;
 
     protected:
         /// @see armarx::ManagedIceObject::onInitComponent()
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ProfileLibrarySegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/ProfileLibrarySegment.cpp
index 0d3d49d1f..075e0f192 100644
--- a/source/RobotAPI/libraries/armem_skills/server/segment/ProfileLibrarySegment.cpp
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/ProfileLibrarySegment.cpp
@@ -1,9 +1,11 @@
 #include "ProfileLibrarySegment.h"
+#include <vector>
 
 #include <SimoxUtility/algorithm/string.h>
 
 #include <ArmarXCore/core/time/ice_conversions.h>
 
+#include "RobotAPI/libraries/armem/client/query/Builder.h"
 #include "RobotAPI/libraries/armem/core/Commit.h"
 #include "RobotAPI/libraries/armem/core/MemoryID.h"
 #include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
@@ -52,4 +54,31 @@ namespace armarx::skills::segment
         // Commit data to memory and notify
         iceMemory.commit(commit);
     }
+
+    std::optional<std::vector<skills::manager::arondto::FluxioProfile>> ProfileLibraryCoreSegment::getProfiles() const {
+        std::vector<skills::manager::arondto::FluxioProfile> ret;
+        armarx::armem::client::query::Builder qb;
+        qb.allLatestInCoreSegment(id());
+        armem::client::QueryResult qresult = iceMemory.query(qb.buildQueryInput());
+        if (!qresult.success)
+        {
+            ARMARX_WARNING << "Query failed: " << qresult.errorMessage;
+            return std::nullopt;
+        }
+
+        const armem::wm::Memory& data = qresult.memory;
+
+        data.forEachInstance(
+            [&ret](const armem::wm::EntityInstance& instance)
+            {
+                auto profile = instance.dataAs<skills::manager::arondto::FluxioProfile>();
+                if (profile.deleted)
+                {
+                    return;
+                }
+                ret.push_back(profile);
+            });
+
+        return ret;
+    }
 } // namespace armarx::skills::segment
diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ProfileLibrarySegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/ProfileLibrarySegment.h
index 61c5a9fc1..2032163c5 100644
--- a/source/RobotAPI/libraries/armem_skills/server/segment/ProfileLibrarySegment.h
+++ b/source/RobotAPI/libraries/armem_skills/server/segment/ProfileLibrarySegment.h
@@ -1,6 +1,8 @@
 #pragma once
 
 // Base Class
+#include <optional>
+#include <vector>
 #include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h>
 
 // ArmarX
@@ -29,5 +31,6 @@ namespace armarx::skills::segment
         void init();
 
         void addProfile(const skills::manager::arondto::FluxioProfile& profile);
+        std::optional<std::vector<skills::manager::arondto::FluxioProfile>> getProfiles() const;
 };
 } // namespace armarx::skills::segment
diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp
index 39b5d2d71..31b002a43 100644
--- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp
+++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp
@@ -771,4 +771,11 @@ namespace armarx
     {
         // Implemented in derived class
     }
+
+    std::optional<std::vector<skills::manager::arondto::FluxioProfile>>
+    SkillManagerComponentPluginUser::loadProfiles()
+    {
+        // Implemented in derived class
+        return {};
+    }
 } // namespace armarx
diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.h b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.h
index 89d148029..1eb873f36 100644
--- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.h
+++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.h
@@ -156,6 +156,7 @@ namespace armarx
         virtual std::optional<std::vector<skills::manager::arondto::FluxioSkill>> loadCompositeSkillsOfProvider(const std::string& providerId);
 
         virtual void addProfile(const skills::manager::arondto::FluxioProfile& profile);
+        virtual std::optional<std::vector<skills::manager::arondto::FluxioProfile>> loadProfiles();
 
     private:
         armarx::plugins::SkillManagerComponentPlugin* plugin = nullptr;
-- 
GitLab