From 6ffb59200ef8a96a62d8eb3b35b2d4e650ae99eb Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 26 Apr 2026 17:46:39 +0200 Subject: [PATCH] Fixing issue #2339 Solution is to do proper cell mapping, including the parent references from source to target RDB. --- src/rdb/rdb/rdb.cc | 17 ++++++++++++++++- src/rdb/unit_tests/rdbTests.cc | 20 +++++++++++--------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/rdb/rdb/rdb.cc b/src/rdb/rdb/rdb.cc index 475f310e4..367b25f5d 100644 --- a/src/rdb/rdb/rdb.cc +++ b/src/rdb/rdb/rdb.cc @@ -1920,13 +1920,15 @@ static void map_databases (rdb::Database &self, const rdb::Database &other, std::map &rev_tag2tag, bool create_missing) { + std::list > new_cells; + for (auto c = other.cells ().begin (); c != other.cells ().end (); ++c) { // TODO: do we have a consistent scheme of naming variants? What requirements // exist towards detecting variant specific waivers rdb::Cell *this_cell = self.cell_by_qname_non_const (c->qname ()); if (! this_cell && create_missing) { this_cell = self.create_cell (c->name (), c->variant (), c->layout_name ()); - this_cell->import_references (c->references ()); + new_cells.push_back (std::make_pair (this_cell, c.operator-> ())); } if (this_cell) { cell2cell.insert (std::make_pair (this_cell->id (), c->id ())); @@ -1934,6 +1936,19 @@ static void map_databases (rdb::Database &self, const rdb::Database &other, } } + // import and map references for new cells + for (auto cp = new_cells.begin (); cp != new_cells.end (); ++cp) { + auto &new_refs = cp->first->references (); + for (auto r = cp->second->references ().begin (); r != cp->second->references ().end (); ++r) { + rdb::Reference rnew = *r; + auto cid = rev_cell2cell.find (rnew.parent_cell_id ()); + if (cid != rev_cell2cell.end ()) { + rnew.set_parent_cell_id (cid->second); + new_refs.insert (rnew); + } + } + } + for (auto c = other.categories ().begin (); c != other.categories ().end (); ++c) { map_category (*c, self, cat2cat, rev_cat2cat, create_missing, 0); } diff --git a/src/rdb/unit_tests/rdbTests.cc b/src/rdb/unit_tests/rdbTests.cc index 4ccc25a08..814e73573 100644 --- a/src/rdb/unit_tests/rdbTests.cc +++ b/src/rdb/unit_tests/rdbTests.cc @@ -979,16 +979,18 @@ TEST(22_MergeCells) } { + rdb::Cell *cell1, *cell2, *cell3; + cell1 = db2.create_cell ("B"); + cell2 = db2.create_cell ("A"); + cell3 = db2.create_cell ("A", "VAR2", "ALAY"); + + // NOTE: db2 parent is at a different position (issue #2339) rdb::Cell *parent; parent = db2.create_cell ("TOP"); - rdb::Cell *cell; - cell = db2.create_cell ("B"); - cell->references ().insert (rdb::Reference (db::DCplxTrans (db::DVector (1.0, 0.0)), parent->id ())); - cell = db2.create_cell ("A"); - cell->references ().insert (rdb::Reference (db::DCplxTrans (db::DVector (1.0, 2.5)), parent->id ())); // reference not taken! - cell = db2.create_cell ("A", "VAR2", "ALAY"); - cell->references ().insert (rdb::Reference (db::DCplxTrans (db::DVector (1.0, -1.0)), parent->id ())); + cell1->references ().insert (rdb::Reference (db::DCplxTrans (db::DVector (1.0, 0.0)), parent->id ())); + cell2->references ().insert (rdb::Reference (db::DCplxTrans (db::DVector (1.0, 2.5)), parent->id ())); // reference not taken as cell will be taken from db1 + cell3->references ().insert (rdb::Reference (db::DCplxTrans (db::DVector (1.0, -1.0)), parent->id ())); } db1.merge (db2); @@ -996,13 +998,13 @@ TEST(22_MergeCells) std::set cells; for (auto c = db1.cells ().begin (); c != db1.cells ().end (); ++c) { if (c->references ().begin () != c->references ().end ()) { - cells.insert (c->qname () + "[" + c->references ().begin ()->trans_str () + "]"); + cells.insert (c->qname () + "[" + c->references ().begin ()->trans_str () + ":" + db1.cell_by_id (c->references ().begin ()->parent_cell_id ())->qname () + "]"); } else { cells.insert (c->qname ()); } } - EXPECT_EQ (tl::join (cells.begin (), cells.end (), ";"), "A:1[r0 *1 1,2];A:VAR1[r0 *1 1,-2];A:VAR2[r0 *1 1,-1];B[r0 *1 1,0];TOP"); + EXPECT_EQ (tl::join (cells.begin (), cells.end (), ";"), "A:1[r0 *1 1,2:TOP];A:VAR1[r0 *1 1,-2:TOP];A:VAR2[r0 *1 1,-1:TOP];B[r0 *1 1,0:TOP];TOP"); } TEST(23_MergeTags)