Go to the documentation of this file.
9 #include <RobotAPI/interface/armem/query.h>
24 template <
class _EntityT,
class _ResultEntityT>
45 const armem::query::data::EntityQuery& query,
46 const EntityT& entity)
const override
48 if (
auto q =
dynamic_cast<const armem::query::data::entity::All*
>(&query))
52 else if (
auto q =
dynamic_cast<const armem::query::data::entity::Single*
>(&query))
56 else if (
auto q =
dynamic_cast<const armem::query::data::entity::TimeRange*
>(&query))
60 else if (
auto q =
dynamic_cast<const armem::query::data::entity::IndexRange*
>(&query))
64 else if (
auto q =
dynamic_cast<const armem::query::data::entity::TimeApprox*
>(&query))
69 dynamic_cast<const armem::query::data::entity::BeforeOrAtTime*
>(&query))
73 else if (
auto q =
dynamic_cast<const armem::query::data::entity::BeforeTime*
>(&query))
85 const armem::query::data::entity::All& query,
97 const armem::query::data::entity::Single& query,
100 if (query.timestamp.timeSinceEpoch.microSeconds < 0)
109 const Time time = armarx::fromIce<Time>(query.timestamp);
118 std::stringstream ss;
119 ss <<
"Failed to retrieve snapshot with timestamp "
121 <<
" from entity " << entity.
id() <<
".\n"
122 <<
"Entity has timestamps: ";
123 for (
const Time& t : entity.getTimestamps())
135 const armem::query::data::entity::TimeRange& query,
138 if (query.minTimestamp.timeSinceEpoch.microSeconds <=
139 query.maxTimestamp.timeSinceEpoch.microSeconds ||
140 query.minTimestamp.timeSinceEpoch.microSeconds < 0 ||
141 query.maxTimestamp.timeSinceEpoch.microSeconds < 0)
143 const Time min = armarx::fromIce<Time>(query.minTimestamp);
144 const Time max = armarx::fromIce<Time>(query.maxTimestamp);
151 const armem::query::data::entity::IndexRange& query,
157 { this->addResultSnapshot(result, snapshot); });
165 const armem::query::data::EntityQuery& query)
const
176 const armem::query::data::entity::BeforeOrAtTime& query,
179 const Time referenceTimestamp = armarx::fromIce<Time>(query.timestamp);
190 const armem::query::data::entity::BeforeTime& query,
193 const Time referenceTimestamp = armarx::fromIce<Time>(query.timestamp);
196 std::vector<const EntitySnapshotT*> befores;
199 { befores.push_back(&
s); });
202 if (query.maxEntries < 0)
204 num = befores.size();
208 num =
std::min(befores.size(),
static_cast<size_t>(query.maxEntries));
211 for (
size_t r = 0; r < num; ++r)
213 size_t i = befores.size() - 1 - r;
220 const armem::query::data::entity::TimeApprox& query,
223 const Time referenceTimestamp = armarx::fromIce<Time>(query.timestamp);
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;
237 const auto timestampOfMatchBefore = beforeOrAt->id().timestamp;
238 const auto isPerfectMatch = timestampOfMatchBefore == referenceTimestamp;
239 if (isInRange(timestampOfMatchBefore))
254 const auto timestampOfMatchAfter = after->id().timestamp;
255 if (isInRange(timestampOfMatchAfter))
bool forEachSnapshotBefore(const Time &time, std::function< void(EntitySnapshot &)> func) const override
_ResultEntityT ResultEntityT
virtual void process(ResultEntityT &result, const armem::query::data::entity::BeforeOrAtTime &query, const EntityT &entity) const
std::shared_ptr< EntitySnapshot > findFirstSnapshotAfterOrAt(const Time &time) const override
Base class for memory query processors.
A memory storing data in mongodb (needs 'armarx memory start' to start the mongod instance)
typename ResultEntityT::EntitySnapshotT ResultSnapshotT
std::vector< T > max(const std::vector< T > &v1, const std::vector< T > &v2)
bool forEachSnapshot(std::function< void(EntitySnapshot &)> func) const override
iterate over all entity snapshots of this ltm
virtual void process(ResultEntityT &result, const armem::query::data::EntityQuery &query, const EntityT &entity) const override
Process the query and populate result.
bool forEachSnapshotInTimeRange(const Time &min, const Time &max, std::function< void(EntitySnapshot &)> func) const override
std::shared_ptr< EntitySnapshot > findSnapshot(const Time &) const override
find entity snapshot segment
EntitySnapshot EntitySnapshotT
std::vector< T > abs(const std::vector< T > &v)
std::string toDateTimeMilliSeconds(const Time &time, int decimals=6)
Returns timeas e.g.
typename EntityT::EntitySnapshotT EntitySnapshotT
virtual void process(ResultEntityT &result, const armem::query::data::entity::TimeRange &query, const EntityT &entity) const
Represents a point in time.
virtual void process(ResultEntityT &result, const armem::query::data::entity::All &query, const EntityT &entity) const
bool forEachSnapshotInIndexRange(long first, long last, std::function< void(EntitySnapshot &)> func) const override
virtual void process(ResultEntityT &result, const Time &min, const Time &max, const EntityT &entity, const armem::query::data::EntityQuery &query) const
std::vector< T > min(const std::vector< T > &v1, const std::vector< T > &v2)
virtual void process(ResultEntityT &result, const armem::query::data::entity::BeforeTime &query, const EntityT &entity) const
std::shared_ptr< EntitySnapshot > findLatestSnapshot() const override
virtual void addResultSnapshot(ResultEntityT &result, const EntitySnapshotT &snapshot) const =0
std::shared_ptr< EntitySnapshot > findLatestSnapshotBeforeOrAt(const Time &time) const override
Client-side working memory entity.
_ResultEntityT process(const armem::query::data::EntityQuery &query, const _EntityT &data) 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::Single &query, const EntityT &entity) const
Indicates that an entity's history was queried, but is empty.
double s(double t, double s0, double v0, double a0, double j)
void checkReferenceTimestampNonNegative(const Time ×tamp)
virtual void process(ResultEntityT &result, const armem::query::data::entity::IndexRange &query, const EntityT &entity) const