Skip to content

Commit 8df10e9

Browse files
committed
fix(model-sync-lib): fixed sync of child node order within roles
1 parent d52d6a4 commit 8df10e9

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class ModelImporter(private val root: INode) {
123123

124124
private fun syncAllChildOrders(root: INode, rootData: NodeData) {
125125
syncChildOrder(root, rootData)
126-
for ((node, data) in root.allChildren.zip(rootData.children)) {
126+
for ((node, data) in root.allChildren zip rootData.children) {
127127
syncAllChildOrders(node, data)
128128
}
129129
}
@@ -133,15 +133,22 @@ class ModelImporter(private val root: INode) {
133133
val specifiedChildren = nodeData.children
134134
require(existingChildren.size == specifiedChildren.size)
135135

136-
for ((actualNode, specifiedNode) in existingChildren zip specifiedChildren) {
137-
val actualId = actualNode.originalId()
138-
if (actualId != specifiedNode.originalId() ) {
139-
val targetIndex = specifiedChildren.indexOfFirst { actualId == it.originalId() }
140-
node.moveChild(actualNode.roleInParent, targetIndex, actualNode)
141-
}
136+
val targetIndices = HashMap<String?, Int>(nodeData.children.size)
137+
for (specifiedChild in specifiedChildren) {
138+
val index = specifiedChild.getIndexWithinRole(nodeData)
139+
targetIndices[specifiedChild.originalId()] = index
140+
}
141+
142+
for (child in existingChildren) {
143+
val targetIndex = targetIndices[child.originalId()] ?: -1
144+
node.moveChild(child.roleInParent, targetIndex, child)
142145
}
143146
}
144147

148+
private fun NodeData.getIndexWithinRole(parent: NodeData) : Int {
149+
return parent.children.filter { it.role == this.role }.indexOf(this)
150+
}
151+
145152
private fun INode.originalId(): String? {
146153
return this.getPropertyValue(NodeData.idPropertyKey)
147154
}

0 commit comments

Comments
 (0)