diff --git a/src/serializers/RocksDbSerializer.cpp b/src/serializers/RocksDbSerializer.cpp index 0bf4a83642..a1d00c4e40 100644 --- a/src/serializers/RocksDbSerializer.cpp +++ b/src/serializers/RocksDbSerializer.cpp @@ -20,7 +20,7 @@ RocksDbSerializer::RocksDbSerializer(IfcParse::IfcFile* file, const std::string& void RocksDbSerializer::finalize() { // Build a map of instances and their references/dependencies - std::map> dependencies; + std::map> dependencies, dependencies_inv; std::visit([&dependencies](const auto& m) { if constexpr (std::is_same_v, IfcParse::impl::in_memory_file_storage>) { for (const auto& ps : m.byref_excl_) { @@ -35,6 +35,12 @@ void RocksDbSerializer::finalize() dependencies[p.first]; } + for (auto& ps : dependencies) { + for (auto& p : ps.second) { + dependencies_inv[p].insert(ps.first); + } + } + // Do a topological sort over the nodes std::vector deps_topo_order; while (dependencies.size() > 0) { @@ -57,9 +63,12 @@ void RocksDbSerializer::finalize() for (auto& i : no_deps) { dependencies.erase(i); } - for (auto& p : dependencies) { - for (auto& i : no_deps) { - p.second.erase(i); + for (auto& i : no_deps) { + for (auto& j : dependencies_inv[i]) { + auto it = dependencies.find(j); + if (it != dependencies.end()) { + it->second.erase(i); + } } } }