Skip to content
Snippets Groups Projects
Commit 9f189106 authored by Rainer Kartmann's avatar Rainer Kartmann
Browse files

Reduce code-duplication in queries

parent 34a48c8b
No related branches found
No related tags found
2 merge requests!192Fix bugs in ArMem and make disk loading and storing nicer,!188ArMem Updates
......@@ -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, &regex](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;
......
#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.";
}
}
......@@ -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();
......
......@@ -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;
......
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment