EntitySnapshot.cpp
Go to the documentation of this file.
1 // Header
2 #include "EntitySnapshot.h"
3 #include <memory>
4 
5 // ArmarX
8 
11 
13 {
14  EntitySnapshot::EntitySnapshot(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  EntitySnapshotBase(exportName, memoryId, filters),
19  persistenceStrategy_(persistenceStrategy) {}
20 
21  bool
22  EntitySnapshot::forEachInstance(std::function<void(EntityInstance&)> func) const
23  {
24  std::lock_guard l(ltm_mutex);
25 
27 
28  ARMARX_DEBUG << "For each entity instance (entity snapshot= " << id().cleanID().str() << ")";
29 
30  for (auto& entityInstanceKey : persistenceStrategy_->getContainerKeys(id()))
31  {
32  std::shared_ptr<persistence::MemoryPersistenceStrategy> entityInstancePersistenceStrategy(persistenceStrategy_);
33  MemoryID entityInstanceId = id().withInstanceIndex(std::stoi(entityInstanceKey));
35  entityInstanceId,
36  processors,
37  entityInstancePersistenceStrategy);
38 
39  func(c);
40  }
41 
42  return true;
43  }
44 
45  bool
46  EntitySnapshot::hasInstance(const int entityInstanceIndex) const
47  {
48  std::lock_guard l(ltm_mutex);
49 
51 
52  return persistenceStrategy_->containsContainer(id(), std::to_string(entityInstanceIndex));
53  }
54 
55  std::shared_ptr<EntityInstance>
56  EntitySnapshot::findInstance(const int entityInstanceIndex) const
57  {
58  std::lock_guard l(ltm_mutex);
59 
61 
62  if (!hasInstance(entityInstanceIndex))
63  {
64  return nullptr;
65  }
66 
67  return std::make_shared<EntityInstance>(getExportName(),
68  id().withInstanceIndex(entityInstanceIndex),
69  processors,
70  persistenceStrategy_);
71  }
72 
73  void
75  {
76  std::lock_guard l(ltm_mutex);
77 
79 
80  wmEntitySnapshot.id() = id().getEntitySnapshotID().cleanID();
81 
82  forEachInstance([&wmEntitySnapshot](armem::server::ltm::EntityInstance& ltmEntityInstance) { ltmEntityInstance.loadAllReferences(wmEntitySnapshot); });
83  }
84 
85  void
87  {
88  std::lock_guard l(ltm_mutex);
89 
91 
92  ARMARX_DEBUG << "Resolve entity snapshot id=" << id().cleanID().str();
93 
94  wmEntitySnapshot.forEachInstance(
95  [&](auto& wmEntityInstance)
96  {
97  std::shared_ptr<persistence::MemoryPersistenceStrategy> entityInstancePersistanceStrategy(persistenceStrategy_);
98 
99  EntityInstance ltmEntityInstance(getExportName(),
100  id().withInstanceIndex(wmEntityInstance.id().instanceIndex),
101  processors,
102  entityInstancePersistanceStrategy);
103  // ARMARX_INFO << "Default Origin:=" << wmEntityInstance.metadata().origin;
104  ltmEntityInstance.resolve(wmEntityInstance);
105  // We get the correct origin, but at some point in time it vanishes. My guess would be that
106  // the meta data struct is somewhere copied and does not copy the origin, because it was newly added.
107  // ARMARX_INFO << "After resolve origin=" << wmEntityInstance.metadata().origin;
108  });
109  }
110 
111  void
113  {
114 
115  std::lock_guard l(ltm_mutex);
116 
117  ARMARX_TRACE;
118 
119  if (id().timestamp.isInvalid())
120  {
122  << "During storage of segment '" << wmEntitySnapshot.id().str()
123  << "' I noticed that the corresponding LTM has no id set. "
124  << "I set the id of the LTM to the same name, however this should not happen!";
125  id().timestamp = wmEntitySnapshot.id().timestamp;
126  }
127 
128  ARMARX_DEBUG << "Directly store entity snapshot";
129 
130 
131  /*if (!connected())
132  {
133  ARMARX_WARNING << "LTM ENTITY SNAPSHOT NOT CONNECTED ALTHOUGH ENABLED " << id().str();
134  return;
135  }*/
136 
137  wmEntitySnapshot.forEachInstance(
138  [&](const auto& wmEntityInstance)
139  {
140  std::shared_ptr<persistence::MemoryPersistenceStrategy> entityInstancePersistenceStrategy(persistenceStrategy_);
141 
143  id().withInstanceIndex(wmEntityInstance.id().instanceIndex),
144  processors,
145  entityInstancePersistenceStrategy);
146  c.store(wmEntityInstance);
147 
148  statistics.recordedInstances++;
149  });
150  }
151 } // namespace armarx::armem::server::ltm
armarx::armem::MemoryID::timestamp
Time timestamp
Definition: MemoryID.h:54
armarx::armem::server::ltm::detail::MemoryItem::processors
std::shared_ptr< Processors > processors
Definition: MemoryItem.h:54
armarx::armem::server::ltm::EntitySnapshot::forEachInstance
bool forEachInstance(std::function< void(EntityInstance &)> func) const override
iterate over all Instance segments of this ltm
Definition: EntitySnapshot.cpp:22
MemoryPersistenceStrategy.h
armarx::armem::base::EntitySnapshotBase::forEachInstance
bool forEachInstance(InstanceFunctionT &&func)
Definition: EntitySnapshotBase.h:178
armarx::armem::MemoryID::str
std::string str(bool escapeDelimiters=true) const
Get a string representation of this memory ID.
Definition: MemoryID.cpp:102
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
Dict.h
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
armarx::armem::MemoryID::getEntitySnapshotID
MemoryID getEntitySnapshotID() const
Definition: MemoryID.cpp:318
armarx::armem::server::ltm::EntitySnapshot::EntitySnapshot
EntitySnapshot(const std::string &exportName, const MemoryID &memoryId, const std::shared_ptr< Processors > &filters, const std::shared_ptr< persistence::MemoryPersistenceStrategy > &persistenceStrategy)
Definition: EntitySnapshot.cpp:14
armarx::armem::server::ltm::EntitySnapshot::findInstance
std::shared_ptr< EntityInstance > findInstance(const int entityInstanceIndex) const override
find Instance segment
Definition: EntitySnapshot.cpp:56
timestamp
std::string timestamp()
Definition: CartographerAdapter.cpp:85
armarx::armem::server::ltm::detail::EntitySnapshotBase< EntityInstance >::statistics
Statistics statistics
Definition: EntitySnapshotBase.h:86
armarx::armem::server::ltm::detail::MemoryItem::getExportName
virtual std::string getExportName() const
Definition: MemoryItem.h:27
armarx::armem::wm::EntitySnapshot
Client-side working memory entity snapshot.
Definition: memory_definitions.h:80
armarx::armem::base::detail::MemoryItem::id
MemoryID & id()
Definition: MemoryItem.h:25
armarx::armem::server::ltm::detail::EntitySnapshotBase< EntityInstance >::ltm_mutex
std::recursive_mutex ltm_mutex
Definition: EntitySnapshotBase.h:84
armarx::to_string
const std::string & to_string(const std::string &s)
Definition: StringHelpers.h:41
EntitySnapshot.h
armarx::armem::server::ltm::EntitySnapshot::hasInstance
bool hasInstance(const int entityInstanceIndex) const override
check if Instance segment exists
Definition: EntitySnapshot.cpp:46
armarx::armem::server::ltm::EntitySnapshot::_resolve
void _resolve(armem::wm::EntitySnapshot &wmEntitySnapshot) const override
Definition: EntitySnapshot.cpp:86
armarx::armem::server::ltm
Definition: forward_declarations.h:20
armarx::armem::server::ltm::EntityInstance
Definition: EntityInstance.h:10
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::server::ltm::EntitySnapshot::_store
void _store(const armem::wm::EntitySnapshot &wmEntitySnapshot) override
Definition: EntitySnapshot.cpp:112
armarx::armem::server::ltm::detail::EntityInstanceBase::resolve
void resolve(armem::wm::EntityInstance &e) const
convert the references of the input into a wm::Memory
Definition: EntityInstanceBase.h:37
armarx::armem::server::ltm::EntitySnapshot::_loadAllReferences
void _loadAllReferences(armem::wm::EntitySnapshot &wmEntitySnapshot) const override
Definition: EntitySnapshot.cpp:74
armarx::armem::MemoryID::withInstanceIndex
MemoryID withInstanceIndex(int index) const
Definition: MemoryID.cpp:441
Logging.h
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::armem::server::ltm::detail::EntityInstanceBase::loadAllReferences
void loadAllReferences(armem::wm::EntitySnapshot &e) const
return the full sub-ltm as a wm::EntitySnapshot with only references the ltm may be huge,...
Definition: EntityInstanceBase.h:30