From 08e9b65cb51d15d3340b07eb2365bd6cff0dcd23 Mon Sep 17 00:00:00 2001
From: Fabian Peller <fabian.peller-konrad@kit.edu>
Date: Thu, 16 Mar 2023 10:07:57 +0000
Subject: [PATCH] rename other time values. Add lastAccessed timestamp and
 counter

---
 source/RobotAPI/interface/armem/memory.ice    |  6 ++--
 .../RobotAPI/libraries/armem/core/Commit.cpp  |  2 +-
 source/RobotAPI/libraries/armem/core/Commit.h |  6 ++--
 .../armem/core/base/EntityInstanceBase.cpp    | 15 +++++---
 .../armem/core/base/EntityInstanceBase.h      | 34 ++++++++++++++-----
 .../armem/core/base/ice_conversions.cpp       | 12 ++++---
 .../libraries/armem/core/ice_conversions.cpp  | 10 +++---
 .../armem/core/wm/memory_definitions.cpp      |  4 +--
 .../armem/server/MemoryToIceAdapter.cpp       |  2 +-
 .../ltm/detail/EntityQueryProcessorBase.h     |  1 +
 .../wm/detail/EntityQueryProcessorBase.h      |  8 ++++-
 .../libraries/armem/server/query_proc/wm/wm.h | 10 ++++--
 .../server/KnownGraspProviderSegment.cpp      |  2 +-
 .../armem_gui/instance/InstanceView.cpp       |  4 ++-
 .../client/instance/ObjectWriter.cpp          |  2 +-
 .../armem_objects/server/class/Segment.cpp    |  2 +-
 .../armem_objects/server/instance/Segment.cpp |  2 +-
 .../server/description/Segment.cpp            |  2 +-
 .../server/localization/Segment.cpp           |  2 +-
 19 files changed, 85 insertions(+), 41 deletions(-)

diff --git a/source/RobotAPI/interface/armem/memory.ice b/source/RobotAPI/interface/armem/memory.ice
index 2b2dc5c81..63801dd4d 100644
--- a/source/RobotAPI/interface/armem/memory.ice
+++ b/source/RobotAPI/interface/armem/memory.ice
@@ -39,8 +39,10 @@ module armarx
             class EntityInstanceMetadata
             {
                 armarx::core::time::dto::DateTime referencedTime;
-                armarx::core::time::dto::DateTime timeSent;
-                armarx::core::time::dto::DateTime timeArrived;
+                armarx::core::time::dto::DateTime sentTime;
+                armarx::core::time::dto::DateTime arrivedTime;
+                armarx::core::time::dto::DateTime lastAccessedTime;
+                long accessed = 0;
 
                 float confidence = 1.0;
             };
diff --git a/source/RobotAPI/libraries/armem/core/Commit.cpp b/source/RobotAPI/libraries/armem/core/Commit.cpp
index 33752d844..341d160ec 100644
--- a/source/RobotAPI/libraries/armem/core/Commit.cpp
+++ b/source/RobotAPI/libraries/armem/core/Commit.cpp
@@ -25,7 +25,7 @@ namespace armarx::armem
         return os << "Entity update result: "
                << "\n- success:       \t" << (rhs.success ? "true" : "false")
                << "\n- snapshotID:    \t" << rhs.snapshotID
-               << "\n- time arrived:  \t" << toDateTimeMilliSeconds(rhs.timeArrived)
+               << "\n- time arrived:  \t" << toDateTimeMilliSeconds(rhs.arrivedTime)
                << "\n- error message: \t" << rhs.errorMessage
                << "\n"
                ;
diff --git a/source/RobotAPI/libraries/armem/core/Commit.h b/source/RobotAPI/libraries/armem/core/Commit.h
index ae9efd877..81d041384 100644
--- a/source/RobotAPI/libraries/armem/core/Commit.h
+++ b/source/RobotAPI/libraries/armem/core/Commit.h
@@ -52,14 +52,14 @@ namespace armarx::armem
          *
          * Set automatically when sending the commit.
          */
