ProviderSegment.cpp
Go to the documentation of this file.
1 // Header
2 #include "ProviderSegment.h"
3 #include <memory>
4 
5 // ArmarX
8 
11 
13 {
14  ProviderSegment::ProviderSegment(const std::string& exportName,
15  const armem::MemoryID& memoryId /* UNESCAPED */,
16  const std::shared_ptr<Processors>& filters,
17  const std::shared_ptr<persistence::MemoryPersistenceStrategy>& persistenceStrategy) :
18  ProviderSegmentBase(exportName, memoryId, filters),
19  persistenceStrategy_(persistenceStrategy)
20  {
21  //start();
22  }
23 
24  bool
25  ProviderSegment::forEachEntity(std::function<void(Entity&)> func) const
26  {
27  std::lock_guard l(ltm_mutex);
28 
30 
31  ARMARX_DEBUG << "For each entity (provider segment id=" << id().cleanID().str();
32 
33  for (std::string& entityName : persistenceStrategy_->getContainerKeys(id()))
34  {
35  ARMARX_DEBUG << "Found entity=" << entityName;
36 
37  std::shared_ptr<persistence::MemoryPersistenceStrategy> entityPersistenceStrategy(persistenceStrategy_);
38 
39  Entity ltmEntity(getExportName(),
40  id().withEntityName(entityName),
41  processors,
42  entityPersistenceStrategy);
43 
44  func(ltmEntity);
45  }
46 
47  return true;
48  }
49 
50  bool
51  ProviderSegment::hasEntity(const std::string& entityName) const
52  {
53  std::lock_guard l(ltm_mutex);
54 
56 
57  return persistenceStrategy_->containsContainer(id(), entityName);
58  }
59 
60  std::shared_ptr<Entity>
61  ProviderSegment::findEntity(const std::string& entityName) const
62  {
63  std::lock_guard l(ltm_mutex);
64 
66 
67  if (!hasEntity(entityName))
68  {
69  return nullptr;
70  }
71 
72  return std::make_shared<Entity>(getExportName(),
73  id().withEntityName(entityName),
74  processors,
75  persistenceStrategy_);
76  }
77 
78  void
80  {
81  std::lock_guard l(ltm_mutex);
82 
84 
85  wmProviderSegment.id() = id().getProviderSegmentID().cleanID();
86 
87  auto& conv = processors->defaultTypeConverter;
88  if (persistenceStrategy_->containsItem(id(), persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix))
89  {
90  // load and set type
91  auto& conv = processors->defaultTypeConverter;
92 
93  auto filecontent = persistenceStrategy_->retrieveItem(id(), persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix);
94  auto aron = conv.convert(filecontent, "");
95  wmProviderSegment.aronType() = aron;
96  }
97 
99  [&wmProviderSegment](auto& ltmEntity)
100  {
101  armem::wm::Entity wmEntity;
102  ltmEntity.loadAllReferences(wmEntity);
103 
104  // Because there might be multiple LTMs with the same entity
105  if (wmProviderSegment.hasEntity(wmEntity.name()))
106  {
107  armem::wm::Entity existingWmEntity = wmProviderSegment.getEntity(wmEntity.name());
108  existingWmEntity.append(wmEntity);
109  }
110  else
111  {
112  wmProviderSegment.addEntity(wmEntity);
113  }
114  });
115  }
116 
117  void
119  {
120  std::lock_guard l(ltm_mutex);
121 
122  ARMARX_TRACE;
123 
124  wmProviderSegment.id() = id().getProviderSegmentID().cleanID();
125 
126  auto& conv = processors->defaultTypeConverter;
127 
128  if (persistenceStrategy_->containsItem(id(), persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix))
129  {
130  // load and set type
131  auto& conv = processors->defaultTypeConverter;
132 
133  auto filecontent = persistenceStrategy_->retrieveItem(id(), persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix);
134  auto aron = conv.convert(filecontent, "");
135  wmProviderSegment.aronType() = aron;
136  }
137 
139  [&wmProviderSegment, &n](auto& ltmEntity)
140  {
141  armem::wm::Entity wmEntity;
142  ltmEntity.loadLatestNReferences(n, wmEntity);
143 
144  // Because there might be multiple LTMs with the same entity
145  if (wmProviderSegment.hasEntity(wmEntity.name()))
146  {
147  armem::wm::Entity existingWmEntity = wmProviderSegment.getEntity(wmEntity.name());
148  existingWmEntity.append(wmEntity);
149  }
150  else
151  {
152  wmProviderSegment.addEntity(wmEntity);
153  }
154  });
155  }
156 
157  void
159  {
160  std::lock_guard l(ltm_mutex);
161 
162  ARMARX_TRACE;
163 
164  ARMARX_DEBUG << "Resolve provider segment id=" << id().cleanID().str();
165 
166  wmProviderSegment.forEachEntity(
167  [&](auto& wmEntity)
168  {
169  std::shared_ptr<persistence::MemoryPersistenceStrategy> entityPersistenceStrategy(persistenceStrategy_);
170 
171  Entity ltmEntity(getExportName(),
172  id().withEntityName(wmEntity.id().entityName),
173  processors,
174  entityPersistenceStrategy);
175  ltmEntity.resolve(wmEntity);
176  });
177  }
178 
179  void
180  ProviderSegment::_store(const armem::wm::ProviderSegment& wmProviderSegment, bool simulatedVersion)
181  {
182  std::lock_guard l(ltm_mutex);
183 
184  ARMARX_TRACE;
185 
186  if (id().providerSegmentName.empty())
187  {
189  << "During storage of segment '" << wmProviderSegment.id().str()
190  << "' I noticed that the corresponding LTM has no id set. "
191  << "I set the id of the LTM to the same name, however this should not happen!";
192  id().providerSegmentName = wmProviderSegment.id().providerSegmentName;
193  }
194 
195  ARMARX_DEBUG << "Store provider segment id=" << id().cleanID().str();
196 
197  if (wmProviderSegment.hasAronType())
198  {
199  auto& conv = processors->defaultTypeConverter;
200 
201  auto [vec, modeSuffix] = conv.convert(wmProviderSegment.aronType());
202  ARMARX_CHECK_EMPTY(modeSuffix);
203 
204  std::string key = (persistence::MemoryPersistenceStrategy::TYPE_FILENAME + conv.suffix);
205  persistenceStrategy_->storeItem(id(), key, vec);
206  }
207  else
208  {
209  ARMARX_DEBUG << "ProviderSegment does not seem to have an aron type, so aron type "
210  "information connot be exported";
211  //writeForeignKeyToPreviousDocument();
212  }
213 
214  wmProviderSegment.forEachEntity(
215  [&](const auto& wmEntity)
216  {
217  std::shared_ptr<persistence::MemoryPersistenceStrategy> entityPersistenceStrategy(persistenceStrategy_);
218 
219  Entity ltmEntity(getExportName(),
220  id().withEntityName(wmEntity.id().entityName),
221  processors,
222  entityPersistenceStrategy);
223 
224  ltmEntity.store(wmEntity, simulatedVersion);
225  statistics.recordedEntities++;
226  });
227  }
228 
229 } // namespace armarx::armem::server::ltm
armarx::armem::server::ltm::ProviderSegment::_loadLatestNReferences
void _loadLatestNReferences(int n, armem::wm::ProviderSegment &wmProviderSegment) override
Definition: ProviderSegment.cpp:118
armarx::armem::server::ltm::ProviderSegment::hasEntity
bool hasEntity(const std::string &entityName) const override
check if entity segment exists
Definition: ProviderSegment.cpp:51
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:165
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:14
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:25
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:61
armarx::armem::base::ProviderSegmentBase::hasEntity
bool hasEntity(const std::string &name) const
Definition: ProviderSegmentBase.h:108
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:158
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:180
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:79
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:189
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:93