ProviderSegment.cpp
Go to the documentation of this file.
1 // Header
2 #include "ProviderSegment.h"
3 
4 #include <memory>
5 
6 // ArmarX
9 
12 
14 {
16  const std::string& exportName,
17  const armem::MemoryID& memoryId /* UNESCAPED */,
18  const std::shared_ptr<Processors>& filters,
19  const std::shared_ptr<persistence::MemoryPersistenceStrategy>& persistenceStrategy) :
20  ProviderSegmentBase(exportName, memoryId, filters),
21  persistenceStrategy_(persistenceStrategy)
22  {
23  //start();
24  }
25 
26  bool
27  ProviderSegment::forEachEntity(std::function<void(Entity&)> func) const
28  {
29  std::lock_guard l(ltm_mutex);
30 
32 
33  ARMARX_DEBUG << "For each entity (provider segment id=" << id().cleanID().str();
34 
35  for (std::string& entityName : persistenceStrategy_->getContainerKeys(id()))
36  {
37  ARMARX_DEBUG << "Found entity=" << entityName;
38 
39  std::shared_ptr<persistence::MemoryPersistenceStrategy> entityPersistenceStrategy(
40  persistenceStrategy_);
41 
42  Entity ltmEntity(getExportName(),
43  id().withEntityName(entityName),
44  processors,
45  entityPersistenceStrategy);
46 
47  func(ltmEntity);
48  }
49 
50  return true;
51  }
52 
53  bool
54  ProviderSegment::hasEntity(const std::string& entityName) const
55  {
56  std::lock_guard l(ltm_mutex);
57 
59 
60  return persistenceStrategy_->containsContainer(id(), entityName);
61  }
62 
63  std::shared_ptr<Entity>
64  ProviderSegment::findEntity(const std::string& entityName) const
65  {
66  std::lock_guard l(ltm_mutex);
67 
69 
70  if (!hasEntity(entityName))
71  {
72  return nullptr;
73  }
74 
75  return std::make_shared<Entity>(
76  getExportName(), id().withEntityName(entityName), processors, persistenceStrategy_);
77  }
78 
79  void
81  {
82  std::lock_guard l(ltm_mutex);
83 
85 
86  wmProviderSegment.id() = id().getProviderSegmentID().cleanID();
87 
88  auto& conv = processors->defaultTypeConverter;
89  if (persistenceStrategy_->containsItem(
91  {
92  // load and set type
93  auto& conv = processors->defaultTypeConverter;
94  try
95  {
96  auto filecontent = persistenceStrategy_->retrieveItem(
98  auto aron = conv.convert(filecontent, "");
99  wmProviderSegment.aronType() = aron;
100  }
101  catch (const nlohmann::json::type_error& e)
102  {
104  << "You are trying to access aron data which is not available, skipping...";
105  wmProviderSegment.aronType() = nullptr;
106  }
107  }
108 
110  [&wmProviderSegment](auto& ltmEntity)
111  {
112  armem::wm::Entity wmEntity;
113  ltmEntity.loadAllReferences(wmEntity);
114 
115  // Because there might be multiple LTMs with the same entity
116  if (wmProviderSegment.hasEntity(wmEntity.name()))
117  {
118  armem::wm::Entity existingWmEntity =
119  wmProviderSegment.getEntity(wmEntity.name());
120  existingWmEntity.append(wmEntity);
121  }
122  else
123  {
124  wmProviderSegment.addEntity(wmEntity);
125  }
126  });
127  }
128 
129  void
131  {
132  std::lock_guard l(ltm_mutex);
133 
134  ARMARX_TRACE;
135 
136  wmProviderSegment.id() = id().getProviderSegmentID().cleanID();
137 
138  auto& conv = processors->defaultTypeConverter;
139 
140  if (persistenceStrategy_->containsItem(
142  {
143  // load and set type
144  auto& conv = processors->defaultTypeConverter;
145 
146  auto filecontent = persistenceStrategy_->retrieveItem(
148  auto aron = conv.convert(filecontent, "");
149  wmProviderSegment.aronType() = aron;
150  }
151 
153  [&wmProviderSegment, &n](auto& ltmEntity)
154  {
155  armem::wm::Entity wmEntity;
156  ltmEntity.loadLatestNReferences(n, wmEntity);
157 
158  // Because there might be multiple LTMs with the same entity
159  if (wmProviderSegment.hasEntity(wmEntity.name()))
160  {
161  armem::wm::Entity existingWmEntity =
162  wmProviderSegment.getEntity(wmEntity.name());
163  existingWmEntity.append(wmEntity);
164  }
165  else
166  {
167  wmProviderSegment.addEntity(wmEntity);
168  }
169  });
170  }
171 
172  void
174  {
175  std::lock_guard l(ltm_mutex);
176 
177  ARMARX_TRACE;
178 
179  ARMARX_DEBUG << "Resolve provider segment id=" << id().cleanID().str();
180 
181  wmProviderSegment.forEachEntity(
182  [&](auto& wmEntity)
183  {
184  std::shared_ptr<persistence::MemoryPersistenceStrategy> entityPersistenceStrategy(
185  persistenceStrategy_);
186 
187  Entity ltmEntity(getExportName(),
188  id().withEntityName(wmEntity.id().entityName),
189  processors,
190  entityPersistenceStrategy);
191  ltmEntity.resolve(wmEntity);
192  });
193  }
194 
195  void
197  bool simulatedVersion)
198  {
199  std::lock_guard l(ltm_mutex);
200 
201  ARMARX_TRACE;
202 
203  if (id().providerSegmentName.empty())
204  {
206  << "During storage of segment '" << wmProviderSegment.id().str()
207  << "' I noticed that the corresponding LTM has no id set. "
208  << "I set the id of the LTM to the same name, however this should not happen!";
209  id().providerSegmentName = wmProviderSegment.id().providerSegmentName;
210  }
211 
212  ARMARX_DEBUG << "Store provider segment id=" << id().cleanID().str();
213 
214  if (wmProviderSegment.hasAronType())
215  {
216  auto& conv = processors->defaultTypeConverter;
217 
218  auto type = wmProviderSegment.aronType();
219 
220  auto [vec, modeSuffix] = conv.convert(type);
221  ARMARX_CHECK_EMPTY(modeSuffix);
222 
223  std::string key = (persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix);
224  persistenceStrategy_->storeItem(id(), key, vec);
225 
226  ARMARX_DEBUG << "Stored type information at " << key;
227  }
228  else
229  {
230  ARMARX_DEBUG << "ProviderSegment " << wmProviderSegment.id().providerSegmentName
231  << " does not seem to have an aron type, so aron type "
232  "information connot be exported";
233  //writeForeignKeyToPreviousDocument();
234  }
235 
236  wmProviderSegment.forEachEntity(
237  [&](const auto& wmEntity)
238  {
239  std::shared_ptr<persistence::MemoryPersistenceStrategy> entityPersistenceStrategy(
240  persistenceStrategy_);
241 
242  Entity ltmEntity(getExportName(),
243  id().withEntityName(wmEntity.id().entityName),
244  processors,
245  entityPersistenceStrategy);
246 
247  ltmEntity.store(wmEntity, simulatedVersion);
248  statistics.recordedEntities++;
249  });
250  }
251 
252 } // namespace armarx::armem::server::ltm
armarx::armem::server::ltm::ProviderSegment::_loadLatestNReferences
void _loadLatestNReferences(int n, armem::wm::ProviderSegment &wmProviderSegment) override
Definition: ProviderSegment.cpp:130
armarx::armem::server::ltm::ProviderSegment::hasEntity
bool hasEntity(const std::string &entityName) const override
check if entity segment exists
Definition: ProviderSegment.cpp:54
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
armarx::armem::MemoryID::providerSegmentName
std::string providerSegmentName
Definition: MemoryID.h:52
armarx::armem::server::ltm::detail::EntityBase::resolve
void resolve(armem::wm::Entity &e)
convert the references of the input into a wm::Memory
Definition: EntityBase.h:46
MemoryPersistenceStrategy.h
armarx::armem::server::ltm::persistence::MemoryPersistenceStrategy::TYPE_FILENAME
static const constexpr char * TYPE_FILENAME
Definition: MemoryPersistenceStrategy.h:191
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::server::ltm::Entity
A memory storing data in mongodb (needs 'armarx memory start' to start the mongod instance)
Definition: Entity.h:14
armarx::armem::base::detail::AronTyped::aronType
aron::type::ObjectPtr & aronType()
Definition: AronTyped.cpp:19
armarx::armem::server::ltm::detail::ProviderSegmentBase< Entity >::ltm_mutex
std::recursive_mutex ltm_mutex
Definition: ProviderSegmentBase.h:99
armarx::armem::server::ltm::ProviderSegment::ProviderSegment
ProviderSegment(const std::string &exportName, const MemoryID &memoryId, const std::shared_ptr< Processors > &filters, const std::shared_ptr< persistence::MemoryPersistenceStrategy > &persistenceStrategy)
Definition: ProviderSegment.cpp:15
magic_enum::detail::n
constexpr auto n() noexcept
Definition: magic_enum.hpp:418
memory_definitions.h
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
armarx::armem::server::ltm::ProviderSegment::forEachEntity
bool forEachEntity(std::function< void(Entity &)> func) const override
iterate over all core segments of this ltm
Definition: ProviderSegment.cpp:27
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
armarx::armem::server::ltm::ProviderSegment::findEntity
std::shared_ptr< Entity > findEntity(const std::string &entityName) const override
find entity segment
Definition: ProviderSegment.cpp:64
armarx::armem::base::ProviderSegmentBase::hasEntity
bool hasEntity(const std::string &name) const
Definition: ProviderSegmentBase.h:112
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
armarx::armem::server::ltm::ProviderSegment::_resolve
void _resolve(armem::wm::ProviderSegment &wmProviderSegment) override
Definition: ProviderSegment.cpp:173
ProviderSegment.h
armarx::armem::server::ltm::detail::ProviderSegmentBase< Entity >::statistics
Statistics statistics
Definition: ProviderSegmentBase.h:101
armarx::armem::server::ltm::detail::MemoryItem::getExportName
virtual std::string getExportName() const
Definition: MemoryItem.h:27
armarx::armem::MemoryID::getProviderSegmentID
MemoryID getProviderSegmentID() const
Definition: MemoryID.cpp:302
armarx::armem::server::ltm::ProviderSegment::_store
void _store(const armem::wm::ProviderSegment &wmProviderSegment, bool simulatedVersion) override
Definition: ProviderSegment.cpp:196
armarx::armem::base::detail::MemoryItem::id
MemoryID & id()
Definition: MemoryItem.h:25
armarx::armem::server::ltm::ProviderSegment::_loadAllReferences
void _loadAllReferences(armem::wm::ProviderSegment &wmProviderSegment) override
Definition: ProviderSegment.cpp:80
armarx::armem::server::ltm::detail::EntityBase::store
void store(const armem::wm::Entity &e, bool simulatedVersion)
encode the content of a wm::Memory and store
Definition: EntityBase.h:53
armarx::armem::server::ltm
Definition: forward_declarations.h:20
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::ProviderSegmentBase::forEachEntity
bool forEachEntity(EntityFunctionT &&func)
Definition: ProviderSegmentBase.h:193
armarx::armem::base::detail::AronTyped::hasAronType
bool hasAronType() const
Definition: AronTyped.cpp:13
armarx::armem::wm::Entity
Client-side working memory entity.
Definition: memory_definitions.h:93
Logging.h
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::armem::base::EntityBase::name
std::string & name()
Definition: EntityBase.h:94