diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp index 3cc3879dff04014162043cd20ab1c9e7ae90c4f4..a42d4305d7a1845544952e4d9933072f88ac14a6 100644 --- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp +++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp @@ -192,7 +192,7 @@ namespace armarx::armem::server } // Consollidate to ltm - if (longtermMemory) + if (longtermMemory->enabled) { //ARMARX_IMPORTANT << longtermMemory->id().str(); //ARMARX_IMPORTANT << longtermMemory->getPath(); @@ -263,54 +263,54 @@ namespace armarx::armem::server { ARMARX_TRACE; ARMARX_CHECK_NOT_NULL(workingMemory); + ARMARX_CHECK_NOT_NULL(longtermMemory); // Core segment processors will aquire the core segment locks. query_proc::wm_server::MemoryQueryProcessor wmServerProcessor( input.withData ? armem::DataMode::WithData : armem::DataMode::NoData); armem::wm::Memory wmResult = wmServerProcessor.process(input.memoryQueries, *workingMemory); - query_proc::ltm_server::disk::MemoryQueryProcessor ltmProcessor; - armem::wm::Memory ltmResult = ltmProcessor.process(input, *longtermMemory); - armem::query::data::Result result; - if (not ltmResult.empty()) - { - ARMARX_INFO << "The LTM returned data after query"; - longtermMemory->load(ltmResult); // convert memory ==> meaning resolving references + if (longtermMemory->enabled) + { + query_proc::ltm_server::disk::MemoryQueryProcessor ltmProcessor; + armem::wm::Memory ltmResult = ltmProcessor.process(input, *longtermMemory); - wmResult.append(ltmResult); - if (wmResult.empty()) + if (not ltmResult.empty()) { - ARMARX_ERROR << "A merged Memory has no data although at least the LTM result contains data. This indicates that something is wrong."; - } + ARMARX_INFO << "The LTM returned data after query"; - // query again to limit output size (TODO: Skip if querytype is all) - auto queryInput = armem::client::QueryInput::fromIce(input); - queryInput.replaceQueryTarget(query::data::QueryTarget::LTM, query::data::QueryTarget::WM); + longtermMemory->load(ltmResult); // convert memory ==> meaning resolving references - query_proc::wm::MemoryQueryProcessor wm2wmProcessor( - input.withData ? armem::DataMode::WithData : armem::DataMode::NoData); - armem::wm::Memory mergedResult = wm2wmProcessor.process(queryInput.toIce(), wmResult); - if (mergedResult.empty()) - { - ARMARX_ERROR << "A merged and postprocessed Memory has no data although at least the LTM result contains data. This indicates that something is wrong."; - } + wmResult.append(ltmResult); + if (wmResult.empty()) + { + ARMARX_ERROR << "A merged Memory has no data although at least the LTM result contains data. This indicates that something is wrong."; + } - result.memory = toIce<data::MemoryPtr>(mergedResult); + // query again to limit output size (TODO: Skip if querytype is all) + auto queryInput = armem::client::QueryInput::fromIce(input); + queryInput.replaceQueryTarget(query::data::QueryTarget::LTM, query::data::QueryTarget::WM); - // also move results of ltm to wm - //this->commit(toCommit(ltm_converted)); + query_proc::wm::MemoryQueryProcessor wm2wmProcessor( + input.withData ? armem::DataMode::WithData : armem::DataMode::NoData); + wmResult = wm2wmProcessor.process(queryInput.toIce(), wmResult); + if (wmResult.empty()) + { + ARMARX_ERROR << "A merged and postprocessed Memory has no data although at least the LTM result contains data. This indicates that something is wrong."; + } - // mark removed entries of wm in viewer - // TODO - } - else - { - ARMARX_VERBOSE << "The LTM did not return data after query"; - result.memory = toIce<data::MemoryPtr>(wmResult); + // also move results of ltm to wm + //this->commit(toCommit(ltm_converted)); + + // mark removed entries of wm in viewer + // TODO + } } + result.memory = toIce<data::MemoryPtr>(wmResult); + result.success = true; if (result.memory->coreSegments.size() == 0) { @@ -336,6 +336,7 @@ namespace armarx::armem::server ARMARX_TRACE; ARMARX_CHECK_NOT_NULL(workingMemory); ARMARX_CHECK_NOT_NULL(longtermMemory); + data::StoreResult output; for (const auto& query : input.query.memoryQueries) diff --git a/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h b/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h index 4f79c2cd4486c3977803d4bc34c22b38fe2f82d7..8203fa4cd81936370a96784a37e219cdd5ed6748 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h +++ b/source/RobotAPI/libraries/armem/server/ltm/base/detail/MemoryBase.h @@ -92,6 +92,9 @@ namespace armarx::armem::server::ltm virtual void _load(armem::wm::Memory& memory) = 0; virtual void _store(const armem::wm::Memory& memory) = 0; + public: + bool enabled = true; + protected: mutable std::recursive_mutex ltm_mutex; }; diff --git a/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp index faaedbe421efce9de2bfff15edf464db5fa5bb93..327a83223a88ad34adad181d922ea1d4e63ebdf8 100644 --- a/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp +++ b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp @@ -32,13 +32,13 @@ namespace armarx::armem::server::plugins } // stuff for ltm - if (longtermMemoryEnabled) // if not explicitly set to false in constructor of component (then we dont need the params) + if (longtermMemory.enabled) // if not explicitly set to false in constructor of component (then we dont need the params) { if (not properties->hasDefinition(prefix + "ltm.enabled")) { - properties->optional(longtermMemoryEnabled, prefix + "ltm.enabled"); + properties->optional(longtermMemory.enabled, prefix + "ltm.enabled"); } - longtermMemory.createPropertyDefinitions(properties, "ltm."); + //longtermMemory.createPropertyDefinitions(properties, "ltm."); } // Publish memory updates topic diff --git a/source/RobotAPI/libraries/armem/server/plugins/Plugin.h b/source/RobotAPI/libraries/armem/server/plugins/Plugin.h index d5c7c05348a7738d5dd08bfdb5aa3f8f82ac0312..8a5a68934003997a9588117ecc985f2fa9dfe456 100644 --- a/source/RobotAPI/libraries/armem/server/plugins/Plugin.h +++ b/source/RobotAPI/libraries/armem/server/plugins/Plugin.h @@ -80,16 +80,13 @@ namespace armarx::armem::server::plugins // Long-Term Memory - /// Indicates whether to use or not to use the ltm feature. - bool longtermMemoryEnabled = true; - /// A manager class for the ltm. It internally holds a normal wm instance as a cache. server::ltm::disk::Memory longtermMemory; private: - client::plugins::Plugin* clientPlugin; + client::plugins::Plugin* clientPlugin = nullptr; }; } diff --git a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp index 7570470f5ccc8fe91eceec096baab4dc94081500..285c65e0b02895bbb59663a461db1249330daf13 100644 --- a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp +++ b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp @@ -86,12 +86,6 @@ namespace armarx::armem::server::plugins } - bool ReadWritePluginUser::isLongtermMemoryEnabled() - { - return plugin->longtermMemoryEnabled; - } - - ltm::disk::Memory& ReadWritePluginUser::longtermMemory() { return plugin->longtermMemory; diff --git a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h index f0f891151ab255ed147473081c3851949b003614..8d3dad4c98d3f11592b250ce11a10fc96dc8cd81 100644 --- a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h +++ b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h @@ -55,7 +55,6 @@ namespace armarx::armem::server::plugins server::wm::Memory& workingMemory(); MemoryToIceAdapter& iceAdapter(); - bool isLongtermMemoryEnabled(); server::ltm::disk::Memory& longtermMemory();