diff --git a/source/RobotAPI/interface/armem/query.ice b/source/RobotAPI/interface/armem/query.ice index 87cd1b1e5787f00d9fedebb9aa23601276ff48af..2fd1b057779c6d9e78647e24d9fe64b47fa265de 100644 --- a/source/RobotAPI/interface/armem/query.ice +++ b/source/RobotAPI/interface/armem/query.ice @@ -30,6 +30,12 @@ module armarx long minTimestamp = -1; // -1 for oldest long maxTimestamp = -1; // -1 for latest }; + /// Get just the timestamps without data. Default values for all. + class Timestamps extends EntityQuery + { + long minTimestamp = -1; // -1 for oldest + long maxTimestamp = -1; // -1 for latest + }; } diff --git a/source/RobotAPI/libraries/armem/query/EntityQueryProcessor.cpp b/source/RobotAPI/libraries/armem/query/EntityQueryProcessor.cpp index 96f90c17895addc19ad49fc4b2a67a2ec7544a3a..2c7dff6a5171c93fb357f50d93acb82343fab3ab 100644 --- a/source/RobotAPI/libraries/armem/query/EntityQueryProcessor.cpp +++ b/source/RobotAPI/libraries/armem/query/EntityQueryProcessor.cpp @@ -71,11 +71,11 @@ namespace armarx::armem { Time min = fromIce<Time>(query.minTimestamp); Time max = fromIce<Time>(query.maxTimestamp); - process(result, min, max, entity); + process(result, min, max, entity, false); } } - void EntityQueryProcessor::process(Entity& result, const Time& min, const Time& max, const Entity& entity) const + void EntityQueryProcessor::process(Entity& result, const Time& min, const Time& max, const Entity& entity, bool timestampsOnly) const { // 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(); @@ -84,7 +84,24 @@ namespace armarx::armem for (auto it = begin; it != end && it != entity.history.end(); ++it) { - result.addSnapshot(*it->second); + if (timestampsOnly) + { + result.history.emplace(it->second->time, nullptr); + } + else + { + result.addSnapshot(*it->second); + } + } + } + + void EntityQueryProcessor::process(Entity& result, const query::entity::Timestamps& query, const 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, true); } } diff --git a/source/RobotAPI/libraries/armem/query/EntityQueryProcessor.h b/source/RobotAPI/libraries/armem/query/EntityQueryProcessor.h index 64235ff2844cb14e5fa1a367c3782bbe5f37962e..0ff0f5af2e621207c9f6249060bcf1e9116c2a5e 100644 --- a/source/RobotAPI/libraries/armem/query/EntityQueryProcessor.h +++ b/source/RobotAPI/libraries/armem/query/EntityQueryProcessor.h @@ -25,8 +25,10 @@ namespace armarx::armem void process(Entity& result, const query::entity::All& query, const Entity& entity) const; void process(Entity& result, const query::entity::Single& query, const Entity& entity) const; void process(Entity& result, const query::entity::Range& query, const Entity& entity) const; + void process(Entity& result, const query::entity::Timestamps& query, const Entity& entity) const; - void process(Entity& result, const Time& min, const Time& max, const Entity& entity) const; + void process(Entity& result, const Time& min, const Time& max, const Entity& entity, + bool timestampsOnly = false) const; data::EntityPtr processToIce(const query::EntityQuery& query, const Entity& entity) const;