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 
98  auto filecontent = persistenceStrategy_->retrieveItem(
100  auto aron = conv.convert(filecontent, "");
101  wmCoreSegment.aronType() = aron;
102  }
103 
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  {
127  std::lock_guard l(ltm_mutex);
128 
129  ARMARX_TRACE;
130 
131  wmCoreSegment.id() = id().getCoreSegmentID().cleanID();
132 
133  auto& conv = processors->defaultTypeConverter;
134 
135  if (persistenceStrategy_->containsItem(
137  {
138  auto& conv = processors->defaultTypeConverter;
139 
140  auto filecontent = persistenceStrategy_->retrieveItem(
142  auto aron = conv.convert(filecontent, "");
143  wmCoreSegment.aronType() = aron;
144  }
145 
147  [&wmCoreSegment, &n](auto& ltmProviderSegment)
148  {
149  armem::wm::ProviderSegment wmProviderSegment;
150  ltmProviderSegment.loadLatestNReferences(n, wmProviderSegment);
151 
152  // Because there might be multiple LTMs with the same provider segment
153  if (wmCoreSegment.hasProviderSegment(wmProviderSegment.name()))
154  {
155  armem::wm::ProviderSegment existingWmProviderSegment =
156  wmCoreSegment.getProviderSegment(wmProviderSegment.name());
157  existingWmProviderSegment.append(wmProviderSegment);
158  }
159  else
160  {
161  wmCoreSegment.addProviderSegment(wmProviderSegment);
162  }
163  });
164  }
165 
166  void
168  {
169  std::lock_guard l(ltm_mutex);
170 
171  ARMARX_TRACE;
172 
173  ARMARX_DEBUG << "Resolve core segment id=" << id().cleanID().str();
174 
175  wmCoreSegment.forEachProviderSegment(
176  [&](auto& wmProviderSegment)
177  {
178  std::shared_ptr<persistence::MemoryPersistenceStrategy>
179  providerSegmentPersistenceStrategy(persistenceStrategy_);
180 
181  ProviderSegment ltmProviderSegment(
182  getExportName(),
183  id().withProviderSegmentName(wmProviderSegment.id().providerSegmentName),
184  processors,
185  providerSegmentPersistenceStrategy);
186 
187  ltmProviderSegment.resolve(wmProviderSegment);
188  });
189  }
190 
191  void
192  CoreSegment::_store(const armem::wm::CoreSegment& wmCoreSegment, bool simulatedVersion)
193  {
194  std::lock_guard l(ltm_mutex);
195 
196  ARMARX_TRACE;
197 
198  if (id().coreSegmentName.empty())
199  {
201  << "During storage of segment '" << wmCoreSegment.id().str()
202  << "' I noticed that the corresponding LTM has no id set. "
203  << "I set the id of the LTM to the same name, however this should not happen!";
204  id().coreSegmentName = wmCoreSegment.id().coreSegmentName;
205  };
206 
207  ARMARX_DEBUG << "Store core seg";
208 
209  // add foreign key to memory collection
210  if (wmCoreSegment.hasAronType())
211  {
212  auto& conv = processors->defaultTypeConverter;
213 
214  auto [vec, modeSuffix] = conv.convert(wmCoreSegment.aronType());
215  ARMARX_CHECK_EMPTY(modeSuffix);
216 
217  std::string key = persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix;
218  persistenceStrategy_->storeItem(id(), key, vec);
219  ARMARX_DEBUG << "Stored type information for CoreSegment "
220  << wmCoreSegment.id().coreSegmentName;
221  }
222  else
223  {
224  ARMARX_DEBUG << "CoreSegment does not have aron type, so aron type information "
225  "cannot be exported";
226  /*writeForeignKeyToPreviousDocument();*/
227  }
228 
229  wmCoreSegment.forEachProviderSegment(
230  [&](const auto& wmProviderSegment)
231  {
232  std::shared_ptr<persistence::MemoryPersistenceStrategy>
233  providerSegmentPersistenceStrategy(persistenceStrategy_);
234 
235  ProviderSegment ltmProviderSegment(
236  getExportName(),
237  id().withProviderSegmentName(wmProviderSegment.id().providerSegmentName),
238  processors,
239  providerSegmentPersistenceStrategy);
240 
241  ltmProviderSegment.store(wmProviderSegment, simulatedVersion);
242  });
243  }
244 } // 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:192
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:125
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:167