CoreSegmentQueryProcessorBase.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 /**
14 * @brief Handles memory queries.
15 */
16 template <class _CoreSegmentT, class _ResultCoreSegmentT, class _ChildProcessorT>
18 public BaseQueryProcessorBase<_CoreSegmentT,
19 _ResultCoreSegmentT,
20 armem::query::data::CoreSegmentQuery>
21 {
22 protected:
23 using Base = BaseQueryProcessorBase<_CoreSegmentT,
24 _ResultCoreSegmentT,
25 armem::query::data::CoreSegmentQuery>;
26
27 public:
28 using CoreSegmentT = _CoreSegmentT;
29 using ProviderSegmentT = typename CoreSegmentT::ProviderSegmentT;
30
31 using ResultCoreSegmentT = _ResultCoreSegmentT;
32 using ResultProviderSegmentT = typename ResultCoreSegmentT::ProviderSegmentT;
33
34 using ChildProcessorT = _ChildProcessorT;
35
36
37 public:
41
46
47 using Base::process;
48
49 virtual void
51 const armem::query::data::CoreSegmentQuery& query,
52 const CoreSegmentT& coreSegment) const override
53 {
54 if (auto q = dynamic_cast<const armem::query::data::core::All*>(&query))
55 {
56 process(result, *q, coreSegment);
57 }
58 else if (auto q = dynamic_cast<const armem::query::data::core::Single*>(&query))
59 {
60 process(result, *q, coreSegment);
61 }
62 else if (auto q = dynamic_cast<const armem::query::data::core::Regex*>(&query))
63 {
64 process(result, *q, coreSegment);
65 }
66 else
67 {
68 throw armem::error::UnknownQueryType("core segment", query);
69 }
70 }
71
72 virtual void
74 const armem::query::data::core::All& query,
75 const CoreSegmentT& coreSegment) const
76 {
77 coreSegment.forEachProviderSegment(
78 [this, &query, &result](const ProviderSegmentT& providerSegment)
79 { this->_processResult(result, providerSegment, query); });
80 }
81
82 virtual void
84 const armem::query::data::core::Single& query,
85 const CoreSegmentT& coreSegment) const
86 {
87 if (auto providerSegment = coreSegment.findProviderSegment(query.providerSegmentName))
88 {
89 this->_processResult(result, *providerSegment, query);
90 }
91 }
92
93 virtual void
95 const armem::query::data::core::Regex& query,
96 const CoreSegmentT& coreSegment) const
97 {
98 const std::regex regex(query.providerSegmentNameRegex);
99 coreSegment.forEachProviderSegment(
100 [this, &result, &query, &regex](const ProviderSegmentT& providerSegment)
101 {
102 if (std::regex_search(providerSegment.name(), regex))
103 {
104 this->_processResult(result, providerSegment, query);
105 }
106 });
107 }
108
109
110 protected:
111 void
113 const ProviderSegmentT& providerSegment,
114 const armem::query::data::CoreSegmentQuery& query) const
115 {
116 ResultProviderSegmentT* child = result.findProviderSegment(providerSegment.name());
117 if (child == nullptr)
118 {
119 child =
120 &result.addProviderSegment(providerSegment.name(), providerSegment.aronType());
121 }
122
123 childProcessor.process(*child, query.providerSegmentQueries, providerSegment);
124 }
125
126
127 protected:
129 };
130} // namespace armarx::armem::server::query_proc::base
Indicates that an entity's history was queried, but is empty.
Definition ArMemError.h:174
_ResultCoreSegmentT process(const armem::query::data::CoreSegmentQuery &query, const _CoreSegmentT &data) const
virtual void process(ResultCoreSegmentT &result, const armem::query::data::core::All &query, const CoreSegmentT &coreSegment) const
virtual void process(ResultCoreSegmentT &result, const armem::query::data::core::Single &query, const CoreSegmentT &coreSegment) const
void _processResult(ResultCoreSegmentT &result, const ProviderSegmentT &providerSegment, const armem::query::data::CoreSegmentQuery &query) const
virtual void process(ResultCoreSegmentT &result, const armem::query::data::CoreSegmentQuery &query, const CoreSegmentT &coreSegment) const override
Process the query and populate result.
BaseQueryProcessorBase< _CoreSegmentT, _ResultCoreSegmentT, armem::query::data::CoreSegmentQuery > Base
virtual void process(ResultCoreSegmentT &result, const armem::query::data::core::Regex &query, const CoreSegmentT &coreSegment) const
#define q