Reader.cpp
Go to the documentation of this file.
1 #include "Reader.h"
2 
3 #include <optional>
4 #include <string>
5 
9 
16 
20 
22 {
23  Reader::~Reader() = default;
24 
26  Reader::buildQuery(const Query& query) const
27  {
29 
30  // clang-format off
31  auto& sel = qb
32  .coreSegments().withName(properties().coreSegmentName)
33  .providerSegments().withName(query.providerName)
34  .entities();
35  if (query.name.empty()){
36  sel = sel.all();
37  }else{
38  sel = sel.withName(query.name);
39  }
40  sel.snapshots().beforeOrAtTime(query.timestamp);
41  // clang-format on
42 
43  return qb;
44  }
45 
46  std::string
48  {
49  return "mem.nav.costmap.";
50  }
51 
54  {
57  }
58 
60  asCostmap(const armem::wm::ProviderSegment& providerSegment)
61  {
62  ARMARX_CHECK_NOT_EMPTY(providerSegment) << "No entities";
63  ARMARX_CHECK_EQUAL(providerSegment.size(), 1) << "There should be only one entity!";
64 
65  const armem::wm::EntityInstance* entityInstance = nullptr;
66  providerSegment.forEachEntity(
67  [&entityInstance](const armem::wm::Entity& entity)
68  {
69  const auto& entitySnapshot = entity.getLatestSnapshot();
70  ARMARX_CHECK(not entitySnapshot.empty()) << "No entity snapshot instances";
71 
72  entityInstance = &entitySnapshot.getInstance(0);
73  return false;
74  });
75  ARMARX_CHECK_NOT_NULL(entityInstance);
76  return algorithms::fromAron(*entityInstance);
77  }
78 
79  Reader::Result
80  Reader::query(const Query& query) const
81  {
82  const auto qb = buildQuery(query);
83 
84  ARMARX_DEBUG << "[MappingDataReader] query ... ";
85 
86  const armem::client::QueryResult qResult = memoryReader().query(qb.buildQueryInput());
87 
88  ARMARX_DEBUG << "[MappingDataReader] result: " << qResult;
89 
90  if (not qResult.success)
91  {
92  ARMARX_WARNING << "Failed to query data from memory: " << qResult.errorMessage;
93  return {.costmap = std::nullopt,
94  .status = Result::Status::Error,
95  .errorMessage = qResult.errorMessage};
96  }
97 
98  const auto coreSegment = qResult.memory.getCoreSegment(properties().coreSegmentName);
99 
100  if (not coreSegment.hasProviderSegment(query.providerName))
101  {
102  ARMARX_VERBOSE << "Provider segment `" << query.providerName
103  << "` does not exist (yet).";
104  return {.costmap = std::nullopt, .status = Result::Status::NoData};
105  }
106 
107  const armem::wm::ProviderSegment& providerSegment =
108  coreSegment.getProviderSegment(query.providerName);
109 
110  if (providerSegment.empty())
111  {
112  ARMARX_VERBOSE << "No entities.";
113  return {.costmap = std::nullopt,
114  .status = Result::Status::NoData,
115  .errorMessage = "No entities"};
116  }
117 
118  try
119  {
120  return Result{.costmap = asCostmap(providerSegment), .status = Result::Status::Success};
121  }
122  catch (...)
123  {
124  return Result{.status = Result::Status::Error,
125  .errorMessage = GetHandledExceptionString()};
126  }
127  }
128 
129 } // namespace armarx::navigation::memory::client::costmap
armarx::armem::client::query::EntitySelector::all
EntitySelector & all() override
Definition: selectors.cpp:104
armarx::armem::base::detail::MemoryContainerBase::empty
bool empty() const
Definition: MemoryContainerBase.h:41
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:187
armarx::armem::client::util::SimpleReaderBase::properties
const Properties & properties() const
Definition: SimpleReaderBase.cpp:55
armarx::armem::client::query::ProviderSegmentSelector::entities
EntitySelector & entities()
Start specifying entities.
Definition: selectors.cpp:135
Reader.h
armarx::navigation::memory::client::costmap::Reader::buildQuery
::armarx::armem::client::query::Builder buildQuery(const Query &query) const
Definition: Reader.cpp:26
LocalException.h
armarx::armem::wm::ProviderSegment
Client-side working memory provider segment.
Definition: memory_definitions.h:105
armarx::navigation::memory::constants::CostmapCoreSegmentName
const std::string CostmapCoreSegmentName
Definition: constants.h:36
armarx::armem::wm::EntityInstance
Client-side working entity instance.
Definition: memory_definitions.h:32
aron_conversions.h
armarx::navigation::algorithms::fromAron
Costmap fromAron(const armem::wm::EntityInstance &entityInstance)
Definition: aron_conversions.cpp:74
armarx::armem::base::detail::GetLatestSnapshotMixin::getLatestSnapshot
auto & getLatestSnapshot(int snapshotIndex=0)
Retrieve the latest entity snapshot.
Definition: lookup_mixins.h:199
armarx::armem::client::query::EntitySelector::snapshots
SnapshotSelector & snapshots()
Start specifying entity snapshots.
Definition: selectors.cpp:92
ARMARX_CHECK_NOT_NULL
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Definition: ExpressionException.h:206
armarx::navigation::memory::client::costmap::Reader::~Reader
~Reader() override
armarx::navigation::memory::client::costmap
Definition: Reader.cpp:21
armarx::navigation::memory::client::costmap::Reader::propertyPrefix
std::string propertyPrefix() const override
Definition: Reader.cpp:47
armarx::navigation::memory::constants::NavigationMemoryName
const std::string NavigationMemoryName
Definition: constants.h:29
ARMARX_CHECK_NOT_EMPTY
#define ARMARX_CHECK_NOT_EMPTY(c)
Definition: ExpressionException.h:224
armarx::armem::client::QueryResult
Result of a QueryInput.
Definition: Query.h:50
Query.h
armarx::navigation::memory::client::costmap::Reader::query
Result query(const Query &query) const
Definition: Reader.cpp:80
armarx::armem::client::util::SimpleReaderBase::Properties::memoryName
std::string memoryName
Definition: SimpleReaderBase.h:45
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
armarx::navigation::memory::client::costmap::asCostmap
algorithms::Costmap asCostmap(const armem::wm::ProviderSegment &providerSegment)
Definition: Reader.cpp:60
Costmap.h
armarx::armem::base::detail::MemoryContainerBase::size
std::size_t size() const
Definition: MemoryContainerBase.h:47
armarx::GetHandledExceptionString
std::string GetHandledExceptionString()
Definition: Exception.cpp:165
armarx::navigation::memory::client::costmap::Reader::Result::costmap
std::optional< algorithms::Costmap > costmap
Definition: Reader.h:51
armarx::armem::client::query::Builder::coreSegments
CoreSegmentSelector & coreSegments()
Start specifying core segments.
Definition: Builder.cpp:42
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
selectors.h
armarx::armem::client::query::CoreSegmentSelector::withName
CoreSegmentSelector & withName(const std::string &name) override
Definition: selectors.cpp:198
armarx::armem::client::util::SimpleReaderBase::memoryReader
const armem::client::Reader & memoryReader() const
Definition: SimpleReaderBase.cpp:49
armarx::navigation::memory::client::costmap::Reader::Result::status
enum armarx::navigation::memory::client::costmap::Reader::Result::Status status
armarx::navigation::memory::client::costmap::Reader::Query
Definition: Reader.h:42
memory_definitions.h
ExpressionException.h
armarx::navigation::memory::client::costmap::Reader::Result
Definition: Reader.h:49
armarx::armem::client::util::SimpleReaderBase::Properties
Definition: SimpleReaderBase.h:43
armarx::armem::client::query::EntitySelector::withName
EntitySelector & withName(const std::string &name) override
Definition: selectors.cpp:112
armarx::armem::client::query::ProviderSegmentSelector::withName
ProviderSegmentSelector & withName(const std::string &name) override
Definition: selectors.cpp:155
armarx::navigation::memory::client::costmap::Reader::defaultProperties
Properties defaultProperties() const override
Definition: Reader.cpp:53
armarx::armem::base::ProviderSegmentBase::forEachEntity
bool forEachEntity(EntityFunctionT &&func)
Definition: ProviderSegmentBase.h:189
armarx::armem::client::query::SnapshotSelector::beforeOrAtTime
SnapshotSelector & beforeOrAtTime(Time timestamp)
Definition: selectors.cpp:73
Builder.h
constants.h
armarx::armem::client::query::Builder
The query::Builder class provides a fluent-style specification of hierarchical queries.
Definition: Builder.h:21
armarx::armem::client::query::CoreSegmentSelector::providerSegments
ProviderSegmentSelector & providerSegments()
Start specifying provider segments.
Definition: selectors.cpp:178
armarx::armem::wm::Entity
Client-side working memory entity.
Definition: memory_definitions.h:93
Logging.h
ARMARX_CHECK_EQUAL
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
Definition: ExpressionException.h:130
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
SimpleReaderBase.h
armarx::navigation::algorithms::Costmap
Definition: Costmap.h:16
armarx::armem::client::Reader::query
QueryResult query(const QueryInput &input) const
Perform a query.
Definition: Reader.cpp:32