diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessorBase.h index 1b704ed4907f6e1ab4222904f542d74c3bbc6684..0c6199eac95465a27da8bc0d59b4fcd40607d139 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessorBase.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessorBase.h @@ -71,7 +71,7 @@ namespace armarx::armem::server::query_proc::base { coreSegment.forEachProviderSegment([this, &query, &result](const ProviderSegmentT & providerSegment) { - childProcessor.process(result.addProviderSegment(providerSegment.name(), providerSegment.aronType()), query.providerSegmentQueries, providerSegment); + this->_processResult(result, providerSegment, query); }); } @@ -79,14 +79,10 @@ namespace armarx::armem::server::query_proc::base const armem::query::data::core::Single& query, const CoreSegmentT& coreSegment) const { - try + const ProviderSegmentT* providerSegment = coreSegment.findProviderSegment(query.providerSegmentName); + if (providerSegment) { - const ProviderSegmentT& providerSegment = coreSegment.getProviderSegment(query.providerSegmentName); - childProcessor.process(result.addProviderSegment(providerSegment.name(), providerSegment.aronType()), query.providerSegmentQueries, providerSegment); - } - catch (const error::MissingEntry&) - { - // Leave empty. + this->_processResult(result, *providerSegment, query); } } @@ -94,18 +90,29 @@ namespace armarx::armem::server::query_proc::base const armem::query::data::core::Regex& query, const CoreSegmentT& coreSegment) const { - std::regex regex(query.providerSegmentNameRegex); + const std::regex regex(query.providerSegmentNameRegex); coreSegment.forEachProviderSegment( [this, &result, &query, ®ex](const ProviderSegmentT & providerSegment) { if (std::regex_search(providerSegment.name(), regex)) { - childProcessor.process(result.addProviderSegment(providerSegment.name(), providerSegment.aronType()), query.providerSegmentQueries, providerSegment); + this->_processResult(result, providerSegment, query); } }); } + private: + + void _processResult(ResultCoreSegmentT& result, + const ProviderSegmentT& providerSegment, + const armem::query::data::CoreSegmentQuery& query) const + { + ResultProviderSegmentT& added = result.addProviderSegment(providerSegment.name(), providerSegment.aronType()); + childProcessor.process(added, query.providerSegmentQueries, providerSegment); + } + + protected: ChildProcessorT childProcessor; diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.cpp b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.cpp index 5cbac85a8dc5f8899e7c72434516063121a2b4c1..d9df528842d11fd66ba38877318785d6c4dd5263 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.cpp +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.cpp @@ -1 +1,12 @@ #include "EntityQueryProcessorBase.h" + +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + + +namespace armarx::armem::server::query_proc::base +{ + void detail::checkReferenceTimestampNonNegative(const Time& timestamp) + { + ARMARX_CHECK_NONNEGATIVE(timestamp.toMicroSeconds()) << "Reference timestamp must be non-negative."; + } +} diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h index 6552f44f54448dc6f11e8cfe5b820e2bb236bcd9..b0210c37e4ed71b64875a79453e56d928852b54f 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/EntityQueryProcessorBase.h @@ -8,12 +8,14 @@ #include <RobotAPI/interface/armem/query.h> -#include <ArmarXCore/core/exceptions/local/ExpressionException.h> - #include <cstdint> #include <iterator> +namespace armarx::armem::server::query_proc::base::detail +{ + void checkReferenceTimestampNonNegative(const Time& timestamp); +} namespace armarx::armem::server::query_proc::base { @@ -92,27 +94,19 @@ namespace armarx::armem::server::query_proc::base { if (query.timestamp < 0) { - try + if (const ResultSnapshotT* snapshot = entity.findLatestSnapshot()) { - addResultSnapshot(result, entity.getLatestSnapshot()); - } - catch (const armem::error::EntityHistoryEmpty&) - { -#if 0 - ARMARX_IMPORTANT << "Failed to retrieve latest snapshot from entity " << entity.id() << ". " - << "Entity is empty."; -#endif + addResultSnapshot(result, *snapshot); } } else { const Time time = fromIce<Time>(query.timestamp); - try + if (const ResultSnapshotT* snapshot = entity.findSnapshot(time)) { - auto snapshot = entity.getSnapshot(time); - addResultSnapshot(result, snapshot); + addResultSnapshot(result, *snapshot); } - catch (const armem::error::MissingEntry&) + else { // Leave empty. #if 0 @@ -178,8 +172,8 @@ namespace armarx::armem::server::query_proc::base const armem::query::data::entity::BeforeOrAtTime& query, const EntityT& entity) const { - const auto referenceTimestamp = fromIce<Time>(query.timestamp); - ARMARX_CHECK(referenceTimestamp.toMicroSeconds() >= 0) << "Reference timestamp is negative!"; + const Time referenceTimestamp = fromIce<Time>(query.timestamp); + detail::checkReferenceTimestampNonNegative(referenceTimestamp); if (auto* beforeOrAt = entity.findLatestSnapshotBeforeOrAt(referenceTimestamp)) { @@ -192,8 +186,8 @@ namespace armarx::armem::server::query_proc::base const armem::query::data::entity::BeforeTime& query, const EntityT& entity) const { - const armem::Time referenceTimestamp = fromIce<Time>(query.timestamp); - ARMARX_CHECK(referenceTimestamp.toMicroSeconds() >= 0) << "Reference timestamp must be non-negative."; + const Time referenceTimestamp = fromIce<Time>(query.timestamp); + detail::checkReferenceTimestampNonNegative(referenceTimestamp); std::vector<const EntitySnapshotT*> befores; entity.forEachSnapshotBefore(referenceTimestamp, [&befores](const EntitySnapshotT & s) @@ -224,7 +218,7 @@ namespace armarx::armem::server::query_proc::base const EntityT& entity) const { const Time referenceTimestamp = fromIce<Time>(query.timestamp); - ARMARX_CHECK(referenceTimestamp.toMicroSeconds() >= 0) << "Reference timestamp is negative!"; + detail::checkReferenceTimestampNonNegative(referenceTimestamp); const float referenceTimestampMicroSeconds = referenceTimestamp.toMicroSeconds(); const float epsDuration = fromIce<Time>(query.eps).toMicroSeconds(); 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 ecc3ebe511610a0fc3cbb27d3fb93a9e203eb573..91c41d9f54cb762654db9763dfe6d9c3af1aa60d 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessorBase.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessorBase.h @@ -73,7 +73,7 @@ namespace armarx::armem::server::query_proc::base { memory.forEachCoreSegment([this, &result, &query](const CoreSegmentT & coreSegment) { - childProcessor.process(result.addCoreSegment(coreSegment.name(), coreSegment.aronType()), query.coreSegmentQueries, coreSegment); + this->_processResult(result, coreSegment, query); }); } @@ -81,13 +81,9 @@ namespace armarx::armem::server::query_proc::base const armem::query::data::memory::Single& query, const MemoryT& memory) const { - try - { - const CoreSegmentT& coreSegment = memory.getCoreSegment(query.coreSegmentName); - childProcessor.process(result.addCoreSegment(coreSegment.name(), coreSegment.aronType()), query.coreSegmentQueries, coreSegment); - } - catch (const error::MissingEntry&) + if (const CoreSegmentT* coreSegment = memory.findCoreSegment(query.coreSegmentName)) { + this->_processResult(result, *coreSegment, query); } } @@ -100,12 +96,23 @@ namespace armarx::armem::server::query_proc::base { if (std::regex_search(coreSegment.name(), regex)) { - childProcessor.process(result.addCoreSegment(coreSegment.name(), coreSegment.aronType()), query.coreSegmentQueries, coreSegment); + this->_processResult(result, coreSegment, query); } }); } + private: + + void _processResult(ResultMemoryT& result, + const CoreSegmentT& coreSegment, + const armem::query::data::MemoryQuery& query) const + { + ResultCoreSegmentT& added = result.addCoreSegment(coreSegment.name(), coreSegment.aronType()); + childProcessor.process(added, query.coreSegmentQueries, coreSegment); + } + + protected: ChildProcessorT childProcessor; diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessorBase.h index 5102a12829c106e58159e7dcc35a7df0890f93d5..46f146694825936d4834b579093881e8452db3ca 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessorBase.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/base/ProviderSegmentQueryProcessorBase.h @@ -70,7 +70,7 @@ namespace armarx::armem::server::query_proc::base { providerSegment.forEachEntity([this, &result, &query](const EntityT & entity) { - childProcessor.process(result.addEntity(entity.name()), query.entityQueries, entity); + this->_processResult(result, entity, query); }); } @@ -78,14 +78,9 @@ namespace armarx::armem::server::query_proc::base const armem::query::data::provider::Single& query, const ProviderSegmentT& providerSegment) const { - try + if (const EntityT* entity = providerSegment.findEntity(query.entityName)) { - const EntityT& entity = providerSegment.getEntity(query.entityName); - childProcessor.process(result.addEntity(entity.name()), query.entityQueries, entity); - } - catch (const error::MissingEntry&) - { - // Leave empty. + this->_processResult(result, *entity, query); } } @@ -98,13 +93,24 @@ namespace armarx::armem::server::query_proc::base { if (std::regex_search(entity.name(), regex)) { - childProcessor.process(result.addEntity(entity.name()), query.entityQueries, entity); + this->_processResult(result, entity, query); } return true; }); } + private: + + void _processResult(ResultProviderSegmentT& result, + const EntityT& entity, + const armem::query::data::ProviderSegmentQuery& query) const + { + ResultEntityT& added = result.addEntity(entity.name()); + childProcessor.process(added, query.entityQueries, entity); + } + + protected: ChildProcessorT childProcessor;