MemoryQueryProcessorBase.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 
10 
11 #include "BaseQueryProcessorBase.h"
12 
13 
14 
16 {
17 
18  template <class _MemoryT, class _ResultMemoryT, class _ChildProcessorT>
20  public BaseQueryProcessorBase<_MemoryT, _ResultMemoryT, armem::query::data::MemoryQuery>
21  {
22  protected:
23  using Base =
25 
26  public:
27  using MemoryT = _MemoryT;
29 
30  using ResultMemoryT = _ResultMemoryT;
32 
33  using ChildProcessorT = _ChildProcessorT;
34 
35 
36  public:
38  {
39  }
40 
42  {
43  }
44 
45  using Base::process;
46 
48  process(const armem::query::data::Input& input, const MemoryT& memory) const
49  {
51 
52  return this->process(input.memoryQueries, memory);
53  }
54 
55  virtual void
57  const armem::query::data::MemoryQuery& query,
58  const MemoryT& memory) const override
59  {
61 
62  if (auto q = dynamic_cast<const armem::query::data::memory::All*>(&query))
63  {
64  process(result, *q, memory);
65  }
66  else if (auto q = dynamic_cast<const armem::query::data::memory::Single*>(&query))
67  {
68  process(result, *q, memory);
69  }
70  else if (auto q = dynamic_cast<const armem::query::data::memory::Regex*>(&query))
71  {
72  process(result, *q, memory);
73  }
74  else
75  {
76  throw armem::error::UnknownQueryType(MemoryT::getLevelName(), query);
77  }
78  }
79 
80  virtual void
82  const armem::query::data::memory::All& query,
83  const MemoryT& memory) const
84  {
86 
87  memory.forEachCoreSegment([this, &result, &query](const CoreSegmentT& coreSegment)
88  { this->_processResult(result, coreSegment, query); });
89  }
90 
91  virtual void
93  const armem::query::data::memory::Single& query,
94  const MemoryT& memory) const
95  {
97 
98  if (auto coreSegment = memory.findCoreSegment(query.coreSegmentName))
99  {
100  this->_processResult(result, *coreSegment, query);
101  }
102  }
103 
104  virtual void
106  const armem::query::data::memory::Regex& query,
107  const MemoryT& memory) const
108  {
109  ARMARX_TRACE;
110 
111  const std::regex regex(query.coreSegmentNameRegex);
112  memory.forEachCoreSegment(
113  [this, &result, &query, &regex](const CoreSegmentT& coreSegment)
114  {
115  if (std::regex_search(coreSegment.name(), regex))
116  {
117  this->_processResult(result, coreSegment, query);
118  }
119  });
120  }
121 
122 
123  protected:
124  virtual bool
125  _processAllowed(const armem::query::data::MemoryQuery& query) const
126  {
127  // always execute query. Override if you want to execute the quey only if a special condition is fulfilled (e.g. querytargets)
128  return true;
129  }
130 
131  void
133  const CoreSegmentT& coreSegment,
134  const armem::query::data::MemoryQuery& query) const
135  {
136  ResultCoreSegmentT* child = result.findCoreSegment(coreSegment.name());
137 
138  if (child == nullptr)
139  {
140  child = &result.addCoreSegment(coreSegment.name(), coreSegment.aronType());
141  }
142 
143  childProcessor.process(*child, query.coreSegmentQueries, coreSegment);
144  }
145 
146 
147  protected:
149  };
150 } // namespace armarx::armem::server::query_proc::base
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase::_processAllowed
virtual bool _processAllowed(const armem::query::data::MemoryQuery &query) const
Definition: MemoryQueryProcessorBase.h:125
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase::process
virtual void process(ResultMemoryT &result, const armem::query::data::memory::Single &query, const MemoryT &memory) const
Definition: MemoryQueryProcessorBase.h:92
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase::process
virtual void process(ResultMemoryT &result, const armem::query::data::memory::Regex &query, const MemoryT &memory) const
Definition: MemoryQueryProcessorBase.h:105
armarx::armem::server::query_proc::base
Definition: BaseQueryProcessorBase.cpp:5
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase< armem::server::ltm::Memory, armem::wm::Memory, CoreSegmentQueryProcessor >::CoreSegmentT
typename MemoryT::CoreSegmentT CoreSegmentT
Definition: MemoryQueryProcessorBase.h:28
armarx::armem::base::MemoryBase::findCoreSegment
CoreSegmentT * findCoreSegment(const std::string &name)
Definition: MemoryBase.h:119
BaseQueryProcessorBase.h
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase::ResultMemoryT
_ResultMemoryT ResultMemoryT
Definition: MemoryQueryProcessorBase.h:30
armarx::armem::server::query_proc::base::BaseQueryProcessorBase
Base class for memory query processors.
Definition: BaseQueryProcessorBase.h:23
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase::MemoryQueryProcessorBase
MemoryQueryProcessorBase()
Definition: MemoryQueryProcessorBase.h:37
armarx::memory
Brief description of class memory.
Definition: memory.h:38
armarx::armem::server::ltm::Memory
A memory storing data on the hard drive and in mongodb (needs 'armarx memory start' to start the mong...
Definition: Memory.h:20
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase::process
virtual void process(ResultMemoryT &result, const armem::query::data::memory::All &query, const MemoryT &memory) const
Definition: MemoryQueryProcessorBase.h:81
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase::process
ResultMemoryT process(const armem::query::data::Input &input, const MemoryT &memory) const
Definition: MemoryQueryProcessorBase.h:48
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase::process
virtual void process(ResultMemoryT &result, const armem::query::data::MemoryQuery &query, const MemoryT &memory) const override
Process the query and populate result.
Definition: MemoryQueryProcessorBase.h:56
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase::MemoryQueryProcessorBase
MemoryQueryProcessorBase(ChildProcessorT &&childProcessor)
Definition: MemoryQueryProcessorBase.h:41
armarx::aron::input
ReaderT::InputType & input
Definition: rw.h:12
error.h
armarx::armem::wm::Memory
Client-side working memory.
Definition: memory_definitions.h:133
armarx::armem::base::MemoryBase::addCoreSegment
CoreSegmentT & addCoreSegment(const std::string &name, aron::type::ObjectPtr coreSegmentType=nullptr, const std::vector< PredictionEngine > &predictionEngines={})
Add an empty core segment with the given name, type and prediction engines.
Definition: MemoryBase.h:259
q
#define q
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase::_processResult
void _processResult(ResultMemoryT &result, const CoreSegmentT &coreSegment, const armem::query::data::MemoryQuery &query) const
Definition: MemoryQueryProcessorBase.h:132
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase< armem::server::ltm::Memory, armem::wm::Memory, CoreSegmentQueryProcessor >::ChildProcessorT
CoreSegmentQueryProcessor ChildProcessorT
Definition: MemoryQueryProcessorBase.h:33
armarx::armem::server::ltm::CoreSegment
Definition: CoreSegment.h:13
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase
Definition: MemoryQueryProcessorBase.h:19
armarx::armem::base::MemoryBase< CoreSegment, Memory >::CoreSegmentT
CoreSegment CoreSegmentT
Definition: MemoryBase.h:37
Logging.h
armarx::armem::server::query_proc::base::BaseQueryProcessorBase< _MemoryT, _ResultMemoryT, armem::query::data::MemoryQuery >::process
_ResultMemoryT process(const armem::query::data::MemoryQuery &query, const _MemoryT &data) const
Definition: BaseQueryProcessorBase.h:34
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::MemoryQueryProcessorBase< armem::server::ltm::Memory, armem::wm::Memory, CoreSegmentQueryProcessor >::ResultCoreSegmentT
typename ResultMemoryT::CoreSegmentT ResultCoreSegmentT
Definition: MemoryQueryProcessorBase.h:31
armarx::armem::server::query_proc::base::MemoryQueryProcessorBase::childProcessor
ChildProcessorT childProcessor
Definition: MemoryQueryProcessorBase.h:148