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
24  CoreSegment::forEachProviderSegment(std::function<void(ProviderSegment&)> func) const
25  {
26  std::lock_guard l(ltm_mutex);
27 
29 
30  ARMARX_DEBUG << "For each provider segment (core segment id=" << id().cleanID().str()
31  << ")";
32  ARMARX_DEBUG << "Has strategy="
33  << (persistenceStrategy_ !=
34  nullptr); // Should be very true otherwise we will blow up already here
35  ARMARX_DEBUG << "Strategy identifier=" << persistenceStrategy_->getIdentifier();
36  ARMARX_DEBUG << "Strategy export name=" << persistenceStrategy_->getExportName();
37 
38  for (auto& providerSegmentKey : persistenceStrategy_->getContainerKeys(id()))
39  {
40  std::shared_ptr<persistence::MemoryPersistenceStrategy>
41  providerSegmentPersistenceStrategy(persistenceStrategy_);
42 
44  id().withProviderSegmentName(providerSegmentKey),
45  processors,
46  providerSegmentPersistenceStrategy);
47  func(c);
48  }
49 
50  return true;
51  }
52 
53  bool
54  CoreSegment::hasProviderSegment(const std::string& providerSegmentName) const
55  {
56  std::lock_guard l(ltm_mutex);
57 
59 
60  return persistenceStrategy_->containsContainer(id(), providerSegmentName);
61  }
62 
63  std::shared_ptr<ProviderSegment>
64  CoreSegment::findProviderSegment(const std::string& providerSegmentName) const
65  {
66  std::lock_guard l(ltm_mutex);
67 
69 
70  if (!hasProviderSegment(providerSegmentName))
71  {
72  return nullptr;
73  }
74 
75 
76  return std::make_shared<ProviderSegment>(getExportName(),
77  id().withProviderSegmentName(providerSegmentName),
78  processors,
79  persistenceStrategy_);
80  }
81 
82  void
84  {
85  std::lock_guard l(ltm_mutex);
86 
88 
89  wmCoreSegment.id() = id().getCoreSegmentID().cleanID();
90 
91  auto& conv = processors->defaultTypeConverter;
92 
93  if (persistenceStrategy_->containsItem(
95  {
96  auto& conv = processors->defaultTypeConverter;
97  try
98  {
99  auto filecontent = persistenceStrategy_->retrieveItem(
101  auto aron = conv.convert(filecontent, "");
102  wmCoreSegment.aronType() = aron;
103  }
104  catch (const nlohmann::json::type_error& e)
105  {
107  << "You are trying to access aron data which is not available, skipping...";
108  wmCoreSegment.aronType() = nullptr;
109  }
110  }
111 
113  [&wmCoreSegment](auto& ltmProviderSegment)
114  {
115  armem::wm::ProviderSegment wmProviderSegment;
116  ltmProviderSegment.loadAllReferences(wmProviderSegment);
117 
118  // Because there might be multiple LTMs with the same provider segment
119  if (wmCoreSegment.hasProviderSegment(wmProviderSegment.name()))
120  {
121  armem::wm::ProviderSegment existingWmProviderSegment =
122  wmCoreSegment.getProviderSegment(wmProviderSegment.name());
123  existingWmProviderSegment.append(wmProviderSegment);
124  }
125  else
126  {
127  wmCoreSegment.addProviderSegment(wmProviderSegment);
128  }
129  });
130  }
131 
132  void
134  {
135  std::lock_guard l(ltm_mutex);
136 
137  ARMARX_TRACE;
138 
139  wmCoreSegment.id() = id().getCoreSegmentID().cleanID();
140 
141  auto& conv = processors->defaultTypeConverter;
142 
143  if (persistenceStrategy_->containsItem(
145  {
146  auto& conv = processors->defaultTypeConverter;
147 
148  auto filecontent = persistenceStrategy_->retrieveItem(
150  auto aron = conv.convert(filecontent, "");
151  wmCoreSegment.aronType() = aron;
152  }
153 
155  [&wmCoreSegment, &n](auto& ltmProviderSegment)
156  {
157  armem::wm::ProviderSegment wmProviderSegment;
158  ltmProviderSegment.loadLatestNReferences(n, wmProviderSegment);
159 
160  // Because there might be multiple LTMs with the same provider segment
161  if (wmCoreSegment.hasProviderSegment(wmProviderSegment.name()))
162  {
163  armem::wm::ProviderSegment existingWmProviderSegment =
164  wmCoreSegment.getProviderSegment(wmProviderSegment.name());
165  existingWmProviderSegment.append(wmProviderSegment);
166  }
167  else
168  {
169  wmCoreSegment.addProviderSegment(wmProviderSegment);
170  }
171  });
172  }
173 
174  void
176  {
177  std::lock_guard l(ltm_mutex);
178 
179  ARMARX_TRACE;
180 
181  ARMARX_DEBUG << "Resolve core segment id=" << id().cleanID().str();
182 
183  wmCoreSegment.forEachProviderSegment(
184  [&](auto& wmProviderSegment)
185  {
186  std::shared_ptr<persistence::MemoryPersistenceStrategy>
187  providerSegmentPersistenceStrategy(persistenceStrategy_);
188 
189  ProviderSegment ltmProviderSegment(
190  getExportName(),
191  id().withProviderSegmentName(wmProviderSegment.id().providerSegmentName),
192  processors,
193  providerSegmentPersistenceStrategy);
194 
195  ltmProviderSegment.resolve(wmProviderSegment);
196  });
197  }
198 
199  void
200  CoreSegment::_store(const armem::wm::CoreSegment& wmCoreSegment, bool simulatedVersion)
201  {
202  std::lock_guard l(ltm_mutex);
203 
204  ARMARX_TRACE;
205 
206  if (id().coreSegmentName.empty())
207  {
209  << "During storage of segment '" << wmCoreSegment.id().str()
210  << "' I noticed that the corresponding LTM has no id set. "
211  << "I set the id of the LTM to the same name, however this should not happen!";
212  id().coreSegmentName = wmCoreSegment.id().coreSegmentName;
213  };
214 
215  ARMARX_DEBUG << "Store core seg";
216 
217  // add foreign key to memory collection
218  if (wmCoreSegment.hasAronType())
219  {
220  auto& conv = processors->defaultTypeConverter;
221 
222  auto [vec, modeSuffix] = conv.convert(wmCoreSegment.aronType());
223  ARMARX_CHECK_EMPTY(modeSuffix);
224 
225  std::string key = persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix;
226  persistenceStrategy_->storeItem(id(), key, vec);
227  ARMARX_DEBUG << "Stored type information for CoreSegment "
228  << wmCoreSegment.id().coreSegmentName;
229  }
230  else
231  {
232  ARMARX_DEBUG << "CoreSegment does not have aron type, so aron type information "
233  "cannot be exported";
234  /*writeForeignKeyToPreviousDocument();*/
235  }
236 
237  wmCoreSegment.forEachProviderSegment(
238  [&](const auto& wmProviderSegment)
239  {
240  std::shared_ptr<persistence::MemoryPersistenceStrategy>
241  providerSegmentPersistenceStrategy(persistenceStrategy_);
242 
243  ProviderSegment ltmProviderSegment(
244  getExportName(),
245  id().withProviderSegmentName(wmProviderSegment.id().providerSegmentName),
246  processors,
247  providerSegmentPersistenceStrategy);
248 
249  ltmProviderSegment.store(wmProviderSegment, simulatedVersion);
250  });
251  }
252 } // namespace armarx::armem::server::ltm
armarx::armem::server::ltm::ProviderSegment
Definition: ProviderSegment.h:11
armarx::armem::server::ltm::detail::MemoryItem::processors
std::shared_ptr< Processors > processors
Definition: MemoryItem.h:54
armarx::armem::wm::ProviderSegment
Client-side working memory provider segment.
Definition: memory_definitions.h:105
MemoryPersistenceStrategy.h
armarx::armem::server::ltm::persistence::MemoryPersistenceStrategy::TYPE_FILENAME
static const constexpr char * TYPE_FILENAME
Definition: MemoryPersistenceStrategy.h:191
armarx::armem::server::ltm::detail::CoreSegmentBase< ProviderSegment >::ltm_mutex
std::recursive_mutex ltm_mutex
Definition: CoreSegmentBase.h:101
armarx::armem::base::CoreSegmentBase::hasProviderSegment
bool hasProviderSegment(const std::string &name) const
Definition: CoreSegmentBase.h:118
armarx::armem::server::ltm::detail::ProviderSegmentBase::store
void store(const armem::wm::ProviderSegment &provSeg, bool simulatedVersion)
encode the content of a wm::Memory and store
Definition: ProviderSegmentBase.h:52
ARMARX_CHECK_EMPTY
#define ARMARX_CHECK_EMPTY(c)
Definition: ExpressionException.h:218
armarx::armem::MemoryID::str
std::string str(bool escapeDelimiters=true) const
Get a string representation of this memory ID.
Definition: MemoryID.cpp:102
armarx::armem::base::detail::AronTyped::aronType
aron::type::ObjectPtr & aronType()
Definition: AronTyped.cpp:19
armarx::armem::base::ProviderSegmentBase::name
std::string & name()
Definition: ProviderSegmentBase.h:99
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
armarx::armem::server::ltm::CoreSegment::_store
void _store(const armem::wm::CoreSegment &wmCoreSegment, bool simulatedVersion) override
Definition: CoreSegment.cpp:200
CoreSegment.h
magic_enum::detail::n
constexpr auto n() noexcept
Definition: magic_enum.hpp:418
armarx::armem::MemoryID::coreSegmentName
std::string coreSegmentName
Definition: MemoryID.h:51
memory_definitions.h
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
armarx::armem::server::ltm::CoreSegment::hasProviderSegment
bool hasProviderSegment(const std::string &name) const override
check if provider segment exists
Definition: CoreSegment.cpp:54
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
armarx::armem::wm::CoreSegment
Client-side working memory core segment.
Definition: memory_definitions.h:119
armarx::armem::server::ltm::CoreSegment::_loadAllReferences
void _loadAllReferences(armem::wm::CoreSegment &wmCoreSegment) override
Definition: CoreSegment.cpp:83
armarx::armem::base::CoreSegmentBase::forEachProviderSegment
bool forEachProviderSegment(ProviderSegmentFunctionT &&func)
Definition: CoreSegmentBase.h:219
armarx::armem::server::ltm::detail::MemoryItem::getExportName
virtual std::string getExportName() const
Definition: MemoryItem.h:27
armarx::armem::base::detail::MemoryItem::id
MemoryID & id()
Definition: MemoryItem.h:25
armarx::armem::server::ltm::detail::ProviderSegmentBase::resolve
void resolve(armem::wm::ProviderSegment &provSeg)
convert the references of the input into a wm::Memory
Definition: ProviderSegmentBase.h:45
armarx::armem::server::ltm::CoreSegment::forEachProviderSegment
bool forEachProviderSegment(std::function< void(ProviderSegment &)> func) const override
iterate over all provider segments of this ltm
Definition: CoreSegment.cpp:24
armarx::armem::server::ltm
Definition: forward_declarations.h:20
armarx::armem::MemoryID::getCoreSegmentID
MemoryID getCoreSegmentID() const
Definition: MemoryID.cpp:294
armarx::armem::server::ltm::detail::MemoryItem::id
MemoryID id() const
Definition: MemoryItem.cpp:37
armarx::armem::MemoryID::cleanID
MemoryID cleanID() const
Definition: MemoryID.cpp:133
TimeUtil.h
armarx::armem::base::detail::AronTyped::hasAronType
bool hasAronType() const
Definition: AronTyped.cpp:13
Logging.h
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::armem::server::ltm::CoreSegment::findProviderSegment
std::shared_ptr< ProviderSegment > findProviderSegment(const std::string &name) const override
find provider segment
Definition: CoreSegment.cpp:64
armarx::armem::server::ltm::CoreSegment::_loadLatestNReferences
void _loadLatestNReferences(int n, armem::wm::CoreSegment &wmCoreSegment) override
Definition: CoreSegment.cpp:133
armarx::armem::server::ltm::CoreSegment::CoreSegment
CoreSegment(const std::string &exportName, const MemoryID &memoryId, const std::shared_ptr< Processors > &filters, const std::shared_ptr< persistence::MemoryPersistenceStrategy > &persistenceStrategy)
Definition: CoreSegment.cpp:14
armarx::armem::server::ltm::CoreSegment::_resolve
void _resolve(armem::wm::CoreSegment &wmCoreSegment) override
Definition: CoreSegment.cpp:175