CoreSegment.cpp
Go to the documentation of this file.
1#include "CoreSegment.h"
2
3#include <memory>
4
7
10
12{
13
15 const std::string& exportName,
16 const armem::MemoryID& id /* UNESCAPED */,
17 const std::shared_ptr<Processors>& filters,
18 const std::shared_ptr<persistence::MemoryPersistenceStrategy>& persistenceStrategy) :
19 CoreSegmentBase(exportName, id, filters), persistenceStrategy_(persistenceStrategy)
20 {
21 }
22
23 bool
25 {
27
28 ARMARX_DEBUG << "For each provider segment (core segment id=" << id().cleanID().str()
29 << ")";
30 ARMARX_DEBUG << "Has strategy="
31 << (persistenceStrategy_ !=
32 nullptr); // Should be very true otherwise we will blow up already here
33 ARMARX_DEBUG << "Strategy identifier=" << persistenceStrategy_->getIdentifier();
34 ARMARX_DEBUG << "Strategy export name=" << persistenceStrategy_->getExportName();
35
36 for (auto& providerSegmentKey : persistenceStrategy_->getContainerKeys(id()))
37 {
38 std::shared_ptr<persistence::MemoryPersistenceStrategy>
39 providerSegmentPersistenceStrategy(persistenceStrategy_);
40
42 id().withProviderSegmentName(providerSegmentKey),
44 providerSegmentPersistenceStrategy);
45 func(c);
46 }
47
48 return true;
49 }
50
51 bool
52 CoreSegment::_implHasProviderSegment(const std::string& providerSegmentName) const
53 {
55
56 return persistenceStrategy_->containsContainer(id(), providerSegmentName);
57 }
58
59 std::shared_ptr<ProviderSegment>
60 CoreSegment::_implFindProviderSegment(const std::string& providerSegmentName) const
61 {
63
64 if (!_implHasProviderSegment(providerSegmentName)) // Call _impl version
65 {
66 return nullptr;
67 }
68
69
70 return std::make_shared<ProviderSegment>(getExportName(),
71 id().withProviderSegmentName(providerSegmentName),
73 persistenceStrategy_);
74 }
75
76 void
78 {
80
81 wmCoreSegment.id() = id().getCoreSegmentID().cleanID();
82
83 auto& conv = processors->defaultTypeConverter;
84
85 if (persistenceStrategy_->containsItem(
87 {
88 auto& conv = processors->defaultTypeConverter;
89 try
90 {
91 auto filecontent = persistenceStrategy_->retrieveItem(
93 auto aron = conv.convert(filecontent, "");
94 wmCoreSegment.aronType() = aron;
95 }
96 catch (const nlohmann::json::type_error& e)
97 {
98 ARMARX_WARNING << "You are trying to access aron data in a CoreSegment which is "
99 "not available, skipping...";
100 wmCoreSegment.aronType() = nullptr;
101 }
102 }
103
104 _implForEachProviderSegment( // Call _impl version
105 [&wmCoreSegment](auto& ltmProviderSegment)
106 {
107 armem::wm::ProviderSegment wmProviderSegment;
108 ltmProviderSegment.loadAllReferences(wmProviderSegment);
109
110 // Because there might be multiple LTMs with the same provider segment
111 if (wmCoreSegment.hasProviderSegment(wmProviderSegment.name()))
112 {
113 armem::wm::ProviderSegment existingWmProviderSegment =
114 wmCoreSegment.getProviderSegment(wmProviderSegment.name());
115 existingWmProviderSegment.append(wmProviderSegment);
116 }
117 else
118 {
119 wmCoreSegment.addProviderSegment(wmProviderSegment);
120 }
121 });
122 }
123
124 void
126 {
128
129 wmCoreSegment.id() = id().getCoreSegmentID().cleanID();
130
131 auto& conv = processors->defaultTypeConverter;
132
133 ARMARX_INFO << "Before type conversion";
134
135 if (persistenceStrategy_->containsItem(
137 {
138 auto& conv = processors->defaultTypeConverter;
139
140 try
141 {
142 auto filecontent = persistenceStrategy_->retrieveItem(
144 auto aron = conv.convert(filecontent, "");
145 wmCoreSegment.aronType() = aron;
146 }
147 catch (const nlohmann::json::type_error& e)
148 {
150 << "You are trying to access aron data which is not available, skipping...";
151 wmCoreSegment.aronType() = nullptr;
152 }
153 }
154
155 ARMARX_INFO << "After type conversion";
156
157 _implForEachProviderSegment( // Call _impl version
158 [&wmCoreSegment, &n](auto& ltmProviderSegment)
159 {
160 armem::wm::ProviderSegment wmProviderSegment;
161 ltmProviderSegment.loadLatestNReferences(n, wmProviderSegment);
162
163 // Because there might be multiple LTMs with the same provider segment
164 if (wmCoreSegment.hasProviderSegment(wmProviderSegment.name()))
165 {
166 armem::wm::ProviderSegment existingWmProviderSegment =
167 wmCoreSegment.getProviderSegment(wmProviderSegment.name());
168 existingWmProviderSegment.append(wmProviderSegment);
169 }
170 else
171 {
172 wmCoreSegment.addProviderSegment(wmProviderSegment);
173 }
174 });
175 }
176
177 void
179 {
181
182 ARMARX_DEBUG << "Resolve core segment id=" << id().cleanID().str();
183
184 wmCoreSegment.forEachProviderSegment(
185 [&](auto& wmProviderSegment)
186 {
187 std::shared_ptr<persistence::MemoryPersistenceStrategy>
188 providerSegmentPersistenceStrategy(persistenceStrategy_);
189
190 ProviderSegment ltmProviderSegment(
192 id().withProviderSegmentName(wmProviderSegment.id().providerSegmentName),
194 providerSegmentPersistenceStrategy);
195
196 ltmProviderSegment.resolve(wmProviderSegment);
197 });
198 }
199
200 void
201 CoreSegment::_store(const armem::wm::CoreSegment& wmCoreSegment, bool simulatedVersion)
202 {
204
205 if (id().coreSegmentName.empty())
206 {
208 << "During storage of segment '" << wmCoreSegment.id().str()
209 << "' I noticed that the corresponding LTM has no id set. "
210 << "I set the id of the LTM to the same name, however this should not happen!";
211 id().coreSegmentName = wmCoreSegment.id().coreSegmentName;
212 };
213
214 ARMARX_DEBUG << "Store core seg";
215
216 // add foreign key to memory collection
217 if (wmCoreSegment.hasAronType())
218 {
219 auto& conv = processors->defaultTypeConverter;
220
221 auto [vec, modeSuffix] = conv.convert(wmCoreSegment.aronType());
222 ARMARX_CHECK_EMPTY(modeSuffix);
223
224 std::string key = persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix;
225
226 // Only write type file if it doesn't already exist
227 if (!persistenceStrategy_->containsItem(id(), key))
228 {
229 persistenceStrategy_->storeItem(id(), key, vec);
230 ARMARX_DEBUG << "Stored type information for CoreSegment "
231 << wmCoreSegment.id().coreSegmentName;
232 }
233 }
234 else
235 {
236 ARMARX_DEBUG << "CoreSegment does not have aron type, so aron type information "
237 "cannot be exported";
238 /*writeForeignKeyToPreviousDocument();*/
239 }
240
241 wmCoreSegment.forEachProviderSegment(
242 [&](const auto& wmProviderSegment)
243 {
244 std::shared_ptr<persistence::MemoryPersistenceStrategy>
245 providerSegmentPersistenceStrategy(persistenceStrategy_);
246
247 ProviderSegment ltmProviderSegment(
249 id().withProviderSegmentName(wmProviderSegment.id().providerSegmentName),
251 providerSegmentPersistenceStrategy);
252
253 ltmProviderSegment.store(wmProviderSegment, simulatedVersion);
254 });
255 }
256} // namespace armarx::armem::server::ltm
#define ARMARX_CHECK_EMPTY(c)
constexpr T c
std::string coreSegmentName
Definition MemoryID.h:51
MemoryID cleanID() const
Definition MemoryID.cpp:133
MemoryID getCoreSegmentID() const
Definition MemoryID.cpp:294
std::string str(bool escapeDelimiters=true) const
Get a string representation of this memory ID.
Definition MemoryID.cpp:102
ProviderSegmentT & addProviderSegment(const std::string &name, aron::type::ObjectPtr providerSegmentType=nullptr, const std::vector< PredictionEngine > &predictionEngines={})
Add an empty provider segment with the given name, optional provider segment type and prediction engi...
bool hasProviderSegment(const std::string &name) const
bool forEachProviderSegment(ProviderSegmentFunctionT &&func)
ProviderSegmentT & getProviderSegment(const std::string &name)
void append(const OtherDerivedT &other)
aron::type::ObjectPtr & aronType()
Definition AronTyped.cpp:19
CoreSegment(const std::string &exportName, const MemoryID &memoryId, const std::shared_ptr< Processors > &filters, const std::shared_ptr< persistence::MemoryPersistenceStrategy > &persistenceStrategy)
bool _implForEachProviderSegment(std::function< void(ProviderSegment &)> func) const override
bool _implHasProviderSegment(const std::string &name) const override
void _loadLatestNReferences(int n, armem::wm::CoreSegment &wmCoreSegment) override
std::shared_ptr< ProviderSegment > _implFindProviderSegment(const std::string &name) const override
void _resolve(armem::wm::CoreSegment &wmCoreSegment) override
void _store(const armem::wm::CoreSegment &wmCoreSegment, bool simulatedVersion) override
void _loadAllReferences(armem::wm::CoreSegment &wmCoreSegment) override
virtual std::string getExportName() const
Definition MemoryItem.h:27
std::shared_ptr< Processors > processors
Definition MemoryItem.h:54
void store(const armem::wm::ProviderSegment &provSeg, bool simulatedVersion)
encode the content of a wm::Memory and store
void resolve(armem::wm::ProviderSegment &provSeg)
convert the references of the input into a wm::Memory
Client-side working memory core segment.
Client-side working memory provider segment.
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
Definition Logging.h:184
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:193
#define ARMARX_TRACE
Definition trace.h:77