From 1513281d4ab613130073ca40a0deaf0c3843226b Mon Sep 17 00:00:00 2001 From: armar-user <armar6@kit> Date: Wed, 28 Jul 2021 20:58:03 +0200 Subject: [PATCH] (RK,FR): fixing query processors: if no modality is specified, assuming working memory query --- .../armem/server/MemoryToIceAdapter.cpp | 6 +- .../query_proc/base/BaseQueryProcessorBase.h | 67 +++++++++---------- .../base/MemoryQueryProcessorBase.h | 4 +- .../diskmemory/BaseQueryProcessor.h | 6 ++ .../diskmemory/CoreSegmentQueryProcessor.h | 2 +- .../diskmemory/MemoryQueryProcessor.h | 2 +- .../ProviderSegmentQueryProcessor.h | 2 +- .../longtermmemory/BaseQueryProcessor.h | 6 ++ .../CoreSegmentQueryProcessor.h | 2 +- .../longtermmemory/MemoryQueryProcessor.h | 2 +- .../ProviderSegmentQueryProcessor.h | 2 +- .../workingmemory/BaseQueryProcessor.h | 5 ++ .../CoreSegmentQueryProcessor.cpp | 2 +- .../workingmemory/EntityQueryProcessor.cpp | 2 +- .../workingmemory/MemoryQueryProcessor.cpp | 2 +- .../ProviderSegmentQueryProcessor.cpp | 2 +- .../libraries/armem_gui/MemoryViewer.cpp | 6 +- 17 files changed, 67 insertions(+), 53 deletions(-) diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp index 2a33e54c1..354eec9ce 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 95943dd2f..2af924503 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 cc06defc9..55c5e5112 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 84f967795..469b5f907 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 1c40f7fc6..5c043a2d1 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 2abdcc1cc..038523950 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 94c2e7568..2043273ec 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 458128e53..64f560aff 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 e333dd816..dc379f1d8 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 569014d65..a51294172 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 5443acfd6..e0c6db9e3 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 933f9a6fd..d4875053c 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 bda9ad04d..4c41f1666 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 7ef31f2ba..005649b8f 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 dd249b61c..7aa868af1 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 a5e23184f..eb2524631 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 5037bad39..f88a2e173 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)); -- GitLab