CoreSegment.cpp
Go to the documentation of this file.
1 #include "CoreSegment.h"
2 #include <memory>
3 
6 
9 
11 {
12 
13  CoreSegment::CoreSegment(const std::string& exportName,
14  const armem::MemoryID& id /* UNESCAPED */,
15  const std::shared_ptr<Processors>& filters,
16  const std::shared_ptr<persistence::MemoryPersistenceStrategy>& persistenceStrategy) :
17  CoreSegmentBase(exportName, id, filters),
18  persistenceStrategy_(persistenceStrategy) {}
19 
20  bool
21  CoreSegment::forEachProviderSegment(std::function<void(ProviderSegment&)> func) const
22  {
23  std::lock_guard l(ltm_mutex);
24 
26 
27  ARMARX_DEBUG << "For each provider segment (core segment id=" << id().cleanID().str() << ")";
28  ARMARX_DEBUG << "Has strategy=" << (persistenceStrategy_ != nullptr); // Should be very true otherwise we will blow up already here
29  ARMARX_DEBUG << "Strategy identifier=" << persistenceStrategy_->getIdentifier();
30  ARMARX_DEBUG << "Strategy export name=" << persistenceStrategy_->getExportName();
31 
32  for (auto& providerSegmentKey : persistenceStrategy_->getContainerKeys(id()))
33  {
34  std::shared_ptr<persistence::MemoryPersistenceStrategy> providerSegmentPersistenceStrategy(persistenceStrategy_);
35 
37  id().withProviderSegmentName(providerSegmentKey),
38  processors,
39  providerSegmentPersistenceStrategy);
40  func(c);
41  }
42 
43  return true;
44  }
45 
46  bool
47  CoreSegment::hasProviderSegment(const std::string& providerSegmentName) const
48  {
49  std::lock_guard l(ltm_mutex);
50 
52 
53  return persistenceStrategy_->containsContainer(id(), providerSegmentName);
54  }
55 
56  std::shared_ptr<ProviderSegment>
57  CoreSegment::findProviderSegment(const std::string& providerSegmentName) const
58  {
59  std::lock_guard l(ltm_mutex);
60 
62 
63  if (!hasProviderSegment(providerSegmentName))
64  {
65  return nullptr;
66  }
67 
68 
69  return std::make_shared<ProviderSegment>(getExportName(),
70  id().withProviderSegmentName(providerSegmentName),
71  processors,
72  persistenceStrategy_);
73  }
74 
75  void
77  {
78  std::lock_guard l(ltm_mutex);
79 
81 
82  wmCoreSegment.id() = id().getCoreSegmentID().cleanID();
83 
84  auto& conv = processors->defaultTypeConverter;
85 
86  if (persistenceStrategy_->containsItem(id(), persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix))
87  {
88  auto& conv = processors->defaultTypeConverter;
89 
90  auto filecontent = persistenceStrategy_->retrieveItem(id(), persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix);
91  auto aron = conv.convert(filecontent, "");
92  wmCoreSegment.aronType() = aron;
93  }
94 
96  [&wmCoreSegment](auto& ltmProviderSegment)
97  {
98  armem::wm::ProviderSegment wmProviderSegment;
99  ltmProviderSegment.loadAllReferences(wmProviderSegment);
100 
101  // Because there might be multiple LTMs with the same provider segment
102  if (wmCoreSegment.hasProviderSegment(wmProviderSegment.name()))
103  {
104  armem::wm::ProviderSegment existingWmProviderSegment = wmCoreSegment.getProviderSegment(wmProviderSegment.name());
105  existingWmProviderSegment.append(wmProviderSegment);
106  }
107  else
108  {
109  wmCoreSegment.addProviderSegment(wmProviderSegment);
110  }
111  });
112  }
113 
114  void
116  {
117  std::lock_guard l(ltm_mutex);
118 
119  ARMARX_TRACE;
120 
121  wmCoreSegment.id() = id().getCoreSegmentID().cleanID();
122 
123  auto& conv = processors->defaultTypeConverter;
124 
125  if (persistenceStrategy_->containsItem(id(), persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix))
126  {
127  auto& conv = processors->defaultTypeConverter;
128 
129  auto filecontent = persistenceStrategy_->retrieveItem(id(), persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix);
130  auto aron = conv.convert(filecontent, "");
131  wmCoreSegment.aronType() = aron;
132  }
133 
135  [&wmCoreSegment, &n](auto& ltmProviderSegment)
136  {
137  armem::wm::ProviderSegment wmProviderSegment;
138  ltmProviderSegment.loadLatestNReferences(n, wmProviderSegment);
139 
140  // Because there might be multiple LTMs with the same provider segment
141  if (wmCoreSegment.hasProviderSegment(wmProviderSegment.name()))
142  {
143  armem::wm::ProviderSegment existingWmProviderSegment = wmCoreSegment.getProviderSegment(wmProviderSegment.name());
144  existingWmProviderSegment.append(wmProviderSegment);
145  }
146  else
147  {
148  wmCoreSegment.addProviderSegment(wmProviderSegment);
149  }
150  });
151  }
152 
153  void
155  {
156  std::lock_guard l(ltm_mutex);
157 
158  ARMARX_TRACE;
159 
160  ARMARX_DEBUG << "Resolve core segment id=" << id().cleanID().str();
161 
162  wmCoreSegment.forEachProviderSegment(
163  [&](auto& wmProviderSegment)
164  {
165  std::shared_ptr<persistence::MemoryPersistenceStrategy> providerSegmentPersistenceStrategy(persistenceStrategy_);
166 
167  ProviderSegment ltmProviderSegment(getExportName(),
168  id().withProviderSegmentName(wmProviderSegment.id().providerSegmentName),
169  processors,
170  providerSegmentPersistenceStrategy);
171 
172  ltmProviderSegment.resolve(wmProviderSegment);
173  });
174  }
175 
176  void
177  CoreSegment::_store(const armem::wm::CoreSegment& wmCoreSegment, bool simulatedVersion)
178  {
179  std::lock_guard l(ltm_mutex);
180 
181  ARMARX_TRACE;
182 
183  if (id().coreSegmentName.empty())
184  {
186  << "During storage of segment '" << wmCoreSegment.id().str()
187  << "' I noticed that the corresponding LTM has no id set. "
188  << "I set the id of the LTM to the same name, however this should not happen!";
189  id().coreSegmentName = wmCoreSegment.id().coreSegmentName;
190  };
191 
192  ARMARX_DEBUG << "Directly store core seg";
193 
194 
195  /*if (!connected())
196  {
197  ARMARX_WARNING << "LTM CORE SEGMENT NOT CONNECTED ALTHOUGH ENABLED " << id().str();
198  return;
199  }*/
200 
201  // add foreign key to memory collection
202  if (wmCoreSegment.hasAronType())
203  {
204  auto& conv = processors->defaultTypeConverter;
205 
206  auto [vec, modeSuffix] = conv.convert(wmCoreSegment.aronType());
207  ARMARX_CHECK_EMPTY(modeSuffix);
208 
209  std::string key = persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix;
210  persistenceStrategy_->storeItem(id(), key, vec);
211  }
212  else
213  {
214  ARMARX_DEBUG << "CoreSegment does not have aron type, so aron type information "
215  "cannot be exported";
216  /*writeForeignKeyToPreviousDocument();*/
217  }
218 
219  wmCoreSegment.forEachProviderSegment(
220  [&](const auto& wmProviderSegment)
221  {
222  std::shared_ptr<persistence::MemoryPersistenceStrategy> providerSegmentPersistenceStrategy(persistenceStrategy_);
223 
224  ProviderSegment ltmProviderSegment(getExportName(),
225  id().withProviderSegmentName(wmProviderSegment.id().providerSegmentName),
226  processors,
227  providerSegmentPersistenceStrategy);
228 
229  ltmProviderSegment.store(wmProviderSegment, simulatedVersion);
230  });
231  }
232 } // 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:165
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:116
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:95
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:177
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:47
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:76
armarx::armem::base::CoreSegmentBase::forEachProviderSegment
bool forEachProviderSegment(ProviderSegmentFunctionT &&func)
Definition: CoreSegmentBase.h:217
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:21
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:57
armarx::armem::server::ltm::CoreSegment::_loadLatestNReferences
void _loadLatestNReferences(int n, armem::wm::CoreSegment &wmCoreSegment) override
Definition: CoreSegment.cpp:115
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:13
armarx::armem::server::ltm::CoreSegment::_resolve
void _resolve(armem::wm::CoreSegment &wmCoreSegment) override
Definition: CoreSegment.cpp:154