10#include <RobotAPI/interface/armem/query.h>
25 template <
class _EntityT,
class _ResultEntityT>
27 public BaseQueryProcessorBase<_EntityT, _ResultEntityT, armem::query::data::EntityQuery>
46 const armem::query::data::EntityQuery&
query,
47 const EntityT& entity)
const override
49 if (
auto q =
dynamic_cast<const armem::query::data::entity::All*
>(&
query))
53 else if (
auto q =
dynamic_cast<const armem::query::data::entity::Single*
>(&
query))
57 else if (
auto q =
dynamic_cast<const armem::query::data::entity::TimeRange*
>(&
query))
61 else if (
auto q =
dynamic_cast<const armem::query::data::entity::IndexRange*
>(&
query))
65 else if (
auto q =
dynamic_cast<const armem::query::data::entity::TimeApprox*
>(&
query))
70 dynamic_cast<const armem::query::data::entity::BeforeOrAtTime*
>(&
query))
74 else if (
auto q =
dynamic_cast<const armem::query::data::entity::BeforeTime*
>(&
query))
86 const armem::query::data::entity::All&
query,
98 const armem::query::data::entity::Single&
query,
101 if (
query.timestamp.timeSinceEpoch.microSeconds < 0)
103 if (
auto snapshot = entity.findLatestSnapshot())
111 if (
auto snapshot = entity.findSnapshot(time))
119 std::stringstream ss;
120 ss <<
"Failed to retrieve snapshot with timestamp "
122 <<
" from entity " << entity.id() <<
".\n"
123 <<
"Entity has timestamps: ";
124 for (
const Time& t : entity.getTimestamps())
136 const armem::query::data::entity::TimeRange&
query,
139 if (
query.minTimestamp.timeSinceEpoch.microSeconds <=
140 query.maxTimestamp.timeSinceEpoch.microSeconds ||
141 query.minTimestamp.timeSinceEpoch.microSeconds < 0 ||
142 query.maxTimestamp.timeSinceEpoch.microSeconds < 0)
152 const armem::query::data::entity::IndexRange&
query,
155 entity.forEachSnapshotInIndexRange(
query.first,
158 { this->addResultSnapshot(result, snapshot); });
166 const armem::query::data::EntityQuery&
query)
const
169 entity.forEachSnapshotInTimeRange(
min,
177 const armem::query::data::entity::BeforeOrAtTime&
query,
183 if (
auto beforeOrAt = entity.findLatestSnapshotBeforeOrAt(referenceTimestamp))
191 const armem::query::data::entity::BeforeTime&
query,
198 std::vector<const EntitySnapshotT*> snapshots;
199 const size_t maxEntries = (
query.maxEntries < 0)
200 ? std::numeric_limits<size_t>::max()
201 :
static_cast<size_t>(
query.maxEntries);
203 entity.forEachSnapshotBeforeReverse(
207 snapshots.push_back(&s);
208 return snapshots.size() < maxEntries;
212 for (
auto it = snapshots.rbegin(); it != snapshots.rend(); ++it)
220 const armem::query::data::entity::TimeApprox&
query,
227 const auto isInRange = [&](
const Time& t) ->
bool
229 return query.eps.microSeconds <= 0 or
230 std::abs((t - referenceTimestamp).toMicroSeconds()) <=
231 query.eps.microSeconds;
235 if (
auto beforeOrAt = entity.findLatestSnapshotBeforeOrAt(referenceTimestamp))
237 const auto timestampOfMatchBefore = beforeOrAt->id().timestamp;
238 const auto isPerfectMatch = timestampOfMatchBefore == referenceTimestamp;
239 if (isInRange(timestampOfMatchBefore))
251 const auto after = entity.findFirstSnapshotAfterOrAt(referenceTimestamp);
254 const auto timestampOfMatchAfter = after->id().timestamp;
255 if (isInRange(timestampOfMatchAfter))
Indicates that an entity's history was queried, but is empty.
Base class for memory query processors.
_ResultEntityT process(const armem::query::data::EntityQuery &query, const _EntityT &data) const
_ResultEntityT ResultEntityT
typename EntityT::EntitySnapshotT EntitySnapshotT
virtual void addResultSnapshot(ResultEntityT &result, const EntitySnapshotT &snapshot) const =0
virtual void process(ResultEntityT &result, const armem::query::data::EntityQuery &query, const EntityT &entity) const override
Process the query and populate result.
typename ResultEntityT::EntitySnapshotT ResultSnapshotT
BaseQueryProcessorBase< _EntityT, _ResultEntityT, armem::query::data::EntityQuery > Base
virtual void process(ResultEntityT &result, const armem::query::data::entity::TimeRange &query, const EntityT &entity) const
virtual void process(ResultEntityT &result, const armem::query::data::entity::Single &query, const EntityT &entity) const
virtual void process(ResultEntityT &result, const Time &min, const Time &max, const EntityT &entity, const armem::query::data::EntityQuery &query) const
virtual void process(ResultEntityT &result, const armem::query::data::entity::BeforeTime &query, const EntityT &entity) const
virtual void process(ResultEntityT &result, const armem::query::data::entity::TimeApprox &query, const EntityT &entity) const
virtual void process(ResultEntityT &result, const armem::query::data::entity::All &query, const EntityT &entity) const
virtual void process(ResultEntityT &result, const armem::query::data::entity::IndexRange &query, const EntityT &entity) const
virtual void process(ResultEntityT &result, const armem::query::data::entity::BeforeOrAtTime &query, const EntityT &entity) const
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
void checkReferenceTimestampNonNegative(const Time ×tamp)
std::string toDateTimeMilliSeconds(const Time &time, int decimals=6)
Returns timeas e.g.
armarx::core::time::DateTime Time
std::vector< T > max(const std::vector< T > &v1, const std::vector< T > &v2)
void fromIce(const std::map< IceKeyT, IceValueT > &iceMap, boost::container::flat_map< CppKeyT, CppValueT > &cppMap)
std::vector< T > min(const std::vector< T > &v1, const std::vector< T > &v2)