ProviderSegmentQueryProcessorBase.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <regex>
4 
5 #include <RobotAPI/interface/armem/query.h>
7 
9 
11 {
12 
13  template <class _ProviderSegmentT, class _ResultProviderSegmentT, class _ChildProcessorT>
15  public BaseQueryProcessorBase<_ProviderSegmentT,
16  _ResultProviderSegmentT,
17  armem::query::data::ProviderSegmentQuery>
18  {
19  protected:
20  using Base = BaseQueryProcessorBase<_ProviderSegmentT,
21  _ResultProviderSegmentT,
22  armem::query::data::ProviderSegmentQuery>;
23 
24 
25  public:
26  using ProviderSegmentT = _ProviderSegmentT;
28 
29  using ResultProviderSegmentT = _ResultProviderSegmentT;
31 
32  using ChildProcessorT = _ChildProcessorT;
33 
34 
35  public:
37  {
38  }
39 
42  {
43  }
44 
45  using Base::process;
46 
47  virtual void
49  const armem::query::data::ProviderSegmentQuery& query,
50  const ProviderSegmentT& providerSegment) const override
51  {
52  if (auto q = dynamic_cast<const armem::query::data::provider::All*>(&query))
53  {
54  process(result, *q, providerSegment);
55  }
56  else if (auto q = dynamic_cast<const armem::query::data::provider::Single*>(&query))
57  {
58  process(result, *q, providerSegment);
59  }
60  else if (auto q = dynamic_cast<const armem::query::data::provider::Regex*>(&query))
61  {
62  process(result, *q, providerSegment);
63  }
64  else
65  {
66  throw armem::error::UnknownQueryType(ProviderSegmentT::getLevelName(), query);
67  }
68  }
69 
70  virtual void
72  const armem::query::data::provider::All& query,
73  const ProviderSegmentT& providerSegment) const
74  {
75  providerSegment.forEachEntity([this, &result, &query](const EntityT& entity)
76  { this->_processResult(result, entity, query); });
77  }
78 
79  virtual void
81  const armem::query::data::provider::Single& query,
82  const ProviderSegmentT& providerSegment) const
83  {
84  if (auto entity = providerSegment.findEntity(query.entityName))
85  {
86  this->_processResult(result, *entity, query);
87  }
88  }
89 
90  virtual void
92  const armem::query::data::provider::Regex& query,
93  const ProviderSegmentT& providerSegment) const
94  {
95  const std::regex regex(query.entityNameRegex);
96  providerSegment.forEachEntity(
97  [this, &result, &query, &regex](const EntityT& entity)
98  {
99  if (std::regex_search(entity.name(), regex))
100  {
101  this->_processResult(result, entity, query);
102  }
103  return true;
104  });
105  }
106 
107 
108  protected:
109  void
111  const EntityT& entity,
112  const armem::query::data::ProviderSegmentQuery& query) const
113  {
114  ResultEntityT* child = result.findEntity(entity.name());
115  if (child == nullptr)
116  {
117  child = &result.addEntity(entity.name());
118  }
119  childProcessor.process(*child, query.entityQueries, entity);
120  }
121 
122 
123  protected:
125  };
126 } // namespace armarx::armem::server::query_proc::base
armarx::armem::server::query_proc::base
Definition: BaseQueryProcessorBase.cpp:5
BaseQueryProcessorBase.h
armarx::armem::wm::ProviderSegment
Client-side working memory provider segment.
Definition: memory_definitions.h:105
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase::process
virtual void process(ResultProviderSegmentT &result, const armem::query::data::provider::Single &query, const ProviderSegmentT &providerSegment) const
Definition: ProviderSegmentQueryProcessorBase.h:80
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase::process
virtual void process(ResultProviderSegmentT &result, const armem::query::data::ProviderSegmentQuery &query, const ProviderSegmentT &providerSegment) const override
Process the query and populate result.
Definition: ProviderSegmentQueryProcessorBase.h:48
armarx::armem::server::query_proc::base::BaseQueryProcessorBase
Base class for memory query processors.
Definition: BaseQueryProcessorBase.h:20
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase< server::wm::ProviderSegment, armem::wm::ProviderSegment, EntityQueryProcessor >::ChildProcessorT
EntityQueryProcessor ChildProcessorT
Definition: ProviderSegmentQueryProcessorBase.h:32
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase::process
virtual void process(ResultProviderSegmentT &result, const armem::query::data::provider::All &query, const ProviderSegmentT &providerSegment) const
Definition: ProviderSegmentQueryProcessorBase.h:71
error.h
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase< server::wm::ProviderSegment, armem::wm::ProviderSegment, EntityQueryProcessor >::EntityT
typename ProviderSegmentT::EntityT EntityT
Definition: ProviderSegmentQueryProcessorBase.h:27
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase::childProcessor
ChildProcessorT childProcessor
Definition: ProviderSegmentQueryProcessorBase.h:124
q
#define q
armarx::armem::server::wm::ProviderSegment
Definition: memory_definitions.h:52
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase::ProviderSegmentQueryProcessorBase
ProviderSegmentQueryProcessorBase(ChildProcessorT &&childProcessor)
Definition: ProviderSegmentQueryProcessorBase.h:40
armarx::armem::base::ProviderSegmentBase::forEachEntity
bool forEachEntity(EntityFunctionT &&func)
Definition: ProviderSegmentBase.h:189
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase::_processResult
void _processResult(ResultProviderSegmentT &result, const EntityT &entity, const armem::query::data::ProviderSegmentQuery &query) const
Definition: ProviderSegmentQueryProcessorBase.h:110
armarx::armem::server::query_proc::base::BaseQueryProcessorBase< _ProviderSegmentT, _ResultProviderSegmentT, armem::query::data::ProviderSegmentQuery >::process
_ResultProviderSegmentT process(const armem::query::data::ProviderSegmentQuery &query, const _ProviderSegmentT &data) const
Definition: BaseQueryProcessorBase.h:31
armarx::armem::base::ProviderSegmentBase::addEntity
EntityT & addEntity(const std::string &name)
Add an empty entity with the given name.
Definition: ProviderSegmentBase.h:298
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase< server::wm::ProviderSegment, armem::wm::ProviderSegment, EntityQueryProcessor >::ResultEntityT
typename ResultProviderSegmentT::EntityT ResultEntityT
Definition: ProviderSegmentQueryProcessorBase.h:30
armarx::armem::base::ProviderSegmentBase::findEntity
EntityT * findEntity(const std::string &name)
Definition: ProviderSegmentBase.h:122
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase::process
virtual void process(ResultProviderSegmentT &result, const armem::query::data::provider::Regex &query, const ProviderSegmentT &providerSegment) const
Definition: ProviderSegmentQueryProcessorBase.h:91
armarx::armem::base::ProviderSegmentBase< Entity, ProviderSegment >::EntityT
Entity EntityT
Definition: ProviderSegmentBase.h:37
armarx::armem::error::UnknownQueryType
Indicates that an entity's history was queried, but is empty.
Definition: ArMemError.h:173
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase::ProviderSegmentQueryProcessorBase
ProviderSegmentQueryProcessorBase()
Definition: ProviderSegmentQueryProcessorBase.h:36
armarx::armem::server::query_proc::base::ProviderSegmentQueryProcessorBase
Definition: ProviderSegmentQueryProcessorBase.h:14