-        Time timeSent = Time::Invalid();
+        Time sentTime = Time::Invalid();
 
         /**
          * @brief Time when this update arrived at the memory server.
          *
          * Set by memory server on arrival.
          */
-        Time timeArrived = Time::Invalid();
+        Time arrivedTime = Time::Invalid();
 
 
         friend std::ostream& operator<<(std::ostream& os, const EntityUpdate& rhs);
@@ -74,7 +74,7 @@ namespace armarx::armem
         bool success = false;
 
         MemoryID snapshotID;
-        Time timeArrived = Time::Invalid();
+        Time arrivedTime = Time::Invalid();
 
         std::string errorMessage;
 
diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp
index 4f202b43f..56f207e7e 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp
+++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp
@@ -3,6 +3,12 @@
 
 namespace armarx::armem::base
 {
+    void EntityInstanceMetadata::access() const
+    {
+        accessed++;
+        lastAccessedTime = armarx::core::time::DateTime::Now();
+    }
+
     bool EntityInstanceMetadata::operator==(const EntityInstanceMetadata& other) const
     {
         return referencedTime == other.referencedTime
@@ -16,10 +22,11 @@ namespace armarx::armem::base
 std::ostream& armarx::armem::base::operator<<(std::ostream& os, const EntityInstanceMetadata& d)
 {
     os << "EntityInstanceMetadata: "
-       << "\n- t_referenced =   \t" << armem::toStringMicroSeconds(d.referencedTime) << " us"
-       << "\n- t_sent =     \t" << armem::toStringMicroSeconds(d.sentTime) << " us"
-       << "\n- t_arrived =  \t" << armem::toStringMicroSeconds(d.arrivedTime) << " us"
-       << "\n- confidence = \t" << d.confidence << " us"
+       << "\n - t_referenced = \t" << armem::toStringMicroSeconds(d.referencedTime) << " us"
+       << "\n - t_sent       = \t" << armem::toStringMicroSeconds(d.sentTime) << " us"
+       << "\n - t_arrived    = \t" << armem::toStringMicroSeconds(d.arrivedTime) << " us"
+       << "\n - t_accessed   = \t" << armem::toStringMicroSeconds(d.lastAccessedTime) << " us (" << d.accessed << ")"
+       << "\n - confidence   = \t" << d.confidence << " us"
        ;
     return os;
 }
diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
index 92ca8dff0..26806524c 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
@@ -9,35 +9,51 @@
 namespace armarx::armem::base
 {
 
+    struct Metadata
+    {
+        virtual void access() const = 0;
+
+        virtual ~Metadata() = default;
+    };
+
     /**
      * @brief Default data of an entity instance (empty).
      */
-    struct NoData
+    struct NoData : public Metadata
     {
+        void access() const final {}
+
+        virtual ~NoData() = default;
+
+        bool operator==(const NoData& other) { return true; }
+        bool operator!=(const NoData& other) { return false;}
     };
 
 
     /**
      * @brief Metadata of an entity instance.
      */
-    struct EntityInstanceMetadata
+    struct EntityInstanceMetadata : public Metadata
     {
         /// Time when this value was created.
-        Time referencedTime;
+        Time referencedTime = Time::Invalid();
         /// Time when this value was sent to the memory.
-        Time sentTime;
+        Time sentTime = Time::Invalid();
         /// Time when this value has arrived at the memory.
-        Time arrivedTime;
+        Time arrivedTime = Time::Invalid();
 
         /// An optional confidence, may be used for things like decay.
         float confidence = 1.0;
 
         /// An optional value indicating the last access
-        Time lastAccessedTime = Time::Invalid();
+        mutable Time lastAccessedTime = Time::Invalid();
 
         /// A counter how often the instance has been accessed
-        unsigned long accessed = 0;
+        mutable unsigned long accessed = 0;
+
+        void access() const final;
 
+        virtual ~EntityInstanceMetadata() = default;
 
         bool operator==(const EntityInstanceMetadata& other) const;
         inline bool operator!=(const EntityInstanceMetadata& other) const
@@ -91,11 +107,11 @@ namespace armarx::armem::base
 
         // Data
 
-        EntityInstanceMetadata& metadata()
+        MetadataT& metadata()
         {
             return _metadata;
         }
-        const EntityInstanceMetadata& metadata() const
+        const MetadataT& metadata() const
         {
             return _metadata;
         }
diff --git a/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
index adc5ad57c..af2dfbcfa 100644
--- a/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
@@ -56,16 +56,20 @@ namespace armarx::armem
     void base::toIce(data::EntityInstanceMetadata& ice, const EntityInstanceMetadata& metadata)
     {
         ice.confidence = metadata.confidence;
-        toIce(ice.timeArrived, metadata.arrivedTime);
+        toIce(ice.arrivedTime, metadata.arrivedTime);
         toIce(ice.referencedTime, metadata.referencedTime);
-        toIce(ice.timeSent, metadata.sentTime);
+        toIce(ice.sentTime, metadata.sentTime);
+        toIce(ice.lastAccessedTime, metadata.lastAccessedTime);
+        ice.accessed = metadata.accessed;
     }
     void base::fromIce(const data::EntityInstanceMetadata& ice, EntityInstanceMetadata& metadata)
     {
         metadata.confidence = ice.confidence;
-        fromIce(ice.timeArrived, metadata.arrivedTime);
+        fromIce(ice.arrivedTime, metadata.arrivedTime);
         fromIce(ice.referencedTime, metadata.referencedTime);
-        fromIce(ice.timeSent, metadata.sentTime);
+        fromIce(ice.sentTime, metadata.sentTime);
+        fromIce(ice.lastAccessedTime, metadata.lastAccessedTime);
+        metadata.accessed = ice.accessed;
     }
 
 
diff --git a/source/RobotAPI/libraries/armem/core/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
index 6fccee2f6..5e1ace162 100644
--- a/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
@@ -90,7 +90,7 @@ namespace armarx
         fromIce(ice.referencedTime, update.referencedTime);
 
         update.confidence = ice.confidence;
-        fromIce(ice.timeSent, update.timeSent);
+        fromIce(ice.timeSent, update.sentTime);
     }
 
     void armem::toIce(data::EntityUpdate& ice, const EntityUpdate& update)
@@ -105,14 +105,14 @@ namespace armarx
         toIce(ice.referencedTime, update.referencedTime);
 
         ice.confidence = update.confidence;
-        toIce(ice.timeSent, update.timeSent);
+        toIce(ice.timeSent, update.sentTime);
     }
 
     void armem::fromIce(const data::EntityUpdateResult& ice, EntityUpdateResult& result)
     {
         result.success = ice.success;
         fromIce(ice.snapshotID, result.snapshotID);
-        fromIce(ice.timeArrived, result.timeArrived);
+        fromIce(ice.timeArrived, result.arrivedTime);
         result.errorMessage = ice.errorMessage;
     }
 
@@ -120,7 +120,7 @@ namespace armarx
     {
         ice.success = result.success;
         toIce(ice.snapshotID, result.snapshotID);
-        toIce(ice.timeArrived, result.timeArrived);
+        toIce(ice.timeArrived, result.arrivedTime);
         ice.errorMessage = result.errorMessage;
     }
 
@@ -137,7 +137,7 @@ namespace armarx
     void armem::fromIce(const data::EntityUpdate& ice, EntityUpdate& update, Time timeArrived)
     {
         fromIce(ice, update);
-        update.timeArrived = timeArrived;
+        update.arrivedTime = timeArrived;
     }
 
     void armem::fromIce(const actions::data::MenuPtr& ice, actions::Menu& menu)
diff --git a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp
index eaa3e3c20..bfc408ac9 100644
--- a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp
+++ b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp
@@ -38,8 +38,8 @@ namespace armarx::armem::wm
         this->_metadata.confidence = update.confidence;
 
         this->_metadata.referencedTime = update.referencedTime;
-        this->_metadata.sentTime = update.timeSent;
-        this->_metadata.arrivedTime = update.timeArrived;
+        this->_metadata.sentTime = update.sentTime;
+        this->_metadata.arrivedTime = update.arrivedTime;
     }
 
 }
diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
index 63b9bba20..b70d98e4f 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
+++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
@@ -187,7 +187,7 @@ namespace armarx::armem::server
 
                 result.success = true;
                 result.snapshotID = updateResult.id;
-                result.timeArrived = update.timeArrived;
+                result.arrivedTime = update.arrivedTime;
 
                 for (const auto& snapshot : updateResult.removedSnapshots)
                 {
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h
index d9f64fc7a..42b87df82 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h
@@ -27,6 +27,7 @@ namespace armarx::armem::server::query_proc::ltm::detail
 
 
     protected:
+        // default addResultSnapshot method. Always copies the data
         void addResultSnapshot(ResultEntityT& result, const EntitySnapshotT& snapshot) const override
         {
             ResultSnapshotT s;
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/wm/detail/EntityQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/wm/detail/EntityQueryProcessorBase.h
index faa3fe544..5fbd2300c 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/wm/detail/EntityQueryProcessorBase.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/wm/detail/EntityQueryProcessorBase.h
@@ -2,6 +2,7 @@
 
 #include "../../base/EntityQueryProcessorBase.h"
 
+#include <ArmarXCore/core/logging/Logging.h>
 
 namespace armarx::armem::server::query_proc::wm::detail
 {
@@ -32,7 +33,12 @@ namespace armarx::armem::server::query_proc::wm::detail
     protected:
         void addResultSnapshot(ResultEntityT& result, const EntitySnapshotT& snapshot) const override
         {
-            result.addSnapshot(snapshot);
+            snapshot.forEachInstance([](const typename EntitySnapshotT::EntityInstanceT& instance)
+            {
+                instance.metadata().access();
+            });
+            EntitySnapshotT copy = snapshot;
+            result.addSnapshot(std::move(copy));
         }
     };
 }
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h b/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h
index 27e88e828..312a39896 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h
@@ -53,15 +53,21 @@ namespace armarx::armem::server::query_proc::wm::detail
             bool withData = (dataMode == armem::query::DataMode::WithData);
             if (withData)
             {
-                result.addSnapshot(server::wm::EntitySnapshot{ snapshot });
+                Base::addResultSnapshot(result, snapshot);
             }
             else
             {
+                // 1. access real data
+                snapshot.forEachInstance([](const server::wm::EntityInstance& i)
+                {
+                    i.metadata().access();
+                });
+
+                // 2. create copy and remove data from copy
                 server::wm::EntitySnapshot copy = snapshot;
                 copy.forEachInstance([](server::wm::EntityInstance & i)
                 {
                     i.data() = nullptr;
-                    return true;
                 });
                 result.addSnapshot(std::move(copy));
             }
diff --git a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp
index 17adf356e..00bd50a3d 100644
--- a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp
+++ b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp
@@ -127,7 +127,7 @@ namespace armarx::armem::grasping::segment
             {
                 EntityUpdate& update = commit.add();
                 update.entityID = providerID.withEntityName(info.id().str());
-                update.entityID.timestamp = update.timeArrived = update.referencedTime = update.timeSent = now;
+                update.entityID.timestamp = update.arrivedTime = update.referencedTime = update.sentTime = now;
 
                 update.instancesData =
                 {
diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp
index e95234373..025eb36cc 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp
@@ -50,6 +50,7 @@ namespace armarx::armem::gui::instance
         treeItemMetadata->addChild(new QTreeWidgetItem({"Time Created"}));
         treeItemMetadata->addChild(new QTreeWidgetItem({"Time Sent"}));
         treeItemMetadata->addChild(new QTreeWidgetItem({"Time Arrived"}));
+        treeItemMetadata->addChild(new QTreeWidgetItem({"Time Last Accessed"}));
 
         QList<QTreeWidgetItem*> items = {treeItemInstanceID, treeItemMetadata};
         tree->insertTopLevelItems(0, items);
@@ -112,7 +113,8 @@ namespace armarx::armem::gui::instance
             std::to_string(metadata.confidence),
             armem::toDateTimeMilliSeconds(metadata.referencedTime),
             armem::toDateTimeMilliSeconds(metadata.sentTime),
-            armem::toDateTimeMilliSeconds(metadata.arrivedTime)
+            armem::toDateTimeMilliSeconds(metadata.arrivedTime),
+            armem::toDateTimeMilliSeconds(metadata.lastAccessedTime) + " (" + std::to_string(metadata.accessed) + " times total)"
         };
         ARMARX_CHECK_EQUAL(static_cast<size_t>(treeItemMetadata->childCount()), items.size());
         int i = 0;
diff --git a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.cpp b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.cpp
index 91eb015ab..8ee596b27 100644
--- a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.cpp
@@ -65,7 +65,7 @@ namespace armarx::armem::obj::instance
         e.entityID.providerSegmentName = provider;
         e.entityID.entityName = inst.pose.objectID.dataset + "/" + inst.pose.objectID.className + "/" + inst.pose.objectID.instanceName;
         e.referencedTime = t;
-        e.timeSent = armem::Time::Now();
+        e.sentTime = armem::Time::Now();
         e.instancesData = { inst.toAron() };
 
         auto res = memoryWriter.commit(c);
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
index ad9b5f73e..c841afc4d 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
@@ -95,7 +95,7 @@ namespace armarx::armem::server::obj::clazz
 
             EntityUpdate& update = commit.add();
             update.entityID = providerID.withEntityName(info.id().str());
-            update.timeArrived = update.referencedTime = update.timeSent = now;
+            update.arrivedTime = update.referencedTime = update.sentTime = now;
 
             arondto::ObjectClass objectClass = objectClassFromInfo(info);
             update.instancesData =
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
index f8a6d67c7..b0726c001 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp
@@ -335,7 +335,7 @@ namespace armarx::armem::server::obj::instance
                                             providerName.empty() ? pose.providerName : providerName);
 
             update.entityID = providerID.withEntityName(pose.objectID.str());
-            update.timeArrived = now;
+            update.arrivedTime = now;
             update.referencedTime = pose.timestamp;
             update.confidence = pose.confidence;
 
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
index 8c196a889..7a8f6ae03 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp
@@ -58,7 +58,7 @@ namespace armarx::armem::server::robot_state::description
 
         EntityUpdate update;
         update.entityID = providerID.withEntityName("description");
-        update.timeArrived = update.referencedTime = update.timeSent = now;
+        update.arrivedTime = update.referencedTime = update.sentTime = now;
 
         arondto::RobotDescription dto;
         robot::toAron(dto, robotDescription);
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
index 522583f12..a503bae53 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp
@@ -187,7 +187,7 @@ namespace armarx::armem::server::robot_state::localization
 
         EntityUpdate update;
         update.entityID = providerID.withEntityName(transform.header.parentFrame + "," + transform.header.frame);
-        update.timeArrived = update.referencedTime = update.timeSent = timestamp;
+        update.arrivedTime = update.referencedTime = update.sentTime = timestamp;
 
         arondto::Transform aronTransform;
         toAron(aronTransform, transform);
-- 
GitLab