Skip to content

Commit 4de38a0

Browse files
committed
fix(model-datastructure): tree serialization wasn't backwards compatible
It caused a MismatchingObjectKeyAndValueException when an existing model was loaded and then pushed.
1 parent 15af520 commit 4de38a0

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

model-datastructure/src/commonMain/kotlin/org/modelix/model/persistent/CPTree.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ data class CPTree(
6868
usesRoleIds -> INT64_WITH_ROLE_IDS
6969
else -> INT64_WITH_ROLE_NAMES
7070
}
71-
return "$id/$pv/${getTreeReference().getHash()}/${if (usesRoleIds) "i" else "n"}"
71+
return "$id/$pv/${getTreeReference().getHash()}${if (usesRoleIds) "/i" else ""}"
7272
}
7373

7474
override fun getDeserializer(): IObjectDeserializer<CPTree> = DESERIALIZER
@@ -133,7 +133,12 @@ data class CPTree(
133133
val graph = referenceFactory as IObjectGraph
134134
return when (persistenceVersion) {
135135
STRING_IDS -> {
136-
val usesRoleIds = parts.getOrNull(3) != "n"
136+
val usesRoleIds = when (val part = parts.getOrNull(3)) {
137+
null -> false
138+
"n" -> false
139+
"i" -> true
140+
else -> throw IllegalArgumentException("Unknown value `$part` in $input")
141+
}
137142
CPTree(
138143
id = treeId,
139144
int64Hamt = null,

model-datastructure/src/commonTest/kotlin/TreeSerializationTest.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import org.modelix.datastructures.objects.IObjectGraph
12
import org.modelix.model.IKeyValueStore
23
import org.modelix.model.api.IBranch
34
import org.modelix.model.api.IConcept
@@ -11,6 +12,7 @@ import org.modelix.model.lazy.CLVersion
1112
import org.modelix.model.lazy.createObjectStoreCache
1213
import org.modelix.model.operations.LegacyBranchAsMutableModelTree
1314
import org.modelix.model.operations.OTBranch
15+
import org.modelix.model.persistent.CPTree
1416
import org.modelix.model.persistent.MapBaseStore
1517
import kotlin.test.Test
1618
import kotlin.test.assertEquals
@@ -314,6 +316,13 @@ class TreeSerializationTest {
314316
assertStore(mapStore)
315317
}
316318

319+
@Test
320+
fun backwards_compatibility_of_persistence_version_2() {
321+
val serialized = "4f7aa052-43e0-4f5e-b5c8-f197a80507a0/2/V_4I6*Hbk19Lb1sBNIU1k7aA9kGXTI3zBQqYZ9CZje74"
322+
val deserialized = CPTree.deserialize(serialized, IObjectGraph.FREE_FLOATING)
323+
assertEquals(serialized, deserialized.serialize())
324+
}
325+
317326
fun assertStore(store: IKeyValueStore) {
318327
val deserializedVersion = CLVersion.loadFromHash(store["branch_master"]!!, createObjectStoreCache(store))
319328
val deserializedTree = deserializedVersion.tree

0 commit comments

Comments
 (0)