diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp index 2a33e54c17fe0ed1ac0c836d1286c28fdece5f9d..354eec9cea9d1d1e37f4dc4ea790b47ba1749755 100644 --- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp +++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp @@ -236,10 +236,10 @@ namespace armarx::armem::server // Core segment processors will aquire the core segment locks. armem::wm::query_proc::MemoryQueryProcessor wmProcessor( input.withData ? armem::DataMode::WithData : armem::DataMode::NoData); - wm::Memory wmResult = wmProcessor.process(input, *workingMemory, /* execute if: */ { query::data::QueryTarget::WM }); + wm::Memory wmResult = wmProcessor.process(input, *workingMemory); armem::ltm::query_proc::MemoryQueryProcessor ltmProcessor; - ltm::Memory ltmResult = ltmProcessor.process(input, *longtermMemory, /* execute if: */ { query::data::QueryTarget::LTM }); + ltm::Memory ltmResult = ltmProcessor.process(input, *longtermMemory); armem::query::data::Result result; if (ltmResult.hasData()) @@ -267,7 +267,7 @@ namespace armarx::armem::server auto queryInput = armem::client::QueryInput::fromIce(input); queryInput.replaceQueryTarget(query::data::QueryTarget::LTM, query::data::QueryTarget::WM); - wm::Memory merged_result = wmProcessor.process(queryInput.toIce(), wmResult, /* execute if: */ { query::data::QueryTarget::WM }); + wm::Memory merged_result = wmProcessor.process(queryInput.toIce(), wmResult); if (!merged_result.hasData()) { ARMARX_ERROR << "A merged and postprocessed Memory has no data although at least the LTM result contains data. This indicates that something is wrong."; diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessorBase.h index 95943dd2f18289360336c22b910913835a84c604..2af92450309d640122bffc9066c1a1df7bdfff49 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessorBase.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/BaseQueryProcessorBase.h @@ -22,34 +22,29 @@ namespace armarx::armem::base::query_proc virtual ~BaseQueryProcessorBase() = default; - DataT process(const QueryT& query, const DataT& data, const query::data::QueryTargets& executeIf = {}) const + DataT process(const QueryT& query, const DataT& data) const { DataT result = data.copyEmpty(); - - for (const auto queryTarget : query.targets) + if (getTargets(query.targets).count(getTargetType())) { - if (std::find(executeIf.begin(), executeIf.end(), queryTarget) != executeIf.end()) - { - this->process(result, query, data); - break; - } + this->process(result, query, data); } return result; } - DataT process(const QueryPtrT& query, const DataT& data, const query::data::QueryTargets& executeIf = {}) const + DataT process(const QueryPtrT& query, const DataT& data) const { - return this->process(*query, *data, executeIf); + return this->process(*query, *data); } - DataT process(const QuerySeqT& queries, const DataT& data, const query::data::QueryTargets& executeIf = {}) const + DataT process(const QuerySeqT& queries, const DataT& data) const { DataT result = data.copyEmpty(); - this->process(result, queries, data, executeIf); + this->process(result, queries, data); return result; } - void process(DataT& result, const QuerySeqT& queries, const DataT& data, const query::data::QueryTargets& executeIf = {}) const + void process(DataT& result, const QuerySeqT& queries, const DataT& data) const { if (queries.empty()) { @@ -57,35 +52,37 @@ namespace armarx::armem::base::query_proc return; } - if (executeIf.empty()) - { - ARMARX_DEBUG << "Could not execute query. ExecuteIf s empty."; - return; - } - for (const auto& query : queries) { - if (query->targets.empty()) + if (getTargets(query->targets).count(getTargetType())) { - ARMARX_DEBUG << "The targets of a query are empty"; - continue; - } - - for (const auto queryTarget : query->targets) - { - if (std::find(executeIf.begin(), executeIf.end(), queryTarget) != executeIf.end()) - { - this->process(result, *query, data); - break; - } - else - { - ARMARX_DEBUG << "The query target " << queryTarget << " was not found in executeIf: " << executeIf; - } + this->process(result, *query, data); } } } virtual void process(DataT& result, const QueryT& query, const DataT& data) const = 0; + + + protected: + + virtual query::data::QueryTarget getTargetType() const = 0; + + + private: + + /// If empty, e.g. when receiving queries from python, we use WM as default. + /// We do it here as (Sl)ice does not support default values for vectors. + static std::set<query::data::QueryTarget> getTargets(const std::vector<query::data::QueryTarget>& _targets) + { + std::set<query::data::QueryTarget> targets(_targets.begin(), _targets.end()); + if (targets.empty()) + { + ARMARX_DEBUG << "Query has no targets - using WM as default."; + targets.insert(query::data::QueryTarget::WM); + } + return targets; + } + }; } diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessorBase.h index cc06defc93976ea018ab8a7d3823a00d6121543d..55c5e51126b49775db7317d6401aa695c4b5581c 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessorBase.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessorBase.h @@ -34,9 +34,9 @@ namespace armarx::armem::base::query_proc using Base::process; - _MemoryT process(const armem::query::data::Input& input, const _MemoryT& memory, const std::vector<query::data::QueryTarget>& executeIf = {}) const + _MemoryT process(const armem::query::data::Input& input, const _MemoryT& memory) const { - return this->process(input.memoryQueries, memory, executeIf); + return this->process(input.memoryQueries, memory); } void process(_MemoryT& result, diff --git a/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/BaseQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/BaseQueryProcessor.h index 84f967795fd26d79d173a14e71498dbec7d56ee1..469b5f907d01bbff757b1bea14ff8e80e5769315 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/BaseQueryProcessor.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/BaseQueryProcessor.h @@ -22,5 +22,11 @@ namespace armarx::armem::d_ltm::query_proc {} protected: + + query::data::QueryTarget getTargetType() const override + { + return query::data::QueryTarget::Disk; + } + }; } diff --git a/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/CoreSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/CoreSegmentQueryProcessor.h index 1c40f7fc64b0a2c59fdc3e54d968c6627480cbb0..5c043a2d1dbe2218078591adc3fc0ebac0bfe932 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/CoreSegmentQueryProcessor.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/CoreSegmentQueryProcessor.h @@ -27,7 +27,7 @@ namespace armarx::armem::d_ltm::query_proc protected: virtual ProviderSegmentT providerSegmentProcessorProcess(const armem::query::data::ProviderSegmentQuerySeq& q, const ProviderSegmentT& s) const override { - return providerSegmentProcessor.process(q, s, {armem::query::data::QueryTarget::Disk}); + return providerSegmentProcessor.process(q, s); } private: diff --git a/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/MemoryQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/MemoryQueryProcessor.h index 2abdcc1ccc7c25a317edc67e36835cb4a4df2f9b..038523950bfe399c2ef7a65b79fde43376651617 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/MemoryQueryProcessor.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/MemoryQueryProcessor.h @@ -26,7 +26,7 @@ namespace armarx::armem::d_ltm::query_proc protected: virtual CoreSegmentT coreSegmentProcessorProcess(const armem::query::data::CoreSegmentQuerySeq& q, const CoreSegmentT& s) const override { - return coreSegmentProcessor.process(q, s, {armem::query::data::QueryTarget::Disk}); + return coreSegmentProcessor.process(q, s); } private: diff --git a/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/ProviderSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/ProviderSegmentQueryProcessor.h index 94c2e756875c1152f8018f70c5e0d691a5704582..2043273ec7c5f3fee2d02410a145ef436c47459c 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/ProviderSegmentQueryProcessor.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/diskmemory/ProviderSegmentQueryProcessor.h @@ -26,7 +26,7 @@ namespace armarx::armem::d_ltm::query_proc protected: virtual EntityT entityProcessorProcess(const armem::query::data::EntityQuerySeq& q, const EntityT& s) const override { - return entityProcessor.process(q, s, {armem::query::data::QueryTarget::Disk}); + return entityProcessor.process(q, s); } private: diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/BaseQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/BaseQueryProcessor.h index 458128e5305139db33a6c25d6ff19e3e92772fd5..64f560afff93e5d0cfff4b036f68f0fb4e8cdaba 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/BaseQueryProcessor.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/BaseQueryProcessor.h @@ -22,5 +22,11 @@ namespace armarx::armem::ltm::query_proc {} protected: + + query::data::QueryTarget getTargetType() const override + { + return query::data::QueryTarget::LTM; + } + }; } diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/CoreSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/CoreSegmentQueryProcessor.h index e333dd816aedabbb8dfa7209c687caf727d9ccf9..dc379f1d88fa82bbe886e412e0341079fa43fce9 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/CoreSegmentQueryProcessor.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/CoreSegmentQueryProcessor.h @@ -27,7 +27,7 @@ namespace armarx::armem::ltm::query_proc protected: virtual ProviderSegmentT providerSegmentProcessorProcess(const armem::query::data::ProviderSegmentQuerySeq& q, const ProviderSegmentT& s) const override { - return providerSegmentProcessor.process(q, s, {armem::query::data::QueryTarget::LTM}); + return providerSegmentProcessor.process(q, s); } private: diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/MemoryQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/MemoryQueryProcessor.h index 569014d6579eeb6c99996e4be5b7cb68f65457b1..a5129417262515975efa247398602272865ee5ec 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/MemoryQueryProcessor.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/MemoryQueryProcessor.h @@ -26,7 +26,7 @@ namespace armarx::armem::ltm::query_proc protected: virtual CoreSegmentT coreSegmentProcessorProcess(const armem::query::data::CoreSegmentQuerySeq& q, const CoreSegmentT& s) const override { - return coreSegmentProcessor.process(q, s, {armem::query::data::QueryTarget::LTM}); + return coreSegmentProcessor.process(q, s); } private: diff --git a/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/ProviderSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/ProviderSegmentQueryProcessor.h index 5443acfd6594b98250711cf2acfd434a98414066..e0c6db9e3ef06e6241e9af8c572bb7fc78eec452 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/ProviderSegmentQueryProcessor.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/longtermmemory/ProviderSegmentQueryProcessor.h @@ -26,7 +26,7 @@ namespace armarx::armem::ltm::query_proc protected: virtual EntityT entityProcessorProcess(const armem::query::data::EntityQuerySeq& q, const EntityT& s) const override { - return entityProcessor.process(q, s, {armem::query::data::QueryTarget::LTM}); + return entityProcessor.process(q, s); } private: diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/BaseQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/BaseQueryProcessor.h index 933f9a6fd628b8c2747c2c6449499e596593935b..d4875053c93dc2278cdb9f327fc0739370811fe7 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/BaseQueryProcessor.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/BaseQueryProcessor.h @@ -26,6 +26,11 @@ namespace armarx::armem::wm::query_proc protected: + query::data::QueryTarget getTargetType() const override + { + return query::data::QueryTarget::WM; + } + 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 index bda9ad04de5ac7cd46be68a2f5f7ca2ec1419040..4c41f16664af134b66b00355080d8de362d7eaf9 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.cpp +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.cpp @@ -32,7 +32,7 @@ namespace armarx::armem::wm::query_proc ProviderSegment CoreSegmentQueryProcessor::providerSegmentProcessorProcess(const armem::query::data::ProviderSegmentQuerySeq& q, const ProviderSegment& s) const { - return providerSegmentProcessor.process(q, s, {armem::query::data::QueryTarget::WM}); + return providerSegmentProcessor.process(q, s); } diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp index 7ef31f2badfbffbf49f132c855b2143b8ddc10bd..005649b8f670586f16177f90a43c6e0f48b3879d 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/EntityQueryProcessor.cpp @@ -6,7 +6,7 @@ namespace armarx::armem::wm::query_proc { EntityQueryProcessor::EntityQueryProcessor(DataMode dataMode) : - Base(dataMode) + BaseQueryProcessor<wm::Entity, armem::query::data::EntityQuery>(dataMode) {} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/MemoryQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/MemoryQueryProcessor.cpp index dd249b61caaacaca11e369b19b8f4e0da1dc5cf5..7aa868af13bc525b42d93f230a8398c27531525d 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/MemoryQueryProcessor.cpp +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/MemoryQueryProcessor.cpp @@ -16,7 +16,7 @@ namespace armarx::armem::wm::query_proc CoreSegment MemoryQueryProcessor::coreSegmentProcessorProcess(const armem::query::data::CoreSegmentQuerySeq& q, const CoreSegment& s) const { - return coreSegmentProcessor.process(q, s, {armem::query::data::QueryTarget::WM}); + return coreSegmentProcessor.process(q, s); } } diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.cpp index a5e23184fa999dc44d72de7588cf77fad0503729..eb2524631b4c1d2fb89eb3e7c36a3aaf86f31e29 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.cpp +++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/ProviderSegmentQueryProcessor.cpp @@ -24,7 +24,7 @@ namespace armarx::armem::wm::query_proc Entity ProviderSegmentQueryProcessor::entityProcessorProcess(const armem::query::data::EntityQuerySeq& q, const Entity& s) const { - return entityProcessor.process(q, s, {armem::query::data::QueryTarget::WM}); + return entityProcessor.process(q, s); } } diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp index 5037bad396c0e7a83b7704b4895a25225ae8106f..f88a2e1731c87de6fa163c307c90f4c6d3e01ae2 100644 --- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp +++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp @@ -245,7 +245,7 @@ namespace armarx::armem::gui input.addQueryTargetToAll(armem::query::data::QueryTarget::Disk); armem::d_ltm::query_proc::MemoryQueryProcessor d_ltm_processor; - dMem = d_ltm_processor.process(input.toIce(), dMem, /* execute if: */ { query::data::QueryTarget::Disk }); + dMem = d_ltm_processor.process(input.toIce(), dMem); wm::Memory converted = dMem.convert(); memoryData[k] = std::move(converted); @@ -275,7 +275,7 @@ namespace armarx::armem::gui // requery (e.g. to get only the last n values instead of the last n from disk and the last n from wm) armem::wm::query_proc::MemoryQueryProcessor wm_processor; - result.memory = wm_processor.process(input.toIce(), result.memory, /* execute if: */ { query::data::QueryTarget::WM }); + result.memory = wm_processor.process(input.toIce(), result.memory); if (!result.memory.hasData()) { @@ -293,7 +293,7 @@ namespace armarx::armem::gui } else { - ARMARX_WARNING << "A query for memory '" + name + "' produced an error: " << result.errorMessage; + ARMARX_WARNING << "A query for memory '" << name << "' produced an error: " << result.errorMessage; if (statusLabel) { statusLabel->setText(QString::fromStdString(result.errorMessage));