From cd45220de4d5a8774c14f71e0ae93a5943104261 Mon Sep 17 00:00:00 2001 From: "fabian.peller-konrad@kit.edu" <fabian.peller-konrad@kit.edu> Date: Thu, 22 Apr 2021 18:06:23 +0200 Subject: [PATCH] changes to query proc --- source/RobotAPI/interface/armem/io.ice | 27 +-- .../armem/server/LoadingMemoryInterface.ice | 2 +- .../RobotAPI/libraries/armem/CMakeLists.txt | 47 +++-- .../libraries/armem/client/Reader.cpp | 30 ++- .../RobotAPI/libraries/armem/client/Reader.h | 14 +- .../libraries/armem/core/base/CoreSegment.h | 52 ++---- .../libraries/armem/core/base/Entity.h | 55 ++---- .../armem/core/base/EntityInstance.h | 13 +- .../armem/core/base/EntitySnapshot.h | 40 ++-- .../libraries/armem/core/base/Memory.h | 63 +++---- .../armem/core/base/ProviderSegment.h | 55 ++---- .../armem/core/base/detail/EntityContainer.h | 13 +- .../core/base/detail/TypedEntityContainer.h | 12 +- .../armem/core/longtermMemory/CoreSegment.cpp | 34 +++- .../armem/core/longtermMemory/CoreSegment.h | 13 +- .../armem/core/longtermMemory/Entity.cpp | 26 +++ .../armem/core/longtermMemory/Entity.h | 11 ++ .../core/longtermMemory/EntityInstance.cpp | 13 +- .../core/longtermMemory/EntityInstance.h | 10 + .../core/longtermMemory/EntitySnapshot.cpp | 23 +++ .../core/longtermMemory/EntitySnapshot.h | 11 ++ .../armem/core/longtermMemory/Memory.cpp | 31 ++++ .../armem/core/longtermMemory/Memory.h | 20 +- .../core/longtermMemory/ProviderSegment.cpp | 33 +++- .../core/longtermMemory/ProviderSegment.h | 13 +- .../longtermMemory/detail/EntityContainer.h | 4 +- .../detail/TypedEntityContainer.h | 4 +- .../core/longtermMemory/ice_conversions.cpp | 0 .../core/longtermMemory/ice_conversions.h | 0 .../mongodb/MongoDBConnectionManager.h | 54 ++++++ .../armem/core/workingMemory/CoreSegment.cpp | 8 +- .../armem/core/workingMemory/CoreSegment.h | 5 +- .../armem/core/workingMemory/Entity.h | 3 + .../armem/core/workingMemory/EntityInstance.h | 2 + .../armem/core/workingMemory/EntitySnapshot.h | 3 + .../armem/core/workingMemory/Memory.h | 5 +- .../core/workingMemory/ProviderSegment.cpp | 8 +- .../core/workingMemory/ProviderSegment.h | 5 +- .../workingMemory/detail/EntityContainer.h | 4 +- .../detail/TypedEntityContainer.h | 4 +- .../armem/server/ComponentPlugin.cpp | 15 +- .../libraries/armem/server/ComponentPlugin.h | 8 +- .../armem/server/MemoryToIceAdapter.cpp | 14 +- .../armem/server/MemoryToIceAdapter.h | 2 +- .../query_proc/CoreSegmentQueryProcessor.cpp | 79 -------- .../query_proc/CoreSegmentQueryProcessor.h | 45 ----- .../query_proc/EntityQueryProcessor.cpp | 159 ---------------- .../server/query_proc/EntityQueryProcessor.h | 50 ----- .../query_proc/MemoryQueryProcessor.cpp | 88 --------- .../server/query_proc/MemoryQueryProcessor.h | 49 ----- .../ProviderSegmentQueryProcessor.cpp | 79 -------- .../ProviderSegmentQueryProcessor.h | 45 ----- .../{ => base}/BaseQueryProcessor.cpp | 0 .../{ => base}/BaseQueryProcessor.h | 20 +- .../base/CoreSegmentQueryProcessor.cpp | 14 ++ .../base/CoreSegmentQueryProcessor.h | 97 ++++++++++ .../query_proc/base/EntityQueryProcessor.cpp | 13 ++ .../query_proc/base/EntityQueryProcessor.h | 172 ++++++++++++++++++ .../query_proc/base/MemoryQueryProcessor.cpp | 15 ++ .../query_proc/base/MemoryQueryProcessor.h | 94 ++++++++++ .../base/ProviderSegmentQueryProcessor.cpp | 15 ++ .../base/ProviderSegmentQueryProcessor.h | 95 ++++++++++ .../longtermMemory/BaseQueryProcessor.cpp | 13 ++ .../longtermMemory/BaseQueryProcessor.h | 26 +++ .../CoreSegmentQueryProcessor.cpp | 14 ++ .../CoreSegmentQueryProcessor.h | 37 ++++ .../longtermMemory/EntityQueryProcessor.cpp | 13 ++ .../longtermMemory/EntityQueryProcessor.h | 39 ++++ .../longtermMemory/MemoryQueryProcessor.cpp | 15 ++ .../longtermMemory/MemoryQueryProcessor.h | 36 ++++ .../ProviderSegmentQueryProcessor.cpp | 15 ++ .../ProviderSegmentQueryProcessor.h | 38 ++++ .../workingMemory/BaseQueryProcessor.cpp | 13 ++ .../workingMemory/BaseQueryProcessor.h | 28 +++ .../CoreSegmentQueryProcessor.cpp | 14 ++ .../workingMemory/CoreSegmentQueryProcessor.h | 43 +++++ .../workingMemory/EntityQueryProcessor.cpp | 13 ++ .../workingMemory/EntityQueryProcessor.h | 52 ++++++ .../workingMemory/MemoryQueryProcessor.cpp | 15 ++ .../workingMemory/MemoryQueryProcessor.h | 59 ++++++ .../ProviderSegmentQueryProcessor.cpp | 15 ++ .../ProviderSegmentQueryProcessor.h | 42 +++++ .../libraries/armem/test/ArMemQueryTest.cpp | 6 +- .../libraries/armem_gui/LTMControlWidget.cpp | 37 +--- .../libraries/armem_gui/LTMControlWidget.h | 15 +- .../libraries/armem_gui/MemoryViewer.cpp | 43 ++--- .../libraries/armem_gui/MemoryViewer.h | 7 +- 87 files changed, 1588 insertions(+), 998 deletions(-) delete mode 100644 source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.cpp delete mode 100644 source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.h create mode 100644 source/RobotAPI/libraries/armem/core/longtermMemory/mongodb/MongoDBConnectionManager.h delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.cpp delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.h delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.cpp delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.h delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.cpp delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.h delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.cpp delete mode 100644 source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.h rename source/RobotAPI/libraries/armem/server/query_proc/{ => base}/BaseQueryProcessor.cpp (100%) rename source/RobotAPI/libraries/armem/server/query_proc/{ => base}/BaseQueryProcessor.h (84%) create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.h create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.cpp create mode 100644 source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.h diff --git a/source/RobotAPI/interface/armem/io.ice b/source/RobotAPI/interface/armem/io.ice index 853e8c1c8..f721edfad 100644 --- a/source/RobotAPI/interface/armem/io.ice +++ b/source/RobotAPI/interface/armem/io.ice @@ -10,31 +10,11 @@ module armarx { module data { - struct LoadInput - { - armarx::data::PackagePath packagePath; - armem::query::data::Input query; - }; - - struct LoadResult - { - bool success = false; - long timeStartedMicroSeconds; - long timeFinishedMicroSeconds; - - long numLoadedCoreSegments; - long numLoadedProviderSegments; - long numLoadedEntities; - long numLoadedEntitySnapshots; - - string errorMessage; - }; - struct StoreInput { - armarx::data::PackagePath packagePath; armem::query::data::Input query; }; + sequence<StoreInput> StoreInputSeq; struct StoreResult { @@ -42,11 +22,6 @@ module armarx long timeStartedMicroSeconds; long timeFinishedMicroSeconds; - long numStoredCoreSegments; - long numStoredLoadedProviderSegments; - long numStoredLoadedEntities; - long numStoredLoadedEntitySnapshots; - string errorMessage; }; }; diff --git a/source/RobotAPI/interface/armem/server/LoadingMemoryInterface.ice b/source/RobotAPI/interface/armem/server/LoadingMemoryInterface.ice index 0fb10c441..bb1e7f221 100644 --- a/source/RobotAPI/interface/armem/server/LoadingMemoryInterface.ice +++ b/source/RobotAPI/interface/armem/server/LoadingMemoryInterface.ice @@ -11,7 +11,7 @@ module armarx { interface LoadingMemoryInterface { - data::LoadResult load(data::LoadInput input); + armem::query::data::Result load(armem::query::data::Input query); }; }; }; diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt index 7551773bf..1f9fad1f9 100644 --- a/source/RobotAPI/libraries/armem/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem/CMakeLists.txt @@ -42,7 +42,6 @@ set(LIB_FILES core/workingMemory/Memory.cpp core/workingMemory/ProviderSegment.cpp - core/longtermMemory/ice_conversions.cpp core/longtermMemory/CoreSegment.cpp core/longtermMemory/Entity.cpp core/longtermMemory/EntityInstance.cpp @@ -67,11 +66,23 @@ set(LIB_FILES server/MemoryRemoteGui.cpp server/RemoteGuiAronDataVisitor.cpp - server/query_proc/BaseQueryProcessor.cpp - server/query_proc/EntityQueryProcessor.cpp - server/query_proc/ProviderSegmentQueryProcessor.cpp - server/query_proc/CoreSegmentQueryProcessor.cpp - server/query_proc/MemoryQueryProcessor.cpp + server/query_proc/base/BaseQueryProcessor.cpp + server/query_proc/base/EntityQueryProcessor.cpp + server/query_proc/base/ProviderSegmentQueryProcessor.cpp + server/query_proc/base/CoreSegmentQueryProcessor.cpp + server/query_proc/base/MemoryQueryProcessor.cpp + + server/query_proc/workingMemory/BaseQueryProcessor.cpp + server/query_proc/workingMemory/EntityQueryProcessor.cpp + server/query_proc/workingMemory/ProviderSegmentQueryProcessor.cpp + server/query_proc/workingMemory/CoreSegmentQueryProcessor.cpp + server/query_proc/workingMemory/MemoryQueryProcessor.cpp + + server/query_proc/longtermMemory/BaseQueryProcessor.cpp + server/query_proc/longtermMemory/EntityQueryProcessor.cpp + server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.cpp + server/query_proc/longtermMemory/CoreSegmentQueryProcessor.cpp + server/query_proc/longtermMemory/MemoryQueryProcessor.cpp mns/MemoryNameSystem.cpp mns/ClientPlugin.cpp @@ -122,13 +133,13 @@ set(LIB_HEADERS core/longtermMemory/detail/EntityContainer.h core/longtermMemory/detail/TypedEntityContainer.h - core/longtermMemory/ice_conversions.h core/longtermMemory/CoreSegment.h core/longtermMemory/Entity.h core/longtermMemory/EntityInstance.h core/longtermMemory/EntitySnapshot.h core/longtermMemory/Memory.h core/longtermMemory/ProviderSegment.h + core/longtermMemory/mongodb/MongoDBConnectionManager.h client.h client/ComponentPlugin.h @@ -151,11 +162,23 @@ set(LIB_HEADERS server/RemoteGuiAronDataVisitor.h server/query_proc.h - server/query_proc/BaseQueryProcessor.h - server/query_proc/EntityQueryProcessor.h - server/query_proc/ProviderSegmentQueryProcessor.h - server/query_proc/CoreSegmentQueryProcessor.h - server/query_proc/MemoryQueryProcessor.h + server/query_proc/base/BaseQueryProcessor.h + server/query_proc/base/EntityQueryProcessor.h + server/query_proc/base/ProviderSegmentQueryProcessor.h + server/query_proc/base/CoreSegmentQueryProcessor.h + server/query_proc/base/MemoryQueryProcessor.h + + server/query_proc/workingMemory/BaseQueryProcessor.h + server/query_proc/workingMemory/EntityQueryProcessor.h + server/query_proc/workingMemory/ProviderSegmentQueryProcessor.h + server/query_proc/workingMemory/CoreSegmentQueryProcessor.h + server/query_proc/workingMemory/MemoryQueryProcessor.h + + server/query_proc/longtermMemory/BaseQueryProcessor.h + server/query_proc/longtermMemory/EntityQueryProcessor.h + server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.h + server/query_proc/longtermMemory/CoreSegmentQueryProcessor.h + server/query_proc/longtermMemory/MemoryQueryProcessor.h mns.h mns/MemoryNameSystem.h diff --git a/source/RobotAPI/libraries/armem/client/Reader.cpp b/source/RobotAPI/libraries/armem/client/Reader.cpp index 8c336da2f..ac6eb489b 100644 --- a/source/RobotAPI/libraries/armem/client/Reader.cpp +++ b/source/RobotAPI/libraries/armem/client/Reader.cpp @@ -9,7 +9,7 @@ namespace armarx::armem::client { - Reader::Reader(server::ReadingMemoryInterfacePrx memory) : memory(memory) + Reader::Reader(server::ReadingMemoryInterfacePrx memory) : memoryPrx(memory) { } @@ -33,7 +33,7 @@ namespace armarx::armem::client armem::query::data::Result result; try { - result = memory->query(input); + result = memoryPrx->query(input); } catch (const Ice::ConnectionRefusedException& e) { @@ -63,7 +63,7 @@ namespace armarx::armem::client return this->query(input); } - QueryResult Reader::getAll(DataMode dataMode) + QueryResult Reader::getAll(DataMode dataMode) const { using namespace client::query_fns; @@ -73,7 +73,7 @@ namespace armarx::armem::client return this->query(qb.buildQueryInput()); } - QueryResult Reader::getLatestSnapshots(DataMode dataMode) + QueryResult Reader::getLatestSnapshots(DataMode dataMode) const { using namespace client::query_fns; @@ -84,7 +84,7 @@ namespace armarx::armem::client } void - Reader::updated(const std::vector<MemoryID>& updatedSnapshotIDs) + Reader::updated(const std::vector<MemoryID>& updatedSnapshotIDs) const { for (const auto& [subscription, callback] : callbacks) { @@ -105,6 +105,24 @@ namespace armarx::armem::client } } + data::StoreResult + Reader::readAndStore(const data::StoreInput& input) const + { + ARMARX_IMPORTANT << "Trying to cast the proxy!"; + server::StoringMemoryInterfacePrx storingMemoryPrx = server::StoringMemoryInterfacePrx::uncheckedCast(memoryPrx); + ARMARX_IMPORTANT << "Uncehcked cast done."; + if (storingMemoryPrx) + { + + return storingMemoryPrx->store(input); + } + else + { + ARMARX_WARNING << "Could not store a query into the LTM. It seems like the Memory does not implement the StoringMemoryInterface."; + return {}; + } + } + void Reader::subscribe(const MemoryID& id, callback callback) @@ -116,7 +134,7 @@ namespace armarx::armem::client void Reader::setReadingMemory(server::ReadingMemoryInterfacePrx memory) { - this->memory = memory; + this->memoryPrx = memory; } } diff --git a/source/RobotAPI/libraries/armem/client/Reader.h b/source/RobotAPI/libraries/armem/client/Reader.h index 8164cc7f7..17076216a 100644 --- a/source/RobotAPI/libraries/armem/client/Reader.h +++ b/source/RobotAPI/libraries/armem/client/Reader.h @@ -8,6 +8,7 @@ // RobotAPI #include <RobotAPI/interface/armem/server/ReadingMemoryInterface.h> +#include <RobotAPI/interface/armem/server/StoringMemoryInterface.h> #include <RobotAPI/interface/armem/client/MemoryListenerInterface.h> #include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> #include <RobotAPI/libraries/armem/core/workingMemory/Memory.h> @@ -39,7 +40,6 @@ namespace armarx::armem::client void setReadingMemory(server::ReadingMemoryInterfacePrx memory); - QueryResult query(const QueryInput& input) const; armem::query::data::Result query(const armem::query::data::Input& input) const; @@ -47,9 +47,11 @@ namespace armarx::armem::client QueryResult query(const armem::query::data::MemoryQuerySeq& queries, DataMode dataMode = DataMode::WithData) const; - QueryResult getAll(DataMode dataMode = DataMode::WithData); - QueryResult getLatestSnapshots(DataMode dataMode = DataMode::WithData); + QueryResult getAll(DataMode dataMode = DataMode::WithData) const; + QueryResult getLatestSnapshots(DataMode dataMode = DataMode::WithData) const; + //data::StoreResult readAndStore(data::StoreInputSeq& input); + data::StoreResult readAndStore(const data::StoreInput& input) const; void subscribe(const MemoryID& subscriptionID, callback callback); /** @@ -68,17 +70,17 @@ namespace armarx::armem::client subscribe(subscriptionID, cb); } /// Function handling updates from the MemoryListener ice topic. - void updated(const std::vector<MemoryID>& updatedIDs); + void updated(const std::vector<MemoryID>& updatedIDs) const; inline operator bool() const { - return bool(memory); + return bool(memoryPrx); } public: - server::ReadingMemoryInterfacePrx memory; + server::ReadingMemoryInterfacePrx memoryPrx; private: diff --git a/source/RobotAPI/libraries/armem/core/base/CoreSegment.h b/source/RobotAPI/libraries/armem/core/base/CoreSegment.h index 64223917a..f0f02976d 100644 --- a/source/RobotAPI/libraries/armem/core/base/CoreSegment.h +++ b/source/RobotAPI/libraries/armem/core/base/CoreSegment.h @@ -14,38 +14,16 @@ namespace armarx::armem /** * @brief Data of a core segment containing multiple provider segments. */ - template <class _ProviderSegmentT, class _EntityT, class _EntitySnapshotT, class _EntityInstanceT, class Derived> + template <class _ProviderSegmentT, class Derived> class CoreSegmentBase : - virtual public detail::TypedEntityContainerBase<_ProviderSegmentT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>, + virtual public detail::TypedEntityContainerBase<_ProviderSegmentT, typename _ProviderSegmentT::EntityT, Derived>, virtual public armarx::armem::detail::MaxHistorySize { - using Base = detail::TypedEntityContainerBase<_ProviderSegmentT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>; + using Base = detail::TypedEntityContainerBase<_ProviderSegmentT, typename _ProviderSegmentT::EntityT, Derived>; - public: - using ProviderSegmentT = _ProviderSegmentT; - using EntityT = _EntityT; + using _EntityT = typename _ProviderSegmentT::EntityT; public: - /*CoreSegmentBase(); - CoreSegmentBase(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) : - CoreSegmentBase(name, MemoryID(), aronType) - { - } - - CoreSegmentBase(const std::string& name, const MemoryID& parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) : - CoreSegmentBase(parentID.getMemoryID().withCoreSegmentName(name), aronType) - { - } - - CoreSegmentBase(const MemoryID& id, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) : - Base(id, aronType) - { - } - - CoreSegmentBase(const CoreSegmentBase& other) : Base(other) - { - // *this = other; - }*/ CoreSegmentBase& operator=(const CoreSegmentBase& other) { @@ -65,13 +43,13 @@ namespace armarx::armem using Base::container; - inline const std::map<std::string, ProviderSegmentT>& providerSegments() const + inline const std::map<std::string, _ProviderSegmentT>& providerSegments() const { return container; } - inline std::map<std::string, ProviderSegmentT>& providerSegments() + inline std::map<std::string, _ProviderSegmentT>& providerSegments() { - return const_cast<std::map<std::string, ProviderSegmentT>&>(const_cast<const CoreSegmentBase*>(this)->providerSegments()); + return const_cast<std::map<std::string, _ProviderSegmentT>&>(const_cast<const CoreSegmentBase*>(this)->providerSegments()); } @@ -80,12 +58,12 @@ namespace armarx::armem return container.count(name) > 0; } - ProviderSegmentT& getProviderSegment(const std::string& name) + _ProviderSegmentT& getProviderSegment(const std::string& name) { - return const_cast<ProviderSegmentT&>(const_cast<const CoreSegmentBase*>(this)->getProviderSegment(name)); + return const_cast<_ProviderSegmentT&>(const_cast<const CoreSegmentBase*>(this)->getProviderSegment(name)); } - const ProviderSegmentT& getProviderSegment(const std::string& name) const + const _ProviderSegmentT& getProviderSegment(const std::string& name) const { auto it = this->container.find(name); if (it != container.end()) @@ -99,7 +77,7 @@ namespace armarx::armem } using Base::_checkContainerName; - const EntityT& getEntity(const MemoryID& id) const override + const _EntityT& getEntity(const MemoryID& id) const override { _checkContainerName(id.coreSegmentName, this->getKeyString()); return getProviderSegment(id.providerSegmentName).getEntity(id); @@ -126,20 +104,20 @@ namespace armarx::armem * @param providerSegmentType The provider type. If nullptr, the core segment type is used. * @return The added provider segment. */ - ProviderSegmentT& addProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr providerSegmentType = nullptr) + _ProviderSegmentT& addProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr providerSegmentType = nullptr) { aron::typenavigator::ObjectNavigatorPtr type = providerSegmentType ? providerSegmentType : this->aronType; - return addProviderSegment(ProviderSegmentT(name, type)); + return addProviderSegment(_ProviderSegmentT(name, type)); } /// Copy and insert a provider segment. - ProviderSegmentT& addProviderSegment(const ProviderSegmentT& providerSegment) + _ProviderSegmentT& addProviderSegment(const _ProviderSegmentT& providerSegment) { return addProviderSegment(ProviderSegment(providerSegment)); } /// Move and insert a provider segment. - ProviderSegmentT& addProviderSegment(ProviderSegmentT&& providerSegment) + _ProviderSegmentT& addProviderSegment(_ProviderSegmentT&& providerSegment) { if (hasProviderSegment(providerSegment.name())) { diff --git a/source/RobotAPI/libraries/armem/core/base/Entity.h b/source/RobotAPI/libraries/armem/core/base/Entity.h index 05cd45008..f52944ccc 100644 --- a/source/RobotAPI/libraries/armem/core/base/Entity.h +++ b/source/RobotAPI/libraries/armem/core/base/Entity.h @@ -41,29 +41,6 @@ namespace armarx::armem using Base = detail::MemoryContainerBase<std::map<Time, _EntitySnapshotT>, Derived>; public: - using EntitySnapshotT = _EntitySnapshotT; - - - public: - - /*EntityBase() - {} - - EntityBase(const std::string& name, const MemoryID& parentID = {}) : - EntityBase(parentID.withEntityName(name)) - {} - - EntityBase(const MemoryID& id) : - Base(id) - {} - - /// Copy the history from `other` to this. - EntityBase(const EntityBase& other) : - Base(id) - { - // *this = other; - }*/ - EntityBase& operator=(const EntityBase& other) { other._copySelf(*this); @@ -149,12 +126,12 @@ namespace armarx::armem * @throws `armem::error::MissingEntry` If there is no such entry. * @throws `armem::error::MissingData` If the entry has no data. */ - EntitySnapshotT& getSnapshot(Time time) + _EntitySnapshotT& getSnapshot(Time time) { - return const_cast<EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getSnapshot(time)); + return const_cast<_EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getSnapshot(time)); } - const EntitySnapshotT& getSnapshot(Time time) const + const _EntitySnapshotT& getSnapshot(Time time) const { auto it = container.find(time); if (it != container.end()) @@ -167,12 +144,12 @@ namespace armarx::armem } } - EntitySnapshotT& getSnapshot(const MemoryID& id) + _EntitySnapshotT& getSnapshot(const MemoryID& id) { - return const_cast<EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getSnapshot(id)); + return const_cast<_EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getSnapshot(id)); } - const EntitySnapshotT& getSnapshot(const MemoryID& id) const + const _EntitySnapshotT& getSnapshot(const MemoryID& id) const { checkEntityName(id.entityName); return getSnapshot(id.timestamp); @@ -184,12 +161,12 @@ namespace armarx::armem * @throw `armem::error::EntityHistoryEmpty` If the history is empty. * @throw `armem::error::MissingData` If the latest snapshot has no data. */ - EntitySnapshotT& getLatestSnapshot() + _EntitySnapshotT& getLatestSnapshot() { - return const_cast<EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getLatestSnapshot()); + return const_cast<_EntitySnapshotT&>(const_cast<const EntityBase*>(this)->getLatestSnapshot()); } - const EntitySnapshotT& getLatestSnapshot() const + const _EntitySnapshotT& getLatestSnapshot() const { return getLatestItem().second; } @@ -205,7 +182,7 @@ namespace armarx::armem checkEntityName(update.entityID.entityName); id = update.entityID; - EntitySnapshotT* snapshot; + _EntitySnapshotT* snapshot; auto it = container.find(update.timeCreated); if (it == container.end()) @@ -229,21 +206,21 @@ namespace armarx::armem * @param snapshot The snapshot. * @return The stored snapshot. */ - EntitySnapshotT& addSnapshot(const EntitySnapshotT& snapshot) + _EntitySnapshotT& addSnapshot(const _EntitySnapshotT& snapshot) { - return addSnapshot(EntitySnapshotT(snapshot)); + return addSnapshot(_EntitySnapshotT(snapshot)); } - EntitySnapshotT& addSnapshot(EntitySnapshotT&& snapshot) + _EntitySnapshotT& addSnapshot(_EntitySnapshotT&& snapshot) { auto it = container.emplace(snapshot.time(), std::move(snapshot)).first; it->second.id.setEntityID(id); return it->second; } - EntitySnapshotT& addSnapshot(const Time& timestamp) + _EntitySnapshotT& addSnapshot(const Time& timestamp) { - return addSnapshot(EntitySnapshotT(timestamp)); + return addSnapshot(_EntitySnapshotT(timestamp)); } @@ -319,7 +296,7 @@ namespace armarx::armem * @return The latest snapshot. * @throw `armem::error::EntityHistoryEmpty` If the history is empty. */ - const typename std::map<Time, EntitySnapshotT>::value_type& getLatestItem() const + const typename std::map<Time, _EntitySnapshotT>::value_type& getLatestItem() const { if (container.empty()) { diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstance.h b/source/RobotAPI/libraries/armem/core/base/EntityInstance.h index f6d3e3baa..32f6bdbbd 100644 --- a/source/RobotAPI/libraries/armem/core/base/EntityInstance.h +++ b/source/RobotAPI/libraries/armem/core/base/EntityInstance.h @@ -16,23 +16,12 @@ namespace armarx::armem */ template <class Derived> class EntityInstanceBase : - virtual public armarx::armem::detail::MemoryItem + virtual public armarx::armem::detail::MemoryItem { using Base = armarx::armem::detail::MemoryItem; public: - /*EntityInstanceBase() - {} - - EntityInstanceBase(int index, const MemoryID& parentID = {}) : - EntityInstanceBase(parentID.withInstanceIndex(index)) - {} - - EntityInstanceBase(const MemoryID& id) : - Base(id) - {}*/ - EntityInstanceBase& operator=(const EntityInstanceBase& other) { //other._copySelf(*this); diff --git a/source/RobotAPI/libraries/armem/core/base/EntitySnapshot.h b/source/RobotAPI/libraries/armem/core/base/EntitySnapshot.h index e4b527b6e..341b1e448 100644 --- a/source/RobotAPI/libraries/armem/core/base/EntitySnapshot.h +++ b/source/RobotAPI/libraries/armem/core/base/EntitySnapshot.h @@ -22,24 +22,6 @@ namespace armarx::armem using Base = detail::MemoryContainerBase<std::vector<_EntityInstanceT>, Derived>; public: - using EntityInstanceT = _EntityInstanceT; - - public: - /*EntitySnapshotBase() - {} - - EntitySnapshotBase(Time time, const MemoryID& parentID = {}) : - EntitySnapshotBase(parentID.withTimestamp(time)) - {} - - EntitySnapshotBase(const MemoryID& id) : Base(id) - {} - - /// Copy the container from `other` to this. - EntitySnapshotBase(const EntitySnapshotBase& other) : Base(other) - { - // *this = other; - }*/ EntitySnapshotBase& operator=(const EntitySnapshotBase& other) { @@ -101,7 +83,7 @@ namespace armarx::armem container.clear(); for (int i = 0; i < int(update.instancesData.size()); ++i) { - EntityInstanceT& data = container.emplace_back(i, id); + _EntityInstanceT& data = container.emplace_back(i, id); data.update(update, i); } } @@ -119,12 +101,12 @@ namespace armarx::armem * @return The instance. * @throw `armem::error::MissingEntry` If the given index is invalid. */ - EntityInstanceT& getInstance(int index) + _EntityInstanceT& getInstance(int index) { - return const_cast<EntityInstanceT&>(const_cast<const EntitySnapshotBase*>(this)->getInstance(index)); + return const_cast<_EntityInstanceT&>(const_cast<const EntitySnapshotBase*>(this)->getInstance(index)); } - const EntityInstanceT& getInstance(int index) const + const _EntityInstanceT& getInstance(int index) const { if (hasInstance(index)) { @@ -133,7 +115,7 @@ namespace armarx::armem } else { - throw armem::error::MissingEntry(EntityInstanceT().getLevelName(), std::to_string(index), getLevelName(), toDateTimeMilliSeconds(time())); + throw armem::error::MissingEntry(_EntityInstanceT().getLevelName(), std::to_string(index), getLevelName(), toDateTimeMilliSeconds(time())); } } @@ -144,12 +126,12 @@ namespace armarx::armem * @throw `armem::error::MissingEntry` If the given index is invalid. * @throw `armem::error::InvalidMemoryID` If memory ID does not have an instance index. */ - EntityInstanceT& getInstance(const MemoryID& id) + _EntityInstanceT& getInstance(const MemoryID& id) { - return const_cast<EntityInstanceT&>(const_cast<const EntitySnapshotBase*>(this)->getInstance(id)); + return const_cast<_EntityInstanceT&>(const_cast<const EntitySnapshotBase*>(this)->getInstance(id)); } - const EntityInstanceT& getInstance(const MemoryID& id) const + const _EntityInstanceT& getInstance(const MemoryID& id) const { if (!id.hasInstanceIndex()) { @@ -165,12 +147,12 @@ namespace armarx::armem * @return The stored instance. * @throw `armem::error::InvalidArgument` If the given index is invalid. Must be equal to container.size() or -1 (meaning push_back) */ - EntityInstanceT& addInstance(const EntityInstanceT& instance) + _EntityInstanceT& addInstance(const _EntityInstanceT& instance) { - return addInstance(EntityInstanceT(instance)); + return addInstance(_EntityInstanceT(instance)); } - EntityInstanceT& addInstance(EntityInstanceT&& instance) + _EntityInstanceT& addInstance(_EntityInstanceT&& instance) { if (instance.index() > 0 && (size_t) instance.index() < container.size()) { diff --git a/source/RobotAPI/libraries/armem/core/base/Memory.h b/source/RobotAPI/libraries/armem/core/base/Memory.h index cf1a18020..99e820796 100644 --- a/source/RobotAPI/libraries/armem/core/base/Memory.h +++ b/source/RobotAPI/libraries/armem/core/base/Memory.h @@ -3,7 +3,7 @@ #include <map> #include <string> -#include "ProviderSegment.h" +#include "CoreSegment.h" #include "detail/EntityContainer.h" namespace armarx::armem @@ -12,36 +12,15 @@ namespace armarx::armem /** * @brief Data of a memory consisting of multiple core segments. */ - template <class _CoreSegmentT, class _EntityT, class _EntitySnapshotT, class _EntityInstanceT, class Derived> + template <class _CoreSegmentT, class Derived> class MemoryBase : - virtual public detail::EntityContainerBase<_CoreSegmentT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived> + virtual public detail::EntityContainerBase<_CoreSegmentT, typename _CoreSegmentT::ProviderSegmentT::EntityT, Derived> { - using Base = detail::EntityContainerBase<_CoreSegmentT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>; + using Base = detail::EntityContainerBase<_CoreSegmentT, typename _CoreSegmentT::ProviderSegmentT::EntityT, Derived>; - public: - using CoreSegmentT = _CoreSegmentT; - using EntityT = _EntityT; + using _EntityT = typename _CoreSegmentT::ProviderSegmentT::EntityT; public: - /*MemoryBase() - {} - - MemoryBase(const std::string& name) : - MemoryBase(MemoryID().withMemoryName(name)) - { - } - - MemoryBase(const MemoryID& id) : - Base(id) - { - } - - MemoryBase(const MemoryBase& other) : - Base(other) - { - // *this = other; - }*/ - MemoryBase& operator=(const MemoryBase& other) { other._copySelf(*this); @@ -60,13 +39,13 @@ namespace armarx::armem using Base::container; - inline const std::map<std::string, CoreSegmentT>& coreSegments() const + inline const std::map<std::string, _CoreSegmentT>& coreSegments() const { return container; } - inline std::map<std::string, CoreSegmentT>& coreSegments() + inline std::map<std::string, _CoreSegmentT>& coreSegments() { - return const_cast<std::map<std::string, CoreSegmentT>&>(const_cast<const MemoryBase*>(this)->coreSegments()); + return const_cast<std::map<std::string, _CoreSegmentT>&>(const_cast<const MemoryBase*>(this)->coreSegments()); } @@ -75,12 +54,12 @@ namespace armarx::armem return container.count(name) > 0; } - CoreSegmentT& getCoreSegment(const std::string& name) + _CoreSegmentT& getCoreSegment(const std::string& name) { - return const_cast<CoreSegmentT&>(const_cast<const MemoryBase*>(this)->getCoreSegment(name)); + return const_cast<_CoreSegmentT&>(const_cast<const MemoryBase*>(this)->getCoreSegment(name)); } - const CoreSegmentT& getCoreSegment(const std::string& name) const + const _CoreSegmentT& getCoreSegment(const std::string& name) const { auto it = this->container.find(name); if (it != container.end()) @@ -89,12 +68,12 @@ namespace armarx::armem } else { - throw armem::error::MissingEntry(CoreSegmentT().getLevelName(), name, getLevelName(), this->name()); + throw armem::error::MissingEntry(_CoreSegmentT().getLevelName(), name, getLevelName(), this->name()); } } using Base::_checkContainerName; - const EntityT& getEntity(const MemoryID& id) const override + const _EntityT& getEntity(const MemoryID& id) const override { _checkContainerName(id.memoryName, this->name()); return getCoreSegment(id.coreSegmentName).getEntity(id); @@ -106,17 +85,17 @@ namespace armarx::armem * @param coreSegmentType The core segment type (optional). * @return The added core segment. */ - CoreSegmentT& addCoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr coreSegmentType = nullptr) + _CoreSegmentT& addCoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr coreSegmentType = nullptr) { - return addCoreSegment(CoreSegmentT(name, coreSegmentType)); + return addCoreSegment(_CoreSegmentT(name, coreSegmentType)); } /// Copy and insert a core segment. - CoreSegmentT& addCoreSegment(const CoreSegmentT& coreSegment) + _CoreSegmentT& addCoreSegment(const _CoreSegmentT& coreSegment) { - return addCoreSegment(CoreSegmentT(coreSegment)); + return addCoreSegment(_CoreSegmentT(coreSegment)); } /// Move and insert a core segment. - CoreSegmentT& addCoreSegment(CoreSegmentT&& coreSegment) + _CoreSegmentT& addCoreSegment(_CoreSegmentT&& coreSegment) { if (container.count(coreSegment.name()) > 0) { @@ -133,9 +112,9 @@ namespace armarx::armem * @param The core segment names. * @return The core segments. The contained pointers are never null. */ - std::vector<CoreSegmentT*> addCoreSegments(const std::vector<std::string>& names) + std::vector<_CoreSegmentT*> addCoreSegments(const std::vector<std::string>& names) { - std::vector<CoreSegmentT*> segments; + std::vector<_CoreSegmentT*> segments; for (const auto& name : names) { try @@ -161,7 +140,7 @@ namespace armarx::armem } else { - throw armem::error::MissingEntry(CoreSegmentT().getLevelName(), update.entityID.coreSegmentName, getLevelName(), this->name()); + throw armem::error::MissingEntry(_CoreSegmentT().getLevelName(), update.entityID.coreSegmentName, getLevelName(), this->name()); } } diff --git a/source/RobotAPI/libraries/armem/core/base/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/base/ProviderSegment.h index 1ef59929b..e2e789c5f 100644 --- a/source/RobotAPI/libraries/armem/core/base/ProviderSegment.h +++ b/source/RobotAPI/libraries/armem/core/base/ProviderSegment.h @@ -14,37 +14,14 @@ namespace armarx::armem /** * @brief Data of a provider segment containing multiple entities. */ - template <class _EntityT, class _EntitySnapshotT, class _EntityInstanceT, class Derived> + template <class _EntityT, class Derived> class ProviderSegmentBase : - virtual public detail::TypedEntityContainerBase<_EntityT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>, + virtual public detail::TypedEntityContainerBase<_EntityT, _EntityT, Derived>, virtual public armarx::armem::detail::MaxHistorySize { - using Base = detail::TypedEntityContainerBase<_EntityT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>; + using Base = detail::TypedEntityContainerBase<_EntityT, _EntityT, Derived>; public: - using EntityT = _EntityT; - - public: - /*ProviderSegmentBase() - {} - - ProviderSegmentBase(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) : - ProviderSegmentBase(name, MemoryID(), aronType) - { - } - ProviderSegmentBase(const std::string& name, const MemoryID parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) : - ProviderSegmentBase(parentID.withProviderSegmentName(name), aronType) - { - } - ProviderSegmentBase(const MemoryID id, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) : - Base(id, aronType) - { - } - - ProviderSegmentBase(const ProviderSegmentBase& other) : Base(other) - { - // *this = other; - }*/ ProviderSegmentBase& operator=(const ProviderSegmentBase& other) { @@ -64,13 +41,13 @@ namespace armarx::armem using Base::container; - inline const std::map<std::string, EntityT>& entities() const + inline const std::map<std::string, _EntityT>& entities() const { return container; } - inline std::map<std::string, EntityT>& entities() + inline std::map<std::string, _EntityT>& entities() { - return const_cast<std::map<std::string, EntityT>&>(const_cast<const ProviderSegmentBase*>(this)->entities()); + return const_cast<std::map<std::string, _EntityT>&>(const_cast<const ProviderSegmentBase*>(this)->entities()); } @@ -80,18 +57,18 @@ namespace armarx::armem } using Base::_checkContainerName; - const EntityT& getEntity(const MemoryID& id) const override + const _EntityT& getEntity(const MemoryID& id) const override { _checkContainerName(id.providerSegmentName, this->getKeyString()); return getEntity(id.entityName); } - EntityT& getEntity(const std::string& name) + _EntityT& getEntity(const std::string& name) { - return const_cast<EntityT&>(const_cast<const ProviderSegmentBase*>(this)->getEntity(name)); + return const_cast<_EntityT&>(const_cast<const ProviderSegmentBase*>(this)->getEntity(name)); } - const EntityT& getEntity(const std::string& name) const + const _EntityT& getEntity(const std::string& name) const { auto it = this->container.find(name); if (it != container.end()) @@ -113,7 +90,7 @@ namespace armarx::armem { _checkContainerName(update.entityID.providerSegmentName, this->name()); - EntityT* entity; + _EntityT* entity; auto it = this->container.find(update.entityID.providerSegmentName); if (it == container.end()) { @@ -130,17 +107,17 @@ namespace armarx::armem } /// Add an empty entity with the given name. - EntityT& addEntity(const std::string& name) + _EntityT& addEntity(const std::string& name) { - return addEntity(EntityT(name)); + return addEntity(_EntityT(name)); } /// Copy and insert an entity. - EntityT& addEntity(const EntityT& entity) + _EntityT& addEntity(const _EntityT& entity) { - return addEntity(EntityT(entity)); + return addEntity(_EntityT(entity)); } /// Move and insert an entity. - EntityT& addEntity(EntityT&& entity) + _EntityT& addEntity(_EntityT&& entity) { auto it = container.emplace(entity.name(), std::move(entity)).first; it->second.id.setProviderSegmentID(id); diff --git a/source/RobotAPI/libraries/armem/core/base/detail/EntityContainer.h b/source/RobotAPI/libraries/armem/core/base/detail/EntityContainer.h index f241353a5..fd2c66107 100644 --- a/source/RobotAPI/libraries/armem/core/base/detail/EntityContainer.h +++ b/source/RobotAPI/libraries/armem/core/base/detail/EntityContainer.h @@ -17,19 +17,16 @@ namespace armarx::armem::detail * * Can be updated by multiple entity updates. */ - template <class _ValueT, class _EntityT, class _EntitySnapshotT, class _EntityInstanceT, class Derived> + template <class _ValueT, class _EntityT, class Derived> class EntityContainerBase : - virtual public MemoryContainerBase<std::map<std::string, _ValueT>, Derived> + virtual public MemoryContainerBase<std::map<std::string, _ValueT>, Derived> { using Base = MemoryContainerBase<std::map<std::string, _ValueT>, Derived>; - public: - /*EntityContainerBase() - {} - EntityContainerBase(const MemoryID& id) : - MemoryItem(id) - {}*/ + using _EntitySnapshotT = typename _EntityT::EntitySnapshotT; + using _EntityInstanceT = typename _EntitySnapshotT::EntityInstanceT; + public: EntityContainerBase& operator=(const EntityContainerBase& other) { other._copySelf(*this); diff --git a/source/RobotAPI/libraries/armem/core/base/detail/TypedEntityContainer.h b/source/RobotAPI/libraries/armem/core/base/detail/TypedEntityContainer.h index f9860959f..3c067aca8 100644 --- a/source/RobotAPI/libraries/armem/core/base/detail/TypedEntityContainer.h +++ b/source/RobotAPI/libraries/armem/core/base/detail/TypedEntityContainer.h @@ -10,19 +10,21 @@ namespace armarx::armem::detail /** * @brief An entity container with a specific (Aron) type. */ - template <class _ValueT, class _EntityT, class _EntitySnapshotT, class _EntityInstanceT, class Derived> + template <class _ValueT, class _EntityT, class Derived> class TypedEntityContainerBase : - virtual public EntityContainerBase<_ValueT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived> + virtual public EntityContainerBase<_ValueT, _EntityT, Derived> { - using Base = EntityContainerBase<_ValueT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>; + using Base = EntityContainerBase<_ValueT, _EntityT, Derived>; - public: + using _EntitySnapshotT = typename _EntityT::EntitySnapshotT; + using _EntityInstanceT = typename _EntitySnapshotT::EntityInstanceT; + public: TypedEntityContainerBase(aron::typenavigator::ObjectNavigatorPtr aronType = nullptr) : aronType(aronType) {} - TypedEntityContainerBase(const TypedEntityContainerBase<_ValueT, _EntityT, _EntitySnapshotT, _EntityInstanceT, Derived>& other) : + TypedEntityContainerBase(const TypedEntityContainerBase<_ValueT, _EntityT, Derived>& other) : MemoryItem(other), MemoryContainerBase<std::map<std::string, _ValueT>, Derived>(other), aronType(other.aronType) diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.cpp index 3d42bbbe5..c4c12bf1a 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.cpp +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.cpp @@ -14,26 +14,26 @@ namespace armarx::armem::longtermmemory CoreSegment::CoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(MemoryID().withCoreSegmentName(name)), - armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(MemoryID().withCoreSegmentName(name), aronType) + armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(MemoryID().withCoreSegmentName(name), aronType) { } CoreSegment::CoreSegment(const std::string& name, const MemoryID& parentID, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(MemoryID().withCoreSegmentName(name)), - armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(parentID.withCoreSegmentName(name), aronType) + armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(parentID.withCoreSegmentName(name), aronType) { } CoreSegment::CoreSegment(const MemoryID& id, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(id), - armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(id, aronType) + armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(id, aronType) { } CoreSegment::CoreSegment(const CoreSegment& other) : armarx::armem::detail::MemoryItem(other), MemoryContainerBase<std::map<std::string, ProviderSegment>, CoreSegment>(other), - armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(other) + armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(other) { } @@ -42,4 +42,30 @@ namespace armarx::armem::longtermmemory other._copySelf(*this); return *this; } + + workingmemory::CoreSegment CoreSegment::convert() const + { + workingmemory::CoreSegment m; + for (const auto& [_, s] : container) + { + m.addProviderSegment(s.convert()); + } + return m; + } + + void CoreSegment::append(const workingmemory::CoreSegment& m) + { + for (const auto& [k, s] : m.container) + { + if (const auto& it = container.find(k); it == container.end()) + { + it->second.append(s); + } + else + { + auto wms = container.emplace(std::make_pair(k, id.withCoreSegmentName(k))); + wms.first->second.append(s); + } + } + } } diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.h b/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.h index c2bc57f8f..ec710907f 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.h +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/CoreSegment.h @@ -5,6 +5,8 @@ #include "ProviderSegment.h" #include "detail/TypedEntityContainer.h" +#include "../workingMemory/CoreSegment.h" + namespace armarx::armem::longtermmemory { @@ -13,10 +15,13 @@ namespace armarx::armem::longtermmemory * @brief Data of a core segment containing multiple provider segments. */ class CoreSegment : - virtual public CoreSegmentBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>, + virtual public CoreSegmentBase<ProviderSegment, CoreSegment>, virtual public detail::TypedEntityContainer<ProviderSegment, CoreSegment> { public: + using Base = CoreSegmentBase<ProviderSegment, CoreSegment>; + using ProviderSegmentT = ProviderSegment; + CoreSegment(); CoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr); CoreSegment(const std::string& name, const MemoryID& parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr); @@ -24,6 +29,12 @@ namespace armarx::armem::longtermmemory CoreSegment(const CoreSegment& other); CoreSegment& operator=(const CoreSegment& other); + + // Conversion + workingmemory::CoreSegment convert() const; + + // MongoDB connection + void append(const workingmemory::CoreSegment&); }; } diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.cpp index 09ea28d25..8e3a50e88 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.cpp +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.cpp @@ -28,4 +28,30 @@ namespace armarx::armem::longtermmemory other._copySelf(*this); return *this; } + + workingmemory::Entity Entity::convert() const + { + workingmemory::Entity m; + for (const auto& [_, s] : container) + { + m.addSnapshot(s.convert()); + } + return m; + } + + void Entity::append(const workingmemory::Entity& m) + { + for (const auto& [k, s] : m.container) + { + if (const auto& it = container.find(k); it == container.end()) + { + it->second.setTo(s); + } + else + { + auto wms = container.emplace(std::make_pair(k, id.withTimestamp(k))); + wms.first->second.setTo(s); + } + } + } } diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.h b/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.h index 7d25e3fc8..967fa2b76 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.h +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/Entity.h @@ -5,6 +5,8 @@ #include "EntitySnapshot.h" #include "detail/MemoryContainer.h" +#include "../workingMemory/Entity.h" + namespace armarx::armem::longtermmemory { @@ -33,6 +35,9 @@ namespace armarx::armem::longtermmemory { public: + using Base = EntityBase<EntitySnapshot, Entity>; + using EntitySnapshotT = EntitySnapshot; + Entity(); Entity(const std::string& name, const MemoryID& parentID = {}); Entity(const MemoryID& id); @@ -41,6 +46,12 @@ namespace armarx::armem::longtermmemory Entity(const Entity& other); /// Copy the history from `other` to this. Entity& operator=(const Entity& other); + + // Conversion + workingmemory::Entity convert() const; + + // MongoDB connection + void append(const workingmemory::Entity&); }; } diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.cpp index e1800f72a..273aa1cb9 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.cpp +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.cpp @@ -40,7 +40,6 @@ namespace armarx::armem::longtermmemory return *this; } - bool EntityInstance::equalsDeep(const EntityInstance& other) const { return id == other.id && _metadata == other.metadata(); @@ -53,7 +52,6 @@ namespace armarx::armem::longtermmemory this->index() = index; this->_metadata.confidence = update.confidence; - this->_metadata.timeCreated = update.timeCreated; this->_metadata.timeSent = update.timeSent; this->_metadata.timeArrived = update.timeArrived; @@ -71,4 +69,15 @@ namespace armarx::armem::longtermmemory EntityInstanceBase<EntityInstance>::_copySelf(other); other._metadata = _metadata; } + + workingmemory::EntityInstance EntityInstance::convert() const + { + workingmemory::EntityInstance m; + return m; + } + + void EntityInstance::setTo(const workingmemory::EntityInstance& m) + { + std::cout << "Longtermmemory received an entity instance: " << m.id.str() << std::endl; + } } diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.h index 4884b43fb..76e594567 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.h +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/EntityInstance.h @@ -2,6 +2,8 @@ #include "../base/EntityInstance.h" +#include "../workingMemory/EntityInstance.h" + namespace armarx::armem::longtermmemory { @@ -36,6 +38,8 @@ namespace armarx::armem::longtermmemory { public: + using Base = EntityInstanceBase<EntityInstance>; + EntityInstance(); EntityInstance(const EntityInstance&); EntityInstance(int index, const MemoryID& parentID = {}); @@ -64,6 +68,12 @@ namespace armarx::armem::longtermmemory virtual EntityInstance copy() const override; + // Conversion + workingmemory::EntityInstance convert() const; + + // MongoDB connection + void setTo(const workingmemory::EntityInstance&); + protected: virtual void _copySelf(EntityInstance& other) const override; diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.cpp index 11b2045e5..0338e6577 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.cpp +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.cpp @@ -34,4 +34,27 @@ namespace armarx::armem::longtermmemory other._copySelf(*this); return *this; } + + workingmemory::EntitySnapshot EntitySnapshot::convert() const + { + workingmemory::EntitySnapshot m; + for (const auto& s : container) + { + m.addInstance(s.convert()); + } + return m; + } + + void EntitySnapshot::setTo(const workingmemory::EntitySnapshot& m) + { + // We remove the contente here and reset it with new values + container.clear(); + + unsigned int i = 0; + for (const auto& s : m.container) + { + auto wms = container.emplace_back(id.withInstanceIndex(i++)); + wms.setTo(s); + } + } } diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.h b/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.h index b357f4e52..6f2b9c74c 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.h +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/EntitySnapshot.h @@ -5,6 +5,8 @@ #include "EntityInstance.h" #include "detail/MemoryContainer.h" +#include "../workingMemory/EntitySnapshot.h" + namespace armarx::armem::longtermmemory { @@ -18,6 +20,9 @@ namespace armarx::armem::longtermmemory { public: + using Base = EntitySnapshotBase<EntityInstance, EntitySnapshot>; + using EntityInstanceT = EntityInstance; + EntitySnapshot(); EntitySnapshot(Time time, const MemoryID& parentID = {}); EntitySnapshot(const MemoryID& id); @@ -27,5 +32,11 @@ namespace armarx::armem::longtermmemory /// Copy the instances from `other` to this. EntitySnapshot& operator=(const EntitySnapshot& other); + + // Conversion + workingmemory::EntitySnapshot convert() const; + + // MongoDB connection + void setTo(const workingmemory::EntitySnapshot&); }; } diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.cpp index ee58ef2ab..9f1709048 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.cpp +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.cpp @@ -36,4 +36,35 @@ namespace armarx::armem::longtermmemory return *this; } + workingmemory::Memory Memory::convert() const + { + workingmemory::Memory m; + for (const auto& [_, s] : container) + { + m.addCoreSegment(s.convert()); + } + return m; + } + + void Memory::reload(const MongoDBConnectionManager::MongoDBSettings& settings) + { + dbsettings = settings; + std::cout << "Setting connection to: " << settings.uniqueString() << std::endl; + } + + void Memory::append(const workingmemory::Memory& m) + { + for (const auto& [k, s] : m.container) + { + if (const auto& it = container.find(k); it == container.end()) + { + it->second.append(s); + } + else + { + auto wms = container.emplace(std::make_pair(k, id.withCoreSegmentName(k))); + wms.first->second.append(s); + } + } + } } diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.h b/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.h index 5dc1262cf..85137aaf4 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.h +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/Memory.h @@ -5,6 +5,9 @@ #include "CoreSegment.h" #include "detail/EntityContainer.h" +#include "../workingMemory/Memory.h" +#include "mongodb/MongoDBConnectionManager.h" + namespace armarx::armem::longtermmemory { @@ -12,15 +15,30 @@ namespace armarx::armem::longtermmemory * @brief Data of a memory consisting of multiple core segments. */ class Memory : - virtual public MemoryBase<CoreSegment, Entity, EntitySnapshot, EntityInstance, Memory>, + virtual public MemoryBase<CoreSegment, Memory>, virtual public detail::EntityContainer<CoreSegment, Memory> { public: + using Base = MemoryBase<CoreSegment, Memory>; + using CoreSegmentT = CoreSegment; + Memory(); Memory(const std::string& name); Memory(const MemoryID& id); Memory(const Memory& other); Memory& operator=(const Memory& other); + + + // Conversion + workingmemory::Memory convert() const; + + // MongoDB connection + void reload(const MongoDBConnectionManager::MongoDBSettings&); + void append(const workingmemory::Memory&); + + + public: + MongoDBConnectionManager::MongoDBSettings dbsettings; }; } diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.cpp index dac106c1e..48c65cd21 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.cpp +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.cpp @@ -14,26 +14,26 @@ namespace armarx::armem::longtermmemory ProviderSegment::ProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(MemoryID().withProviderSegmentName(name)), - armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(MemoryID().withProviderSegmentName(name), aronType) + armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(MemoryID().withProviderSegmentName(name), aronType) { } ProviderSegment::ProviderSegment(const std::string& name, const MemoryID parentID, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(parentID.withProviderSegmentName(name)), - armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(parentID.withProviderSegmentName(name), aronType) + armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(parentID.withProviderSegmentName(name), aronType) { } ProviderSegment::ProviderSegment(const MemoryID id, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(id), - armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(id, aronType) + armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(id, aronType) { } ProviderSegment::ProviderSegment(const ProviderSegment& other) : armarx::armem::detail::MemoryItem(other), MemoryContainerBase<std::map<std::string, Entity>, ProviderSegment>(other), - armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(other) + armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(other) { } @@ -43,4 +43,29 @@ namespace armarx::armem::longtermmemory return *this; } + workingmemory::ProviderSegment ProviderSegment::convert() const + { + workingmemory::ProviderSegment m; + for (const auto& [_, s] : container) + { + m.addEntity(s.convert()); + } + return m; + } + + void ProviderSegment::append(const workingmemory::ProviderSegment& m) + { + for (const auto& [k, s] : m.container) + { + if (const auto& it = container.find(k); it == container.end()) + { + it->second.append(s); + } + else + { + auto wms = container.emplace(std::make_pair(k, id.withEntityName(k))); + wms.first->second.append(s); + } + } + } } diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.h index c204c40eb..0c43e80e1 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.h +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/ProviderSegment.h @@ -5,6 +5,8 @@ #include "Entity.h" #include "detail/TypedEntityContainer.h" +#include "../workingMemory/ProviderSegment.h" + namespace armarx::armem::longtermmemory { @@ -13,10 +15,13 @@ namespace armarx::armem::longtermmemory * @brief Data of a provider segment containing multiple entities. */ class ProviderSegment : - virtual public ProviderSegmentBase<Entity, EntitySnapshot, EntityInstance, ProviderSegment>, + virtual public ProviderSegmentBase<Entity, ProviderSegment>, virtual public detail::TypedEntityContainer<Entity, ProviderSegment> { public: + using Base = ProviderSegmentBase<Entity, ProviderSegment>; + using EntityT = Entity; + ProviderSegment(); ProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr); ProviderSegment(const std::string& name, const MemoryID parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr); @@ -24,6 +29,12 @@ namespace armarx::armem::longtermmemory ProviderSegment(const ProviderSegment& other); ProviderSegment& operator=(const ProviderSegment& other); + + // Conversion + workingmemory::ProviderSegment convert() const; + + // MongoDB connection + void append(const workingmemory::ProviderSegment&); }; } diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/detail/EntityContainer.h b/source/RobotAPI/libraries/armem/core/longtermMemory/detail/EntityContainer.h index 155b00912..73e5ea68e 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/detail/EntityContainer.h +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/detail/EntityContainer.h @@ -18,8 +18,8 @@ namespace armarx::armem::longtermmemory::detail */ template <class _ValueT, class Derived> class EntityContainer : - virtual public armarx::armem::detail::EntityContainerBase<_ValueT, Entity, EntitySnapshot, EntityInstance, Derived>, - virtual public MemoryContainer<std::map<std::string, _ValueT>, Derived> + virtual public armarx::armem::detail::EntityContainerBase<_ValueT, Entity, Derived>, + virtual public MemoryContainer<std::map<std::string, _ValueT>, Derived> { public: EntityContainer& operator=(const EntityContainer& other) diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/detail/TypedEntityContainer.h b/source/RobotAPI/libraries/armem/core/longtermMemory/detail/TypedEntityContainer.h index da5c96c10..ea826343e 100644 --- a/source/RobotAPI/libraries/armem/core/longtermMemory/detail/TypedEntityContainer.h +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/detail/TypedEntityContainer.h @@ -13,8 +13,8 @@ namespace armarx::armem::longtermmemory::detail */ template <class _ValueT, class Derived> class TypedEntityContainer : - virtual public armarx::armem::detail::TypedEntityContainerBase<_ValueT, Entity, EntitySnapshot, EntityInstance, Derived>, - virtual public EntityContainer<_ValueT, Derived> + virtual public armarx::armem::detail::TypedEntityContainerBase<_ValueT, Entity, Derived>, + virtual public EntityContainer<_ValueT, Derived> { public: TypedEntityContainer& operator=(const TypedEntityContainer& other) diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.h b/source/RobotAPI/libraries/armem/core/longtermMemory/ice_conversions.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/RobotAPI/libraries/armem/core/longtermMemory/mongodb/MongoDBConnectionManager.h b/source/RobotAPI/libraries/armem/core/longtermMemory/mongodb/MongoDBConnectionManager.h new file mode 100644 index 000000000..799b59d86 --- /dev/null +++ b/source/RobotAPI/libraries/armem/core/longtermMemory/mongodb/MongoDBConnectionManager.h @@ -0,0 +1,54 @@ +#pragma once + +#include <string> +#include <vector> +#include <map> +#include <memory> + +namespace armarx::armem::longtermmemory +{ + + /** + * @brief Data of a memory consisting of multiple core segments. + */ + class MongoDBConnectionManager + { + public: + struct MongoDBSettings + { + std::string host = "localhost"; + std::string user = "root"; + std::string password = ""; + + bool isSet() const + { + // we always need a user and a host + return !host.empty() and !user.empty(); + } + + std::string uniqueString() const + { + return host + "::" + user; + } + }; + + static int EstablishConnection(const MongoDBSettings& settings) + { + const auto str_rep = settings.uniqueString(); + const auto& it = Connections.find(str_rep); + if(it == Connections.end()) + { + auto con = Connections.emplace(str_rep, 0); + return con.first->second; + } + else + { + // A connection already exists. We do not need to open another one. + return it->second; + } + } + + private: + static std::map<std::string, int> Connections; + }; +} diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.cpp b/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.cpp index e91e5fa4c..447dad9c5 100644 --- a/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.cpp +++ b/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.cpp @@ -14,26 +14,26 @@ namespace armarx::armem::workingmemory CoreSegment::CoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(MemoryID().withCoreSegmentName(name)), - armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(MemoryID().withCoreSegmentName(name), aronType) + armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(MemoryID().withCoreSegmentName(name), aronType) { } CoreSegment::CoreSegment(const std::string& name, const MemoryID& parentID, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(MemoryID().withCoreSegmentName(name)), - armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(parentID.withCoreSegmentName(name), aronType) + armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(parentID.withCoreSegmentName(name), aronType) { } CoreSegment::CoreSegment(const MemoryID& id, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(id), - armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(id, aronType) + armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(id, aronType) { } CoreSegment::CoreSegment(const CoreSegment& other) : armarx::armem::detail::MemoryItem(other), MemoryContainerBase<std::map<std::string, ProviderSegment>, CoreSegment>(other), - armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>(other) + armarx::armem::detail::TypedEntityContainerBase<ProviderSegment, Entity, CoreSegment>(other) { } diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.h b/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.h index e1fe33469..3dcd65d9e 100644 --- a/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.h +++ b/source/RobotAPI/libraries/armem/core/workingMemory/CoreSegment.h @@ -13,10 +13,13 @@ namespace armarx::armem::workingmemory * @brief Data of a core segment containing multiple provider segments. */ class CoreSegment : - virtual public CoreSegmentBase<ProviderSegment, Entity, EntitySnapshot, EntityInstance, CoreSegment>, + virtual public CoreSegmentBase<ProviderSegment, CoreSegment>, virtual public detail::TypedEntityContainer<ProviderSegment, CoreSegment> { public: + using Base = CoreSegmentBase<ProviderSegment, CoreSegment>; + using ProviderSegmentT = ProviderSegment; + CoreSegment(); CoreSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr); CoreSegment(const std::string& name, const MemoryID& parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr); diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/Entity.h b/source/RobotAPI/libraries/armem/core/workingMemory/Entity.h index 3484406ae..e1054a7e8 100644 --- a/source/RobotAPI/libraries/armem/core/workingMemory/Entity.h +++ b/source/RobotAPI/libraries/armem/core/workingMemory/Entity.h @@ -33,6 +33,9 @@ namespace armarx::armem::workingmemory { public: + using Base = EntityBase<EntitySnapshot, Entity>; + using EntitySnapshotT = EntitySnapshot; + Entity(); Entity(const std::string& name, const MemoryID& parentID = {}); Entity(const MemoryID& id); diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/workingMemory/EntityInstance.h index 38709d42f..589290441 100644 --- a/source/RobotAPI/libraries/armem/core/workingMemory/EntityInstance.h +++ b/source/RobotAPI/libraries/armem/core/workingMemory/EntityInstance.h @@ -36,6 +36,8 @@ namespace armarx::armem::workingmemory { public: + using Base = EntityInstanceBase<EntityInstance>; + EntityInstance(); EntityInstance(const EntityInstance&); EntityInstance(int index, const MemoryID& parentID = {}); diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/EntitySnapshot.h b/source/RobotAPI/libraries/armem/core/workingMemory/EntitySnapshot.h index 95af4a5e8..7f88288ea 100644 --- a/source/RobotAPI/libraries/armem/core/workingMemory/EntitySnapshot.h +++ b/source/RobotAPI/libraries/armem/core/workingMemory/EntitySnapshot.h @@ -18,6 +18,9 @@ namespace armarx::armem::workingmemory { public: + using Base = EntitySnapshotBase<EntityInstance, EntitySnapshot>; + using EntityInstanceT = EntityInstance; + EntitySnapshot(); EntitySnapshot(Time time, const MemoryID& parentID = {}); EntitySnapshot(const MemoryID& id); diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/Memory.h b/source/RobotAPI/libraries/armem/core/workingMemory/Memory.h index 1b29e3afd..7ec0f660f 100644 --- a/source/RobotAPI/libraries/armem/core/workingMemory/Memory.h +++ b/source/RobotAPI/libraries/armem/core/workingMemory/Memory.h @@ -12,10 +12,13 @@ namespace armarx::armem::workingmemory * @brief Data of a memory consisting of multiple core segments. */ class Memory : - virtual public MemoryBase<CoreSegment, Entity, EntitySnapshot, EntityInstance, Memory>, + virtual public MemoryBase<CoreSegment, Memory>, virtual public detail::EntityContainer<CoreSegment, Memory> { public: + using Base = MemoryBase<CoreSegment, Memory>; + using CoreSegmentT = CoreSegment; + Memory(); Memory(const std::string& name); Memory(const MemoryID& id); diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.cpp index 832e9c6c9..652edf3ce 100644 --- a/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.cpp +++ b/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.cpp @@ -14,26 +14,26 @@ namespace armarx::armem::workingmemory ProviderSegment::ProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(MemoryID().withProviderSegmentName(name)), - armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(MemoryID().withProviderSegmentName(name), aronType) + armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(MemoryID().withProviderSegmentName(name), aronType) { } ProviderSegment::ProviderSegment(const std::string& name, const MemoryID parentID, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(parentID.withProviderSegmentName(name)), - armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(parentID.withProviderSegmentName(name), aronType) + armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(parentID.withProviderSegmentName(name), aronType) { } ProviderSegment::ProviderSegment(const MemoryID id, aron::typenavigator::ObjectNavigatorPtr aronType) : armarx::armem::detail::MemoryItem(id), - armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(id, aronType) + armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(id, aronType) { } ProviderSegment::ProviderSegment(const ProviderSegment& other) : armarx::armem::detail::MemoryItem(other), MemoryContainerBase<std::map<std::string, Entity>, ProviderSegment>(other), - armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, EntitySnapshot, EntityInstance, ProviderSegment>(other) + armarx::armem::detail::TypedEntityContainerBase<Entity, Entity, ProviderSegment>(other) { } diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.h b/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.h index d80f53172..4596041a2 100644 --- a/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.h +++ b/source/RobotAPI/libraries/armem/core/workingMemory/ProviderSegment.h @@ -13,10 +13,13 @@ namespace armarx::armem::workingmemory * @brief Data of a provider segment containing multiple entities. */ class ProviderSegment : - virtual public ProviderSegmentBase<Entity, EntitySnapshot, EntityInstance, ProviderSegment>, + virtual public ProviderSegmentBase<Entity, ProviderSegment>, virtual public detail::TypedEntityContainer<Entity, ProviderSegment> { public: + using Base = ProviderSegmentBase<Entity, ProviderSegment>; + using EntityT = Entity; + ProviderSegment(); ProviderSegment(const std::string& name, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr); ProviderSegment(const std::string& name, const MemoryID parentID, aron::typenavigator::ObjectNavigatorPtr aronType = nullptr); diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/detail/EntityContainer.h b/source/RobotAPI/libraries/armem/core/workingMemory/detail/EntityContainer.h index a4ccb8ffc..05c491b21 100644 --- a/source/RobotAPI/libraries/armem/core/workingMemory/detail/EntityContainer.h +++ b/source/RobotAPI/libraries/armem/core/workingMemory/detail/EntityContainer.h @@ -18,8 +18,8 @@ namespace armarx::armem::workingmemory::detail */ template <class _ValueT, class Derived> class EntityContainer : - virtual public armarx::armem::detail::EntityContainerBase<_ValueT, Entity, EntitySnapshot, EntityInstance, Derived>, - virtual public MemoryContainer<std::map<std::string, _ValueT>, Derived> + virtual public armarx::armem::detail::EntityContainerBase<_ValueT, Entity, Derived>, + virtual public MemoryContainer<std::map<std::string, _ValueT>, Derived> { public: EntityContainer& operator=(const EntityContainer& other) diff --git a/source/RobotAPI/libraries/armem/core/workingMemory/detail/TypedEntityContainer.h b/source/RobotAPI/libraries/armem/core/workingMemory/detail/TypedEntityContainer.h index ce775841c..ebcb1f62d 100644 --- a/source/RobotAPI/libraries/armem/core/workingMemory/detail/TypedEntityContainer.h +++ b/source/RobotAPI/libraries/armem/core/workingMemory/detail/TypedEntityContainer.h @@ -13,8 +13,8 @@ namespace armarx::armem::workingmemory::detail */ template <class _ValueT, class Derived> class TypedEntityContainer : - virtual public armarx::armem::detail::TypedEntityContainerBase<_ValueT, Entity, EntitySnapshot, EntityInstance, Derived>, - virtual public EntityContainer<_ValueT, Derived> + virtual public armarx::armem::detail::TypedEntityContainerBase<_ValueT, Entity, Derived>, + virtual public EntityContainer<_ValueT, Derived> { public: TypedEntityContainer& operator=(const TypedEntityContainer& other) diff --git a/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp b/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp index f39e7a2df..2c12bbb49 100644 --- a/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp +++ b/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp @@ -19,7 +19,7 @@ namespace armarx::armem::server::plugins ClientPlugin::postCreatePropertyDefinitions(properties); properties->topic(memoryListener, this->parent<ComponentPluginUser>().memoryListenerDefaultName); - properties->optional(longTermMemoryDatabaseURL, this->parent<ComponentPluginUser>().longTermMemoryDatabaseURLDefault); + properties->optional(longTermMemoryDatabaseHost, this->parent<ComponentPluginUser>().longTermMemoryDatabaseHostDefault); properties->optional(longTermMemoryDatabaseUser, this->parent<ComponentPluginUser>().longTermMemoryDatabaseUserDefault); properties->optional(longTermMemoryDatabasePassword, this->parent<ComponentPluginUser>().longTermMemoryDatabasePasswordDefault); } @@ -34,6 +34,14 @@ namespace armarx::armem::server::plugins registerMemory(parent); } parent.iceMemory.setMemoryListener(memoryListener); + + // establishing connection to ltm and mongodb + longtermmemory::MongoDBConnectionManager::MongoDBSettings settings; + settings.host = longTermMemoryDatabaseHost; + settings.user = longTermMemoryDatabaseUser; + settings.password = longTermMemoryDatabasePassword; + + parent.longtermmemory.reload(settings); } @@ -138,14 +146,15 @@ namespace armarx::armem::server data::StoreResult ComponentPluginUser::store(const data::StoreInput& input, const Ice::Current&) { std::scoped_lock lock(workingmemoryMutex); + std::scoped_lock lock2(longtermmemoryMutex); return iceMemory.store(input); } // LTM STORING - data::LoadResult ComponentPluginUser::load(const data::LoadInput& input, const Ice::Current&) + armem::query::data::Result ComponentPluginUser::load(const armem::query::data::Input& input, const Ice::Current&) { - std::scoped_lock lock(workingmemoryMutex); + std::scoped_lock lock(longtermmemoryMutex); return iceMemory.load(input); } diff --git a/source/RobotAPI/libraries/armem/server/ComponentPlugin.h b/source/RobotAPI/libraries/armem/server/ComponentPlugin.h index 12db6a741..0aa7c6b3b 100644 --- a/source/RobotAPI/libraries/armem/server/ComponentPlugin.h +++ b/source/RobotAPI/libraries/armem/server/ComponentPlugin.h @@ -50,7 +50,7 @@ namespace armarx::armem::server::plugins client::MemoryListenerInterfacePrx memoryListener; - std::string longTermMemoryDatabaseURL; + std::string longTermMemoryDatabaseHost; std::string longTermMemoryDatabaseUser; std::string longTermMemoryDatabasePassword; }; @@ -87,11 +87,11 @@ namespace armarx::armem::server // StoringInterface interface - data::StoreResult store(const data::StoreInput&, const Ice::Current& = Ice::emptyCurrent) override; + virtual data::StoreResult store(const data::StoreInput&, const Ice::Current& = Ice::emptyCurrent) override; // LoadingInterface interface - data::LoadResult load(const data::LoadInput&, const Ice::Current& = Ice::emptyCurrent) override; + virtual armem::query::data::Result load(const armem::query::data::Input&, const Ice::Current& = Ice::emptyCurrent) override; public: @@ -104,7 +104,7 @@ namespace armarx::armem::server /// property defaults std::string memoryListenerDefaultName = "MemoryUpdates"; - std::string longTermMemoryDatabaseURLDefault = ""; + std::string longTermMemoryDatabaseHostDefault = ""; std::string longTermMemoryDatabaseUserDefault = ""; std::string longTermMemoryDatabasePasswordDefault = ""; diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp index d1ed7fc92..3c4c0b5f7 100644 --- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp +++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp @@ -4,7 +4,7 @@ #include "../error.h" #include "../core/workingMemory/ice_conversions.h" -#include "query_proc/MemoryQueryProcessor.h" +#include "query_proc/workingMemory/MemoryQueryProcessor.h" //#include "../core/io/diskWriter/NlohmannJSON/NlohmannJSONDiskWriter.h" //#include "../core/io/diskReader/NlohmannJSON/NlohmannJSONDiskReader.h" @@ -163,17 +163,17 @@ namespace armarx::armem::server { ARMARX_CHECK_NOT_NULL(workingmemory); - armem::query_proc::MemoryQueryProcessor processor( + armem::workingmemory::query_proc::MemoryQueryProcessor processor( input.withData ? armem::DataMode::WithData : armem::DataMode::NoData); return processor.process(input, *workingmemory); } // LTM LOADING - data::LoadResult MemoryToIceAdapter::load(const armem::data::LoadInput& input) + query::data::Result MemoryToIceAdapter::load(const armem::query::data::Input& query) { ARMARX_CHECK_NOT_NULL(longtermmemory); - data::LoadResult output; + query::data::Result output; output.success = true; return output; @@ -186,12 +186,12 @@ namespace armarx::armem::server ARMARX_CHECK_NOT_NULL(longtermmemory); data::StoreResult output; - // query workingMemory armem::query::data::Result queryResult = this->query(input.query); - if (queryResult.success) { - + workingmemory::Memory m; + fromIce(queryResult.memory, m); + longtermmemory->append(m); } else { diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h index 1d74fbb5b..b0d1ac098 100644 --- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h +++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.h @@ -43,7 +43,7 @@ namespace armarx::armem::server query::data::Result query(const armem::query::data::Input& input); // LTM LOADING - data::LoadResult load(const armem::data::LoadInput& input); + query::data::Result load(const armem::query::data::Input& input); // LTM STORING data::StoreResult store(const armem::data::StoreInput& input); diff --git a/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.cpp deleted file mode 100644 index cce5b13cc..000000000 --- a/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "CoreSegmentQueryProcessor.h" - -#include <regex> - -#include <ArmarXCore/core/logging/Logging.h> -#include <ArmarXCore/core/exceptions/local/ExpressionException.h> - -#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> -#include <RobotAPI/libraries/armem/core/error.h> - - -namespace armarx::armem::query_proc -{ - - void CoreSegmentQueryProcessor::process(workingmemory::CoreSegment& result, const armem::query::data::CoreSegmentQuery& query, const workingmemory::CoreSegment& coreSegment) const - { - if (auto q = dynamic_cast<const armem::query::data::core::All*>(&query)) - { - process(result, *q, coreSegment); - } - else if (auto q = dynamic_cast<const armem::query::data::core::Single*>(&query)) - { - process(result, *q, coreSegment); - } - else if (auto q = dynamic_cast<const armem::query::data::core::Regex*>(&query)) - { - process(result, *q, coreSegment); - } - else - { - throw armem::error::UnknownQueryType("core segment", query); - } - } - - - void CoreSegmentQueryProcessor::process(workingmemory::CoreSegment& result, - const armem::query::data::core::All& query, const workingmemory::CoreSegment& coreSegment) const - { - for (const auto& [name, providerSegment] : coreSegment.providerSegments()) - { - result.addProviderSegment(providerSegmentProcessor.process(query.providerSegmentQueries, providerSegment)); - } - } - - void CoreSegmentQueryProcessor::process(workingmemory::CoreSegment& result, - const armem::query::data::core::Single& query, const workingmemory::CoreSegment& coreSegment) const - { - try - { - const workingmemory::ProviderSegment& providerSegment = coreSegment.getProviderSegment(query.providerSegmentName); - result.addProviderSegment(providerSegmentProcessor.process(query.providerSegmentQueries, providerSegment)); - } - catch (const error::MissingEntry&) - { - // Leave empty. - } - } - - void CoreSegmentQueryProcessor::process(workingmemory::CoreSegment& result, - const armem::query::data::core::Regex& query, const workingmemory::CoreSegment& coreSegment) const - { - std::regex regex(query.providerSegmentNameRegex); - for (const auto& [name, providerSegment] : coreSegment.providerSegments()) - { - if (std::regex_search(providerSegment.name(), regex)) - { - result.addProviderSegment(providerSegmentProcessor.process(query.providerSegmentQueries, providerSegment)); - } - } - } - - - data::CoreSegment CoreSegmentQueryProcessor::processToIce( - const armem::query::data::CoreSegmentQuery& query, const workingmemory::CoreSegment& coreSegment) const - { - return toIce<data::CoreSegment>(process(query, coreSegment)); - } - -} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.h deleted file mode 100644 index 2806875cf..000000000 --- a/source/RobotAPI/libraries/armem/server/query_proc/CoreSegmentQueryProcessor.h +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include <RobotAPI/interface/armem/query.h> - -#include <RobotAPI/libraries/armem/core/workingMemory/Memory.h> - -#include "BaseQueryProcessor.h" -#include "ProviderSegmentQueryProcessor.h" - - - -namespace armarx::armem::query_proc -{ - - /** - * @brief Handles memory queries. - */ - class CoreSegmentQueryProcessor : public BaseQueryProcessor<workingmemory::CoreSegment, armem::query::data::CoreSegmentQuery> - { - public: - - CoreSegmentQueryProcessor(DataMode dataMode = DataMode::WithData) : - BaseQueryProcessor(dataMode), providerSegmentProcessor(dataMode) - {} - - - using BaseQueryProcessor::process; - - void process(workingmemory::CoreSegment& result, const armem::query::data::CoreSegmentQuery& query, const workingmemory::CoreSegment& coreSegment) const; - - void process(workingmemory::CoreSegment& result, const armem::query::data::core::All& query, const workingmemory::CoreSegment& coreSegment) const; - void process(workingmemory::CoreSegment& result, const armem::query::data::core::Single& query, const workingmemory::CoreSegment& coreSegment) const; - void process(workingmemory::CoreSegment& result, const armem::query::data::core::Regex& query, const workingmemory::CoreSegment& coreSegment) const; - - - data::CoreSegment processToIce(const armem::query::data::CoreSegmentQuery& query, const workingmemory::CoreSegment& coreSegment) const; - - - private: - - ProviderSegmentQueryProcessor providerSegmentProcessor; - - }; - -} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.cpp deleted file mode 100644 index d840425d3..000000000 --- a/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.cpp +++ /dev/null @@ -1,159 +0,0 @@ -#include "EntityQueryProcessor.h" - -#include <ArmarXCore/core/logging/Logging.h> -#include <ArmarXCore/core/exceptions/local/ExpressionException.h> - -#include <RobotAPI/libraries/armem/core/error.h> -#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> - - -namespace armarx::armem::query_proc -{ - - void EntityQueryProcessor::process(workingmemory::Entity& result, const armem::query::data::EntityQuery& query, const workingmemory::Entity& entity) const - { - if (auto q = dynamic_cast<const armem::query::data::entity::All*>(&query)) - { - process(result, *q, entity); - } - else if (auto q = dynamic_cast<const armem::query::data::entity::Single*>(&query)) - { - process(result, *q, entity); - } - else if (auto q = dynamic_cast<const armem::query::data::entity::TimeRange*>(&query)) - { - process(result, *q, entity); - } - else if (auto q = dynamic_cast<const armem::query::data::entity::IndexRange*>(&query)) - { - process(result, *q, entity); - } - else - { - throw armem::error::UnknownQueryType("entity snapshot", query); - } - } - - void EntityQueryProcessor::process(workingmemory::Entity& result, const armem::query::data::entity::All& query, const workingmemory::Entity& entity) const - { - (void) query; - // Copy this entitiy and its contents. - - for (const auto& [time, snapshot] : entity) - { - addResultSnapshot(result, snapshot); - } - } - - void EntityQueryProcessor::process(workingmemory::Entity& result, const armem::query::data::entity::Single& query, const workingmemory::Entity& entity) const - { - if (query.timestamp < 0) - { - try - { - addResultSnapshot(result, entity.getLatestSnapshot()); - } - catch (const armem::error::EntityHistoryEmpty&) - { - // Leave empty. - } - } - else - { - Time time = fromIce<Time>(query.timestamp); - try - { - addResultSnapshot(result, entity.getSnapshot(time)); - } - catch (const armem::error::MissingEntry&) - { - // Leave empty. - } - } - } - - void EntityQueryProcessor::process(workingmemory::Entity& result, const armem::query::data::entity::IndexRange& query, const workingmemory::Entity& entity) const - { - if (entity.empty()) - { - return; - } - - size_t first = negativeIndexSemantics(query.first, entity.history().size()); - size_t last = negativeIndexSemantics(query.last, entity.history().size()); - - if (first <= last) - { - auto it = entity.begin(); - std::advance(it, first); - - size_t num = last - first + 1; // +1 to make last inclusive - for (size_t i = 0; i < num; ++i, ++it) - { - addResultSnapshot(result, it); - } - } - } - - void EntityQueryProcessor::process(workingmemory::Entity& result, const armem::query::data::entity::TimeRange& query, const workingmemory::Entity& entity) const - { - if (query.minTimestamp <= query.maxTimestamp || query.minTimestamp < 0 || query.maxTimestamp < 0) - { - Time min = fromIce<Time>(query.minTimestamp); - Time max = fromIce<Time>(query.maxTimestamp); - process(result, min, max, entity, query); - } - } - - void EntityQueryProcessor::process(workingmemory::Entity& result, const Time& min, const Time& max, const workingmemory::Entity& entity, - const armem::query::data::EntityQuery& query) const - { - (void) query; - - // Returns an iterator pointing to the first element that is not less than (i.e. greater or equal to) key. - auto begin = min.toMicroSeconds() > 0 ? entity.history().lower_bound(min) : entity.history().begin(); - // Returns an iterator pointing to the first element that is *greater than* key. - auto end = max.toMicroSeconds() > 0 ? entity.history().upper_bound(max) : entity.history().end(); - - for (auto it = begin; it != end && it != entity.history().end(); ++it) - { - addResultSnapshot(result, it); - } - } - - data::Entity EntityQueryProcessor::processToIce(const armem::query::data::EntityQuery& query, const workingmemory::Entity& entity) const - { - return toIce<data::Entity>(process(query, entity)); - } - - size_t EntityQueryProcessor::negativeIndexSemantics(long index, size_t size) - { - const size_t max = size > 0 ? size - 1 : 0; - if (index >= 0) - { - return std::clamp<size_t>(static_cast<size_t>(index), 0, max); - } - else - { - return static_cast<size_t>(std::clamp<long>(static_cast<long>(size) + index, 0, static_cast<long>(max))); - } - } - - void EntityQueryProcessor::addResultSnapshot(workingmemory::Entity& result, workingmemory::Entity::ContainerT::const_iterator it) const - { - addResultSnapshot(result, it->second); - } - - void EntityQueryProcessor::addResultSnapshot(workingmemory::Entity& result, const workingmemory::EntitySnapshot& snapshot) const - { - bool withData = (dataMode == DataMode::WithData); - if (withData) - { - result.addSnapshot(snapshot.copy()); - } - else - { - result.addSnapshot(snapshot.copyWithoutData()); - } - } -} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.h deleted file mode 100644 index 52ded22bb..000000000 --- a/source/RobotAPI/libraries/armem/server/query_proc/EntityQueryProcessor.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include <RobotAPI/interface/armem/query.h> - -#include <RobotAPI/libraries/armem/core/workingMemory/Memory.h> - -#include "BaseQueryProcessor.h" - - -namespace armarx::armem::query_proc -{ - - /** - * @brief Handles memory queries. - */ - class EntityQueryProcessor : public BaseQueryProcessor<workingmemory::Entity, armem::query::data::EntityQuery> - { - public: - - EntityQueryProcessor(DataMode dataMode = DataMode::WithData) : - BaseQueryProcessor(dataMode) - {} - - - using BaseQueryProcessor::process; - - void process(workingmemory::Entity& result, const armem::query::data::EntityQuery& query, const workingmemory::Entity& entity) const override; - - void process(workingmemory::Entity& result, const armem::query::data::entity::All& query, const workingmemory::Entity& entity) const; - void process(workingmemory::Entity& result, const armem::query::data::entity::Single& query, const workingmemory::Entity& entity) const; - void process(workingmemory::Entity& result, const armem::query::data::entity::TimeRange& query, const workingmemory::Entity& entity) const; - void process(workingmemory::Entity& result, const armem::query::data::entity::IndexRange& query, const workingmemory::Entity& entity) const; - - void process(workingmemory::Entity& result, const Time& min, const Time& max, const workingmemory::Entity& entity, - const armem::query::data::EntityQuery& query) const; - - - data::Entity processToIce(const armem::query::data::EntityQuery& query, const workingmemory::Entity& entity) const; - - - static size_t negativeIndexSemantics(long index, size_t size); - - private: - - void addResultSnapshot(workingmemory::Entity& result, workingmemory::Entity::ContainerT::const_iterator it) const; - void addResultSnapshot(workingmemory::Entity& result, const workingmemory::EntitySnapshot& snapshot) const; - - }; - -} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.cpp deleted file mode 100644 index 1982845a0..000000000 --- a/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include "MemoryQueryProcessor.h" - -#include <regex> - -#include <ArmarXCore/core/logging/Logging.h> -#include <ArmarXCore/core/exceptions/local/ExpressionException.h> - -#include <RobotAPI/libraries/armem/core/error.h> -#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> - - -namespace armarx::armem::query_proc -{ - - armem::query::data::Result MemoryQueryProcessor::process(const armem::query::data::Input& input, const workingmemory::Memory& memory) const - { - armem::query::data::Result result; - result.memory = processToIce(input.memoryQueries, memory); - result.success = true; - return result; - } - - data::MemoryPtr MemoryQueryProcessor::processToIce( - const armem::query::data::MemoryQuery& query, const workingmemory::Memory& memory) const - { - return toIce<data::MemoryPtr>(process(query, memory)); - } - - data::MemoryPtr MemoryQueryProcessor::processToIce(const armem::query::data::MemoryQuerySeq& queries, const workingmemory::Memory& memory) const - { - return toIce<data::MemoryPtr>(process(queries, memory)); - } - - void MemoryQueryProcessor::process(workingmemory::Memory& result, const armem::query::data::MemoryQuery& query, const workingmemory::Memory& memory) const - { - if (auto q = dynamic_cast<const armem::query::data::memory::All*>(&query)) - { - process(result, *q, memory); - } - else if (auto q = dynamic_cast<const armem::query::data::memory::Single*>(&query)) - { - process(result, *q, memory); - } - else if (auto q = dynamic_cast<const armem::query::data::memory::Regex*>(&query)) - { - process(result, *q, memory); - } - else - { - throw armem::error::UnknownQueryType("memory segment", query); - } - } - - - void MemoryQueryProcessor::process(workingmemory::Memory& result, const armem::query::data::memory::All& query, const workingmemory::Memory& memory) const - { - for (const auto& [name, coreSegment] : memory.coreSegments()) - { - result.addCoreSegment(coreSegmentProcessor.process(query.coreSegmentQueries, coreSegment)); - } - } - - void MemoryQueryProcessor::process(workingmemory::Memory& result, const armem::query::data::memory::Single& query, const workingmemory::Memory& memory) const - { - try - { - const workingmemory::CoreSegment& coreSegment = memory.getCoreSegment(query.coreSegmentName); - result.addCoreSegment(coreSegmentProcessor.process(query.coreSegmentQueries, coreSegment)); - } - catch (const error::MissingEntry&) - { - // Leave empty. - } - } - - void MemoryQueryProcessor::process(workingmemory::Memory& result, const armem::query::data::memory::Regex& query, const workingmemory::Memory& memory) const - { - std::regex regex(query.coreSegmentNameRegex); - for (const auto& [name, coreSegment] : memory.coreSegments()) - { - if (std::regex_search(coreSegment.name(), regex)) - { - result.addCoreSegment(coreSegmentProcessor.process(query.coreSegmentQueries, coreSegment)); - } - } - } - -} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.h deleted file mode 100644 index b32b5afa2..000000000 --- a/source/RobotAPI/libraries/armem/server/query_proc/MemoryQueryProcessor.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include <RobotAPI/interface/armem/query.h> - -#include <RobotAPI/libraries/armem/core/workingMemory/Memory.h> - -#include "BaseQueryProcessor.h" -#include "CoreSegmentQueryProcessor.h" - - - -namespace armarx::armem::query_proc -{ - - /** - * @brief Handles memory queries. - */ - class MemoryQueryProcessor : public BaseQueryProcessor<workingmemory::Memory, armem::query::data::MemoryQuery> - { - public: - - MemoryQueryProcessor(DataMode dataMode = DataMode::WithData) : - BaseQueryProcessor(dataMode), coreSegmentProcessor(dataMode) - {} - - - using BaseQueryProcessor::process; - - armem::query::data::Result process(const armem::query::data::Input& input, const workingmemory::Memory& memory) const; - - - void process(workingmemory::Memory& result, const armem::query::data::MemoryQuery& query, const workingmemory::Memory& memory) const; - - void process(workingmemory::Memory& result, const armem::query::data::memory::All& query, const workingmemory::Memory& memory) const; - void process(workingmemory::Memory& result, const armem::query::data::memory::Single& query, const workingmemory::Memory& memory) const; - void process(workingmemory::Memory& result, const armem::query::data::memory::Regex& query, const workingmemory::Memory& memory) const; - - - data::MemoryPtr processToIce(const armem::query::data::MemoryQuery& query, const workingmemory::Memory& memory) const; - data::MemoryPtr processToIce(const armem::query::data::MemoryQuerySeq& query, const workingmemory::Memory& memory) const; - - - private: - - CoreSegmentQueryProcessor coreSegmentProcessor; - - }; - -} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.cpp deleted file mode 100644 index d6bc87a69..000000000 --- a/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "ProviderSegmentQueryProcessor.h" - -#include <regex> - -#include <ArmarXCore/core/logging/Logging.h> -#include <ArmarXCore/core/exceptions/local/ExpressionException.h> - -#include <RobotAPI/libraries/armem/core/error.h> -#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> - - -namespace armarx::armem::query_proc -{ - - void ProviderSegmentQueryProcessor::process(workingmemory::ProviderSegment& result, const armem::query::data::ProviderSegmentQuery& query, const workingmemory::ProviderSegment& providerSegment) const - { - if (auto q = dynamic_cast<const armem::query::data::provider::All*>(&query)) - { - process(result, *q, providerSegment); - } - else if (auto q = dynamic_cast<const armem::query::data::provider::Single*>(&query)) - { - process(result, *q, providerSegment); - } - else if (auto q = dynamic_cast<const armem::query::data::provider::Regex*>(&query)) - { - process(result, *q, providerSegment); - } - else - { - throw armem::error::UnknownQueryType("provider segment", query); - } - } - - - void ProviderSegmentQueryProcessor::process(workingmemory::ProviderSegment& result, - const armem::query::data::provider::All& query, const workingmemory::ProviderSegment& providerSegment) const - { - for (const auto& [name, entity] : providerSegment.entities()) - { - result.addEntity(entityProcessor.process(query.entityQueries, entity)); - } - } - - void ProviderSegmentQueryProcessor::process(workingmemory::ProviderSegment& result, - const armem::query::data::provider::Single& query, const workingmemory::ProviderSegment& providerSegment) const - { - try - { - const workingmemory::Entity& entity = providerSegment.getEntity(query.entityName); - result.addEntity(entityProcessor.process(query.entityQueries, entity)); - } - catch (const error::MissingEntry&) - { - // Leave empty. - } - } - - void ProviderSegmentQueryProcessor::process(workingmemory::ProviderSegment& result, - const armem::query::data::provider::Regex& query, const workingmemory::ProviderSegment& providerSegment) const - { - std::regex regex(query.entityNameRegex); - for (const auto& [name, entity] : providerSegment.entities()) - { - if (std::regex_search(entity.name(), regex)) - { - result.addEntity(entityProcessor.process(query.entityQueries, entity)); - } - } - } - - - data::ProviderSegment ProviderSegmentQueryProcessor::processToIce( - const armem::query::data::ProviderSegmentQuery& query, const workingmemory::ProviderSegment& providerSegment) const - { - return toIce<data::ProviderSegment>(process(query, providerSegment)); - } - -} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.h deleted file mode 100644 index 8397431e4..000000000 --- a/source/RobotAPI/libraries/armem/server/query_proc/ProviderSegmentQueryProcessor.h +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include <RobotAPI/interface/armem/query.h> - -#include <RobotAPI/libraries/armem/core/workingMemory/Memory.h> - -#include "BaseQueryProcessor.h" -#include "EntityQueryProcessor.h" - - - -namespace armarx::armem::query_proc -{ - - /** - * @brief Handles memory queries. - */ - class ProviderSegmentQueryProcessor : public BaseQueryProcessor<workingmemory::ProviderSegment, armem::query::data::ProviderSegmentQuery> - { - public: - - ProviderSegmentQueryProcessor(DataMode dataMode = DataMode::WithData) : - BaseQueryProcessor(dataMode), entityProcessor(dataMode) - {} - - - using BaseQueryProcessor::process; - - void process(workingmemory::ProviderSegment& result, const armem::query::data::ProviderSegmentQuery& query, const workingmemory::ProviderSegment& providerSegment) const; - - void process(workingmemory::ProviderSegment& result, const armem::query::data::provider::All& query, const workingmemory::ProviderSegment& providerSegment) const; - void process(workingmemory::ProviderSegment& result, const armem::query::data::provider::Single& query, const workingmemory::ProviderSegment& providerSegment) const; - void process(workingmemory::ProviderSegment& result, const armem::query::data::provider::Regex& query, const workingmemory::ProviderSegment& providerSegment) const; - - - data::ProviderSegment processToIce(const armem::query::data::ProviderSegmentQuery& query, const workingmemory::ProviderSegment& providerSegment) const; - - - private: - - EntityQueryProcessor entityProcessor; - - }; - -} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/BaseQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessor.cpp similarity index 100% rename from source/RobotAPI/libraries/armem/server/query_proc/BaseQueryProcessor.cpp rename to source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessor.cpp diff --git a/source/RobotAPI/libraries/armem/server/query_proc/BaseQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessor.h similarity index 84% rename from source/RobotAPI/libraries/armem/server/query_proc/BaseQueryProcessor.h rename to source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessor.h index 7858b2b71..77526c56a 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/BaseQueryProcessor.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessor.h @@ -12,30 +12,21 @@ namespace armarx::armem::query_proc * @brief Base class for memory query processors. */ template <class DataT, class QueryT> - class BaseQueryProcessor + class BaseQueryProcessorBase { public: - using QueryPtrT = ::IceInternal::Handle<QueryT>; using QuerySeqT = std::vector<QueryPtrT>; - public: - BaseQueryProcessor(DataMode dataMode = DataMode::WithData) : - dataMode(dataMode) - {} - - virtual ~BaseQueryProcessor() - {} - - DataT process(const QueryT& query, const DataT& data) const { DataT result = data.copyEmpty(); this->process(result, query, data); return result; } + DataT process(const QueryPtrT& query, const DataT& data) const { return this->process(*query, *data); @@ -48,7 +39,6 @@ namespace armarx::armem::query_proc return result; } - void process(DataT& result, const QuerySeqT& queries, const DataT& data) const { for (const auto& query : queries) @@ -58,12 +48,6 @@ namespace armarx::armem::query_proc } virtual void process(DataT& result, const QueryT& query, const DataT& data) const = 0; - - - protected: - - DataMode dataMode; - }; } diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.cpp new file mode 100644 index 000000000..474ed5e5c --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.cpp @@ -0,0 +1,14 @@ +#include "CoreSegmentQueryProcessor.h" + +#include <regex> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> +#include <RobotAPI/libraries/armem/core/error.h> + + +namespace armarx::armem::query_proc +{ +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.h new file mode 100644 index 000000000..04b7f3ff3 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessor.h @@ -0,0 +1,97 @@ +#pragma once + +#include <RobotAPI/interface/armem/query.h> + +#include "BaseQueryProcessor.h" +#include "ProviderSegmentQueryProcessor.h" + +#include <regex> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> + + + +namespace armarx::armem::query_proc +{ + + /** + * @brief Handles memory queries. + */ + template <class _CoreSegmentT> + class CoreSegmentQueryProcessorBase : + virtual public BaseQueryProcessorBase<_CoreSegmentT, armem::query::data::CoreSegmentQuery> + { + using Base = BaseQueryProcessorBase<_CoreSegmentT, armem::query::data::CoreSegmentQuery>; + using ProviderSegmentT = typename _CoreSegmentT::ProviderSegmentT; + + public: + + using Base::process; + void process(_CoreSegmentT& result, + const armem::query::data::CoreSegmentQuery& query, + const _CoreSegmentT& coreSegment) const override + { + if (auto q = dynamic_cast<const armem::query::data::core::All*>(&query)) + { + process(result, *q, coreSegment); + } + else if (auto q = dynamic_cast<const armem::query::data::core::Single*>(&query)) + { + process(result, *q, coreSegment); + } + else if (auto q = dynamic_cast<const armem::query::data::core::Regex*>(&query)) + { + process(result, *q, coreSegment); + } + else + { + throw armem::error::UnknownQueryType("core segment", query); + } + } + + void process(_CoreSegmentT& result, + const armem::query::data::core::All& query, + const _CoreSegmentT& coreSegment) const + { + for (const auto& [name, providerSegment] : coreSegment.providerSegments()) + { + result.addProviderSegment(providerSegmentProcessorProcess(query.providerSegmentQueries, providerSegment)); + } + } + + void process(_CoreSegmentT& result, + const armem::query::data::core::Single& query, + const _CoreSegmentT& coreSegment) const + { + try + { + const ProviderSegmentT& providerSegment = coreSegment.getProviderSegment(query.providerSegmentName); + result.addProviderSegment(providerSegmentProcessorProcess(query.providerSegmentQueries, providerSegment)); + } + catch (const error::MissingEntry&) + { + // Leave empty. + } + } + + void process(_CoreSegmentT& result, + const armem::query::data::core::Regex& query, + const _CoreSegmentT& coreSegment) const + { + std::regex regex(query.providerSegmentNameRegex); + for (const auto& [name, providerSegment] : coreSegment.providerSegments()) + { + if (std::regex_search(providerSegment.name(), regex)) + { + result.addProviderSegment(providerSegmentProcessorProcess(query.providerSegmentQueries, providerSegment)); + } + } + } + + protected: + virtual ProviderSegmentT providerSegmentProcessorProcess(const armem::query::data::ProviderSegmentQuerySeq& a, const ProviderSegmentT& o) const = 0; + }; +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.cpp new file mode 100644 index 000000000..25f477bf0 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.cpp @@ -0,0 +1,13 @@ +#include "EntityQueryProcessor.h" + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.h new file mode 100644 index 000000000..4558dbfad --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessor.h @@ -0,0 +1,172 @@ +#pragma once + +#include <RobotAPI/interface/armem/query.h> + +#include "BaseQueryProcessor.h" + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + + /** + * @brief Handles memory queries. + */ + template <class _EntityT> + class EntityQueryProcessorBase : + virtual public BaseQueryProcessorBase<_EntityT, armem::query::data::EntityQuery> + { + using Base = BaseQueryProcessorBase<_EntityT, armem::query::data::EntityQuery>; + using EntitySnapshotT = typename _EntityT::EntitySnapshotT; + + public: + using Base::process; + void process(_EntityT& result, + const armem::query::data::EntityQuery& query, + const _EntityT& entity) const override + { + if (auto q = dynamic_cast<const armem::query::data::entity::All*>(&query)) + { + process(result, *q, entity); + } + else if (auto q = dynamic_cast<const armem::query::data::entity::Single*>(&query)) + { + process(result, *q, entity); + } + else if (auto q = dynamic_cast<const armem::query::data::entity::TimeRange*>(&query)) + { + process(result, *q, entity); + } + else if (auto q = dynamic_cast<const armem::query::data::entity::IndexRange*>(&query)) + { + process(result, *q, entity); + } + else + { + throw armem::error::UnknownQueryType("entity snapshot", query); + } + } + + void process(_EntityT& result, + const armem::query::data::entity::All& query, + const _EntityT& entity) const + { + (void) query; + // Copy this entitiy and its contents. + + for (const auto& [time, snapshot] : entity) + { + addResultSnapshot(result, snapshot); + } + } + + void process(_EntityT& result, + const armem::query::data::entity::Single& query, + const _EntityT& entity) const + { + if (query.timestamp < 0) + { + try + { + addResultSnapshot(result, entity.getLatestSnapshot()); + } + catch (const armem::error::EntityHistoryEmpty&) + { + // Leave empty. + } + } + else + { + Time time = fromIce<Time>(query.timestamp); + try + { + addResultSnapshot(result, entity.getSnapshot(time)); + } + catch (const armem::error::MissingEntry&) + { + // Leave empty. + } + } + } + + void process(_EntityT& result, + const armem::query::data::entity::TimeRange& query, + const _EntityT& entity) const + { + if (query.minTimestamp <= query.maxTimestamp || query.minTimestamp < 0 || query.maxTimestamp < 0) + { + Time min = fromIce<Time>(query.minTimestamp); + Time max = fromIce<Time>(query.maxTimestamp); + process(result, min, max, entity, query); + } + } + + void process(_EntityT& result, + const armem::query::data::entity::IndexRange& query, + const _EntityT& entity) const + { + if (entity.empty()) + { + return; + } + + size_t first = negativeIndexSemantics(query.first, entity.history().size()); + size_t last = negativeIndexSemantics(query.last, entity.history().size()); + + if (first <= last) + { + auto it = entity.begin(); + std::advance(it, first); + + size_t num = last - first + 1; // +1 to make last inclusive + for (size_t i = 0; i < num; ++i, ++it) + { + addResultSnapshot(result, it); + } + } + } + + void process(_EntityT& result, + const Time& min, + const Time& max, + const _EntityT& entity, + const armem::query::data::EntityQuery& query) const + { + (void) query; + + // Returns an iterator pointing to the first element that is not less than (i.e. greater or equal to) key. + auto begin = min.toMicroSeconds() > 0 ? entity.history().lower_bound(min) : entity.history().begin(); + // Returns an iterator pointing to the first element that is *greater than* key. + auto end = max.toMicroSeconds() > 0 ? entity.history().upper_bound(max) : entity.history().end(); + + for (auto it = begin; it != end && it != entity.history().end(); ++it) + { + addResultSnapshot(result, it); + } + } + + + static size_t negativeIndexSemantics(long index, size_t size) + { + const size_t max = size > 0 ? size - 1 : 0; + if (index >= 0) + { + return std::clamp<size_t>(static_cast<size_t>(index), 0, max); + } + else + { + return static_cast<size_t>(std::clamp<long>(static_cast<long>(size) + index, 0, static_cast<long>(max))); + } + } + + protected: + virtual void addResultSnapshot(_EntityT& result, typename _EntityT::ContainerT::const_iterator it) const = 0; + virtual void addResultSnapshot(_EntityT& result, const typename _EntityT::EntitySnapshotT& snapshot) const = 0; + + }; +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.cpp new file mode 100644 index 000000000..c1caf0c27 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.cpp @@ -0,0 +1,15 @@ +#include "MemoryQueryProcessor.h" + +#include <regex> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.h new file mode 100644 index 000000000..d9937eed3 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessor.h @@ -0,0 +1,94 @@ +#pragma once + +#include <regex> + +#include <RobotAPI/interface/armem/query.h> + +#include "BaseQueryProcessor.h" +#include "CoreSegmentQueryProcessor.h" + + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> + + +namespace armarx::armem::query_proc +{ + /** + * @brief Handles memory queries. + */ + template <class _MemoryT> + class MemoryQueryProcessorBase : + virtual public BaseQueryProcessorBase<_MemoryT, armem::query::data::MemoryQuery> + { + using Base = BaseQueryProcessorBase<_MemoryT, armem::query::data::MemoryQuery>; + using CoreSegmentT = typename _MemoryT::CoreSegmentT; + + public: + + void process(_MemoryT& result, + const armem::query::data::MemoryQuery& query, + const _MemoryT& memory) const override + { + if (auto q = dynamic_cast<const armem::query::data::memory::All*>(&query)) + { + process(result, *q, memory); + } + else if (auto q = dynamic_cast<const armem::query::data::memory::Single*>(&query)) + { + process(result, *q, memory); + } + else if (auto q = dynamic_cast<const armem::query::data::memory::Regex*>(&query)) + { + process(result, *q, memory); + } + else + { + throw armem::error::UnknownQueryType("memory segment", query); + } + } + + void process(_MemoryT& result, + const armem::query::data::memory::All& query, + const _MemoryT& memory) const + { + for (const auto& [name, coreSegment] : memory.coreSegments()) + { + result.addCoreSegment(coreSegmentProcessorProcess(query.coreSegmentQueries, coreSegment)); + } + } + + void process(_MemoryT& result, + const armem::query::data::memory::Single& query, + const _MemoryT& memory) const + { + try + { + const CoreSegmentT& coreSegment = memory.getCoreSegment(query.coreSegmentName); + result.addCoreSegment(coreSegmentProcessorProcess(query.coreSegmentQueries, coreSegment)); + } + catch (const error::MissingEntry&) + { + } + } + + void process(_MemoryT& result, + const armem::query::data::memory::Regex& query, + const _MemoryT& memory) const + { + std::regex regex(query.coreSegmentNameRegex); + for (const auto& [name, coreSegment] : memory.coreSegments()) + { + if (std::regex_search(coreSegment.name(), regex)) + { + result.addCoreSegment(coreSegmentProcessorProcess(query.coreSegmentQueries, coreSegment)); + } + } + } + + protected: + virtual CoreSegmentT coreSegmentProcessorProcess(const armem::query::data::CoreSegmentQuerySeq& a, const CoreSegmentT& o) const = 0; + }; +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.cpp new file mode 100644 index 000000000..d07f30836 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.cpp @@ -0,0 +1,15 @@ +#include "ProviderSegmentQueryProcessor.h" + +#include <regex> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.h new file mode 100644 index 000000000..ff586eb47 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessor.h @@ -0,0 +1,95 @@ +#pragma once + +#include <RobotAPI/interface/armem/query.h> + +#include "BaseQueryProcessor.h" +#include "EntityQueryProcessor.h" + +#include <regex> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> + + +namespace armarx::armem::query_proc +{ + + /** + * @brief Handles memory queries. + */ + template <class _ProviderSegmentT> + class ProviderSegmentQueryProcessorBase : + virtual public BaseQueryProcessorBase<_ProviderSegmentT, armem::query::data::ProviderSegmentQuery> + { + using Base = BaseQueryProcessorBase<_ProviderSegmentT, armem::query::data::ProviderSegmentQuery>; + using EntityT = typename _ProviderSegmentT::EntityT; + + public: + using Base::process; + void process(_ProviderSegmentT& result, + const armem::query::data::ProviderSegmentQuery& query, + const _ProviderSegmentT& providerSegment) const override + { + if (auto q = dynamic_cast<const armem::query::data::provider::All*>(&query)) + { + process(result, *q, providerSegment); + } + else if (auto q = dynamic_cast<const armem::query::data::provider::Single*>(&query)) + { + process(result, *q, providerSegment); + } + else if (auto q = dynamic_cast<const armem::query::data::provider::Regex*>(&query)) + { + process(result, *q, providerSegment); + } + else + { + throw armem::error::UnknownQueryType("provider segment", query); + } + } + + void process(_ProviderSegmentT& result, + const armem::query::data::provider::All& query, + const _ProviderSegmentT& providerSegment) const + { + for (const auto& [name, entity] : providerSegment.entities()) + { + result.addEntity(entityProcessorProcess(query.entityQueries, entity)); + } + } + + void process(_ProviderSegmentT& result, + const armem::query::data::provider::Single& query, + const _ProviderSegmentT& providerSegment) const + { + try + { + const EntityT& entity = providerSegment.getEntity(query.entityName); + result.addEntity(entityProcessorProcess(query.entityQueries, entity)); + } + catch (const error::MissingEntry&) + { + // Leave empty. + } + } + + void process(_ProviderSegmentT& result, + const armem::query::data::provider::Regex& query, + const _ProviderSegmentT& providerSegment) const + { + std::regex regex(query.entityNameRegex); + for (const auto& [name, entity] : providerSegment.entities()) + { + if (std::regex_search(entity.name(), regex)) + { + result.addEntity(entityProcessorProcess(query.entityQueries, entity)); + } + } + } + + protected: + virtual EntityT entityProcessorProcess(const armem::query::data::EntityQuerySeq& a, const EntityT& o) const = 0; + }; +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.cpp new file mode 100644 index 000000000..5bb5942e8 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.cpp @@ -0,0 +1,13 @@ +#include "BaseQueryProcessor.h" + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.h new file mode 100644 index 000000000..c129b8545 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/BaseQueryProcessor.h @@ -0,0 +1,26 @@ +#pragma once + +#include <RobotAPI/interface/armem/query.h> +#include <RobotAPI/libraries/armem/core/DataMode.h> + +#include "../base/BaseQueryProcessor.h" + + +namespace armarx::armem::longtermmemory::query_proc +{ + /** + * @brief Base class for memory query processors. + */ + template <class DataT, class QueryT> + class BaseQueryProcessor : + virtual public armarx::armem::query_proc::BaseQueryProcessorBase<DataT, QueryT> + { + public: + using Base = armarx::armem::query_proc::BaseQueryProcessorBase<DataT, QueryT>; + + BaseQueryProcessor() + {} + + protected: + }; +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.cpp new file mode 100644 index 000000000..474ed5e5c --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.cpp @@ -0,0 +1,14 @@ +#include "CoreSegmentQueryProcessor.h" + +#include <regex> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> +#include <RobotAPI/libraries/armem/core/error.h> + + +namespace armarx::armem::query_proc +{ +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.h new file mode 100644 index 000000000..17c07c312 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/CoreSegmentQueryProcessor.h @@ -0,0 +1,37 @@ +#pragma once + +#include "BaseQueryProcessor.h" +#include "../base/CoreSegmentQueryProcessor.h" + +#include "../../../core/longtermMemory/CoreSegment.h" + +#include "ProviderSegmentQueryProcessor.h" + + +namespace armarx::armem::longtermmemory::query_proc +{ + /** + * @brief Handles memory queries. + */ + class CoreSegmentQueryProcessor : + virtual public BaseQueryProcessor<longtermmemory::CoreSegment, armem::query::data::CoreSegmentQuery>, + virtual public armarx::armem::query_proc::CoreSegmentQueryProcessorBase<longtermmemory::CoreSegment> + { + using Base = BaseQueryProcessor<longtermmemory::CoreSegment, armem::query::data::CoreSegmentQuery>; + using ProviderSegmentT = typename longtermmemory::CoreSegment::ProviderSegmentT; + + public: + CoreSegmentQueryProcessor() : + Base() + {} + + protected: + virtual ProviderSegmentT providerSegmentProcessorProcess(const armem::query::data::ProviderSegmentQuerySeq& q, const ProviderSegmentT& s) const override + { + return providerSegmentProcessor.process(q, s); + } + + private: + ProviderSegmentQueryProcessor providerSegmentProcessor; + }; +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.cpp new file mode 100644 index 000000000..25f477bf0 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.cpp @@ -0,0 +1,13 @@ +#include "EntityQueryProcessor.h" + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.h new file mode 100644 index 000000000..d7306cb30 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/EntityQueryProcessor.h @@ -0,0 +1,39 @@ +#pragma once + +#include "BaseQueryProcessor.h" +#include "../base/EntityQueryProcessor.h" + +#include "../../../core/longtermMemory/Entity.h" + +#include "EntityQueryProcessor.h" + +namespace armarx::armem::longtermmemory::query_proc +{ + /** + * @brief Handles memory queries. + */ + class EntityQueryProcessor : + virtual public BaseQueryProcessor<longtermmemory::Entity, armem::query::data::EntityQuery>, + virtual public armarx::armem::query_proc::EntityQueryProcessorBase<longtermmemory::Entity> + { + using Base = BaseQueryProcessor<longtermmemory::Entity, armem::query::data::EntityQuery>; + + public: + EntityQueryProcessor() : + Base() + {} + + private: + void addResultSnapshot(longtermmemory::Entity& result, longtermmemory::Entity::ContainerT::const_iterator it) const override + { + addResultSnapshot(result, it->second); + } + + void addResultSnapshot(longtermmemory::Entity& result, const longtermmemory::EntitySnapshot& snapshot) const override + { + result.addSnapshot(snapshot.copy()); + } + + }; + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.cpp new file mode 100644 index 000000000..c1caf0c27 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.cpp @@ -0,0 +1,15 @@ +#include "MemoryQueryProcessor.h" + +#include <regex> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.h new file mode 100644 index 000000000..6e70fb7b0 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/MemoryQueryProcessor.h @@ -0,0 +1,36 @@ +#pragma once + +#include "BaseQueryProcessor.h" +#include "../base/MemoryQueryProcessor.h" + +#include "../../../core/longtermMemory/Memory.h" + +#include "CoreSegmentQueryProcessor.h" + +namespace armarx::armem::longtermmemory::query_proc +{ + /** + * @brief Handles memory queries. + */ + class MemoryQueryProcessor : + virtual public BaseQueryProcessor<longtermmemory::Memory, armem::query::data::MemoryQuery>, + virtual public armarx::armem::query_proc::MemoryQueryProcessorBase<longtermmemory::Memory> + { + using Base = BaseQueryProcessor<longtermmemory::Memory, armem::query::data::MemoryQuery>; + using CoreSegmentT = typename longtermmemory::Memory::CoreSegmentT; + + public: + MemoryQueryProcessor() : + Base() + {} + + protected: + virtual CoreSegmentT coreSegmentProcessorProcess(const armem::query::data::CoreSegmentQuerySeq& q, const CoreSegmentT& s) const override + { + return coreSegmentProcessor.process(q, s); + } + + private: + CoreSegmentQueryProcessor coreSegmentProcessor; + }; +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.cpp new file mode 100644 index 000000000..d07f30836 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.cpp @@ -0,0 +1,15 @@ +#include "ProviderSegmentQueryProcessor.h" + +#include <regex> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.h new file mode 100644 index 000000000..57cb91c41 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermMemory/ProviderSegmentQueryProcessor.h @@ -0,0 +1,38 @@ +#pragma once + +#include "BaseQueryProcessor.h" +#include "../base/ProviderSegmentQueryProcessor.h" + +#include "../../../core/longtermMemory/ProviderSegment.h" + +#include "EntityQueryProcessor.h" + +namespace armarx::armem::longtermmemory::query_proc +{ + /** + * @brief Handles memory queries. + */ + class ProviderSegmentQueryProcessor : + virtual public BaseQueryProcessor<longtermmemory::ProviderSegment, armem::query::data::ProviderSegmentQuery>, + virtual public armarx::armem::query_proc::ProviderSegmentQueryProcessorBase<longtermmemory::ProviderSegment> + { + using Base = BaseQueryProcessor<longtermmemory::ProviderSegment, armem::query::data::ProviderSegmentQuery>; + using EntityT = longtermmemory::ProviderSegment::EntityT; + + public: + ProviderSegmentQueryProcessor() : + Base() + {} + + protected: + virtual EntityT entityProcessorProcess(const armem::query::data::EntityQuerySeq& q, const EntityT& s) const override + { + return entityProcessor.process(q, s); + } + + private: + EntityQueryProcessor entityProcessor; + + }; + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.cpp new file mode 100644 index 000000000..5bb5942e8 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.cpp @@ -0,0 +1,13 @@ +#include "BaseQueryProcessor.h" + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.h new file mode 100644 index 000000000..dee5d621c --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/BaseQueryProcessor.h @@ -0,0 +1,28 @@ +#pragma once + +#include <RobotAPI/interface/armem/query.h> +#include <RobotAPI/libraries/armem/core/DataMode.h> + +#include "../base/BaseQueryProcessor.h" + + +namespace armarx::armem::workingmemory::query_proc +{ + /** + * @brief Base class for memory query processors. + */ + template <class DataT, class QueryT> + class BaseQueryProcessor : + virtual public armarx::armem::query_proc::BaseQueryProcessorBase<DataT, QueryT> + { + public: + using Base = armarx::armem::query_proc::BaseQueryProcessorBase<DataT, QueryT>; + + BaseQueryProcessor(DataMode dataMode = DataMode::WithData) : + dataMode(dataMode) + {} + + protected: + DataMode dataMode; + }; +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.cpp new file mode 100644 index 000000000..474ed5e5c --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.cpp @@ -0,0 +1,14 @@ +#include "CoreSegmentQueryProcessor.h" + +#include <regex> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> +#include <RobotAPI/libraries/armem/core/error.h> + + +namespace armarx::armem::query_proc +{ +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.h new file mode 100644 index 000000000..6cc1dea86 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/CoreSegmentQueryProcessor.h @@ -0,0 +1,43 @@ +#pragma once + +#include "BaseQueryProcessor.h" +#include "../base/CoreSegmentQueryProcessor.h" + +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + +#include "ProviderSegmentQueryProcessor.h" + + +namespace armarx::armem::workingmemory::query_proc +{ + /** + * @brief Handles memory queries. + */ + class CoreSegmentQueryProcessor : + virtual public BaseQueryProcessor<workingmemory::CoreSegment, armem::query::data::CoreSegmentQuery>, + virtual public armarx::armem::query_proc::CoreSegmentQueryProcessorBase<workingmemory::CoreSegment> + { + using Base = BaseQueryProcessor<workingmemory::CoreSegment, armem::query::data::CoreSegmentQuery>; + using ProviderSegmentT = typename workingmemory::CoreSegment::ProviderSegmentT; + + public: + CoreSegmentQueryProcessor(DataMode dataMode = DataMode::WithData) : + Base(dataMode), providerSegmentProcessor(dataMode) + {} + + using Base::process; + data::CoreSegment processToIce(const armem::query::data::CoreSegmentQuery& query, const workingmemory::CoreSegment& coreSegment) const + { + return toIce<data::CoreSegment>(process(query, coreSegment)); + } + + protected: + virtual ProviderSegmentT providerSegmentProcessorProcess(const armem::query::data::ProviderSegmentQuerySeq& q, const ProviderSegmentT& s) const override + { + return providerSegmentProcessor.process(q, s); + } + + private: + ProviderSegmentQueryProcessor providerSegmentProcessor; + }; +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.cpp new file mode 100644 index 000000000..25f477bf0 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.cpp @@ -0,0 +1,13 @@ +#include "EntityQueryProcessor.h" + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.h new file mode 100644 index 000000000..eaf0c84af --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/EntityQueryProcessor.h @@ -0,0 +1,52 @@ +#pragma once + +#include "BaseQueryProcessor.h" +#include "../base/EntityQueryProcessor.h" + +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + +#include "EntityQueryProcessor.h" + +namespace armarx::armem::workingmemory::query_proc +{ + /** + * @brief Handles memory queries. + */ + class EntityQueryProcessor : + virtual public BaseQueryProcessor<workingmemory::Entity, armem::query::data::EntityQuery>, + virtual public armarx::armem::query_proc::EntityQueryProcessorBase<workingmemory::Entity> + { + using Base = BaseQueryProcessor<workingmemory::Entity, armem::query::data::EntityQuery>; + + public: + EntityQueryProcessor(DataMode dataMode = DataMode::WithData) : + Base(dataMode) + {} + + data::Entity processToIce(const armem::query::data::EntityQuery& query, const workingmemory::Entity& entity) const + { + return toIce<data::Entity>(process(query, entity)); + } + + private: + void addResultSnapshot(workingmemory::Entity& result, workingmemory::Entity::ContainerT::const_iterator it) const override + { + addResultSnapshot(result, it->second); + } + + void addResultSnapshot(workingmemory::Entity& result, const workingmemory::EntitySnapshot& snapshot) const override + { + bool withData = (dataMode == DataMode::WithData); + if (withData) + { + result.addSnapshot(snapshot.copy()); + } + else + { + result.addSnapshot(snapshot.copyWithoutData()); + } + } + + }; + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.cpp new file mode 100644 index 000000000..c1caf0c27 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.cpp @@ -0,0 +1,15 @@ +#include "MemoryQueryProcessor.h" + +#include <regex> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.h new file mode 100644 index 000000000..26a589619 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/MemoryQueryProcessor.h @@ -0,0 +1,59 @@ +#pragma once + +#include "BaseQueryProcessor.h" +#include "../base/MemoryQueryProcessor.h" + +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + +#include "CoreSegmentQueryProcessor.h" + +namespace armarx::armem::workingmemory::query_proc +{ + /** + * @brief Handles memory queries. + */ + class MemoryQueryProcessor : + virtual public BaseQueryProcessor<workingmemory::Memory, armem::query::data::MemoryQuery>, + virtual public armarx::armem::query_proc::MemoryQueryProcessorBase<workingmemory::Memory> + { + using Base = BaseQueryProcessor<workingmemory::Memory, armem::query::data::MemoryQuery>; + using CoreSegmentT = typename workingmemory::Memory::CoreSegmentT; + + public: + MemoryQueryProcessor(DataMode dataMode = DataMode::WithData) : + Base(dataMode), coreSegmentProcessor(dataMode) + {} + + armem::query::data::Result process(const armem::query::data::Input& input, + const workingmemory::Memory& memory) const + { + armem::query::data::Result result; + result.memory = processToIce(input.memoryQueries, memory); + result.success = true; + return result; + } + + using Base::process; + data::MemoryPtr processToIce(const armem::query::data::MemoryQuery& query, + const workingmemory::Memory& memory) const + { + return toIce<data::MemoryPtr>(process(query, memory)); + } + + data::MemoryPtr processToIce(const armem::query::data::MemoryQuerySeq& queries, + const workingmemory::Memory& memory) const + { + return toIce<data::MemoryPtr>(process(queries, memory)); + } + + protected: + virtual CoreSegmentT coreSegmentProcessorProcess(const armem::query::data::CoreSegmentQuerySeq& q, const CoreSegmentT& s) const override + { + return coreSegmentProcessor.process(q, s); + } + + + private: + CoreSegmentQueryProcessor coreSegmentProcessor; + }; +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.cpp new file mode 100644 index 000000000..d07f30836 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.cpp @@ -0,0 +1,15 @@ +#include "ProviderSegmentQueryProcessor.h" + +#include <regex> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + + +namespace armarx::armem::query_proc +{ + +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.h new file mode 100644 index 000000000..abaa868f9 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingMemory/ProviderSegmentQueryProcessor.h @@ -0,0 +1,42 @@ +#pragma once + +#include "BaseQueryProcessor.h" +#include "../base/ProviderSegmentQueryProcessor.h" + +#include <RobotAPI/libraries/armem/core/workingMemory/ice_conversions.h> + +#include "EntityQueryProcessor.h" + +namespace armarx::armem::workingmemory::query_proc +{ + /** + * @brief Handles memory queries. + */ + class ProviderSegmentQueryProcessor : + virtual public BaseQueryProcessor<workingmemory::ProviderSegment, armem::query::data::ProviderSegmentQuery>, + virtual public armarx::armem::query_proc::ProviderSegmentQueryProcessorBase<workingmemory::ProviderSegment> + { + using Base = BaseQueryProcessor<workingmemory::ProviderSegment, armem::query::data::ProviderSegmentQuery>; + using EntityT = workingmemory::ProviderSegment::EntityT; + + public: + ProviderSegmentQueryProcessor(DataMode dataMode = DataMode::WithData) : + Base(dataMode), entityProcessor(dataMode) + {} + + using Base::process; + data::ProviderSegment processToIce(const armem::query::data::ProviderSegmentQuery& query, const workingmemory::ProviderSegment& providerSegment) const + { + return toIce<data::ProviderSegment>(process(query, providerSegment)); + } + + protected: + virtual EntityT entityProcessorProcess(const armem::query::data::EntityQuerySeq& q, const EntityT& s) const override + { + return entityProcessor.process(q, s); + } + + private: + EntityQueryProcessor entityProcessor; + }; +} diff --git a/source/RobotAPI/libraries/armem/test/ArMemQueryTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemQueryTest.cpp index 51227ab81..4f0f297dd 100644 --- a/source/RobotAPI/libraries/armem/test/ArMemQueryTest.cpp +++ b/source/RobotAPI/libraries/armem/test/ArMemQueryTest.cpp @@ -25,7 +25,7 @@ #define ARMARX_BOOST_TEST #include <RobotAPI/Test.h> -#include "../server/query_proc/EntityQueryProcessor.h" +#include "../server/query_proc/workingMemory/EntityQueryProcessor.h" #include "../error.h" @@ -38,7 +38,7 @@ namespace armem = armarx::armem; namespace aron = armarx::aron; namespace query = armarx::armem::query::data; -using EntityQueryProcessor = armarx::armem::query_proc::EntityQueryProcessor; +using EntityQueryProcessor = armarx::armem::workingmemory::query_proc::EntityQueryProcessor; namespace ArMemQueryTest @@ -52,7 +52,7 @@ namespace ArMemQueryTest { armem::workingmemory::Entity entity; - armem::query_proc::EntityQueryProcessor processor; + armem::workingmemory::query_proc::EntityQueryProcessor processor; query::EntityQueryPtr entityQuery; std::vector<armem::workingmemory::Entity> results; diff --git a/source/RobotAPI/libraries/armem_gui/LTMControlWidget.cpp b/source/RobotAPI/libraries/armem_gui/LTMControlWidget.cpp index 53358453d..257e43d3a 100644 --- a/source/RobotAPI/libraries/armem_gui/LTMControlWidget.cpp +++ b/source/RobotAPI/libraries/armem_gui/LTMControlWidget.cpp @@ -22,25 +22,19 @@ namespace armarx::armem::gui layout->setContentsMargins(margin, margin, margin, margin); _lineEdit = new QLineEdit("/tmp/MemoryExport", this); - _loadFromHereButton = new QPushButton("Load", this); - _encodeButton = new QPushButton("Encode", this); - _exportHereButton = new QPushButton("Export", this); - _retrieveButton = new QPushButton("Retrieve", this); - _removeFromWMButton = new QPushButton("Clear", this); + _exportHereButton = new QPushButton("Export here", this); + + _storeButton = new QPushButton("Store in LTM", this); layout->addWidget(_lineEdit); - layout->addWidget(_loadFromHereButton); - layout->addWidget(_encodeButton); + layout->addWidget(_storeButton); layout->addWidget(_exportHereButton); - layout->addWidget(_retrieveButton); - layout->addWidget(_removeFromWMButton); // Private connections. // Public connections. - //connect(_mkdirButton, &QPushButton::pressed, this, &This::mkdir); - //connect(_loadButton, &QPushButton::pressed, this, &This::load); - //connect(_storeButton, &QPushButton::pressed, this, &This::store); + connect(_storeButton, &QPushButton::pressed, this, &This::store); + connect(_exportHereButton, &QPushButton::pressed, this, &This::exportHere); } QLineEdit* LTMControlWidget::pathInputBox() @@ -53,29 +47,14 @@ namespace armarx::armem::gui return _lineEdit->text(); } - QPushButton* LTMControlWidget::loadFromHere() + QPushButton* LTMControlWidget::storeButton() { - return _loadFromHereButton; - } - - QPushButton* LTMControlWidget::encodeButton() - { - return _encodeButton; + return _storeButton; } QPushButton* LTMControlWidget::exportHereButton() { return _exportHereButton; } - - QPushButton* LTMControlWidget::retrieveButton() - { - return _retrieveButton; - } - - QPushButton* LTMControlWidget::removeFromWMButton() - { - return _removeFromWMButton; - } } diff --git a/source/RobotAPI/libraries/armem_gui/LTMControlWidget.h b/source/RobotAPI/libraries/armem_gui/LTMControlWidget.h index 31dda4098..9c827b011 100644 --- a/source/RobotAPI/libraries/armem_gui/LTMControlWidget.h +++ b/source/RobotAPI/libraries/armem_gui/LTMControlWidget.h @@ -20,21 +20,15 @@ namespace armarx::armem::gui QLineEdit* pathInputBox(); QString getEnteredPath(); - QPushButton* loadFromHere(); - QPushButton* encodeButton(); + QPushButton* storeButton(); QPushButton* exportHereButton(); - QPushButton* retrieveButton(); - QPushButton* removeFromWMButton(); public slots: signals: - void loadAndAppend(); - void encode(); + void store(); void exportHere(); - void retrieve(); - void removeFromWM(); private slots: @@ -46,11 +40,8 @@ namespace armarx::armem::gui QLineEdit* _lineEdit; - QPushButton* _loadFromHereButton; - QPushButton* _encodeButton; + QPushButton* _storeButton; QPushButton* _exportHereButton; - QPushButton* _retrieveButton; - QPushButton* _removeFromWMButton; }; diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp index 53669802d..564984f22 100644 --- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp +++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp @@ -59,9 +59,8 @@ namespace armarx::armem::gui //connect(this, &This::connected, this, &This::updateMemory); - //connect(ltmControlWidget, &armem::gui::LTMControlWidget::store, this, &This::store); - //connect(ltmControlWidget, &armem::gui::LTMControlWidget::load, this, &This::load); - //connect(ltmControlWidget, &armem::gui::LTMControlWidget::mkdir, this, &This::mkdir); + connect(ltmControlWidget, &armem::gui::LTMControlWidget::store, this, &This::store); + connect(ltmControlWidget, &armem::gui::LTMControlWidget::exportHere, this, &This::exportHere); connect(this, &This::connected, this, &This::updateMemories); connect(updateWidget, &armem::gui::PeriodicUpdateWidget::update, this, &This::updateMemories); @@ -121,46 +120,30 @@ namespace armarx::armem::gui emit disconnected(); } - /*void MemoryViewer::store() + void MemoryViewer::store() { - if (!memoryReader) - { - return; - } + TIMING_START(MemoryStore); - TIMING_START(MemoryDump); - QString qs = ltmControlWidget->getEnteredPath(); - std::string utf8_text = qs.toUtf8().constData(); - - if (this->memoryData) + for (auto& [name, reader] : memoryReaders) { - io::DiskMemory d(*this->memoryData, utf8_text, std::make_shared<io::NlohmannJSONDiskWriter>()); + data::StoreInput input; + input.query = memoryGroup->queryWidget()->queryInput().toIce(); + reader.readAndStore(input); } - TIMING_END_STREAM(MemoryDump, ARMARX_VERBOSE); - - if (statusLabel) - { - statusLabel->setText(QString::fromStdString("Successfully stored memory.")); - } + TIMING_END_STREAM(MemoryStore, ARMARX_VERBOSE); } - void MemoryViewer::load() + void MemoryViewer::exportHere() { - TIMING_START(MemoryLoad); + TIMING_START(MemoryExport); QString qs = ltmControlWidget->getEnteredPath(); std::string utf8_text = qs.toUtf8().constData(); - io::DiskMemory d(std::filesystem::path(utf8_text), std::make_shared<io::NlohmannJSONDiskWriter>()); - this->memoryData = d.toMemory(); - TIMING_END_STREAM(MemoryLoad, ARMARX_VERBOSE); - if (this->memoryData) - { - emit memoryDataChanged(); - } - }*/ + TIMING_END_STREAM(MemoryExport, ARMARX_VERBOSE); + } void MemoryViewer::updateMemories() { diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.h b/source/RobotAPI/libraries/armem_gui/MemoryViewer.h index 2a31ba203..7bcd788a0 100644 --- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.h +++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.h @@ -63,10 +63,11 @@ namespace armarx::armem::gui public slots: - //void store(); - //void load(); - //void mkdir(); + // LTMControlWidget + void store(); + void exportHere(); + // Other void updateMemories(); void updateInstanceTree(const armem::MemoryID& selectedID); -- GitLab