Skip to content

Commit f4d4b39

Browse files
committed
feat(bulk-model-sync): handle concept changes
1 parent b08d06c commit f4d4b39

File tree

1 file changed

+16
-6
lines changed
  • bulk-model-sync-lib/src/commonMain/kotlin/org/modelix/model/sync/bulk

1 file changed

+16
-6
lines changed

bulk-model-sync-lib/src/commonMain/kotlin/org/modelix/model/sync/bulk/ModelImporter.kt

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,10 @@ class ModelImporter(
159159
currentNodeProgress += 1
160160
progressReporter.step(currentNodeProgress.toULong())
161161
doAndPotentiallyContinueOnErrors {
162-
syncProperties(node, data)
163-
syncChildren(node, data, progressReporter)
164-
syncReferences(node, data)
162+
val conceptCorrectedNode = checkAndHandleConceptChange(node, data)
163+
syncProperties(conceptCorrectedNode, data)
164+
syncChildren(conceptCorrectedNode, data, progressReporter)
165+
syncReferences(conceptCorrectedNode, data)
165166
}
166167
}
167168

@@ -197,7 +198,9 @@ class ModelImporter(
197198
// optimization for when there is no change in the child list
198199
// size check first to avoid querying the original ID
199200
if (expectedNodes.size == existingNodes.size && expectedNodes.map { it.originalId() } == existingNodes.map { it.originalId() }) {
200-
existingNodes.zip(expectedNodes).forEach { syncNode(it.first, it.second, progressReporter) }
201+
existingNodes.zip(expectedNodes).forEach {
202+
syncNode(it.first, it.second, progressReporter)
203+
}
201204
continue
202205
}
203206

@@ -252,8 +255,6 @@ class ModelImporter(
252255
} else {
253256
nodeAtIndex
254257
}
255-
check(childNode.getConceptReference() == expectedConcept) { "Unexpected concept change from $expectedConcept to ${childNode.getConceptReference()}" }
256-
257258
syncNode(childNode, expected, progressReporter)
258259
}
259260

@@ -267,6 +268,15 @@ class ModelImporter(
267268
}
268269
}
269270

271+
private fun checkAndHandleConceptChange(existingNode: INode, expectedNode: NodeData): INode {
272+
val newConcept = expectedNode.concept?.let { ConceptReference(it) }
273+
if (existingNode.getConceptReference() == newConcept) {
274+
return existingNode
275+
}
276+
requireNotNull(newConcept) { "Unexpected null concept" }
277+
return existingNode.replaceNode(newConcept)
278+
}
279+
270280
private fun buildExistingIndex(): MutableMap<String, INodeReference> {
271281
val localOriginalIdToExisting = createMemoryEfficientMap<String, INodeReference>()
272282
root.getDescendants(true).forEach { node ->

0 commit comments

Comments
 (0)