From 6a7d6fb690b75f1478243499f41aff3be47c84a8 Mon Sep 17 00:00:00 2001 From: Callum Stott Date: Tue, 9 Jul 2024 12:46:37 +0100 Subject: [PATCH 1/2] Spike out partial parsing entities --- .../LocalEntitiesFileInstanceParser.kt | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/entities/src/main/java/org/odk/collect/entities/javarosa/intance/LocalEntitiesFileInstanceParser.kt b/entities/src/main/java/org/odk/collect/entities/javarosa/intance/LocalEntitiesFileInstanceParser.kt index 1ec005eb456..f355e7d7788 100644 --- a/entities/src/main/java/org/odk/collect/entities/javarosa/intance/LocalEntitiesFileInstanceParser.kt +++ b/entities/src/main/java/org/odk/collect/entities/javarosa/intance/LocalEntitiesFileInstanceParser.kt @@ -10,26 +10,37 @@ internal class LocalEntitiesFileInstanceParser(private val entitiesRepositoryPro ExternalInstanceParser.FileInstanceParser { override fun parse(instanceId: String, path: String): TreeElement { + return parse(instanceId, path, false) + } + + override fun parse(instanceId: String, path: String, partial: Boolean): TreeElement { val root = TreeElement("root", 0) val entitiesRepository = entitiesRepositoryProvider() entitiesRepository.getEntities(instanceId).forEachIndexed { index, entity -> val name = TreeElement(EntityItemElement.ID) - name.value = StringData(entity.id) - val label = TreeElement(EntityItemElement.LABEL) - label.value = StringData(entity.label) - val version = TreeElement(EntityItemElement.VERSION) - version.value = StringData(entity.version.toString()) - val item = TreeElement("item", index) + if (!partial) { + name.value = StringData(entity.id) + label.value = StringData(entity.label) + version.value = StringData(entity.version.toString()) + } + + val item = TreeElement("item", index, partial) item.addChild(name) item.addChild(label) item.addChild(version) entity.properties.forEach { property -> - addChild(item, property) + val propertyElement = TreeElement(property.first) + + if (!partial) { + propertyElement.value = StringData(property.second) + } + + item.addChild(propertyElement) } root.addChild(item) @@ -42,15 +53,4 @@ internal class LocalEntitiesFileInstanceParser(private val entitiesRepositoryPro val entitiesRepository = entitiesRepositoryProvider() return entitiesRepository.getLists().contains(instanceId) } - - private fun addChild( - element: TreeElement, - nameAndValue: Pair - ) { - element.addChild( - TreeElement(nameAndValue.first).also { - it.value = StringData(nameAndValue.second) - } - ) - } } From 337d7382d99bc2033694aa8d7baa74e2218852f1 Mon Sep 17 00:00:00 2001 From: Callum Stott Date: Tue, 9 Jul 2024 18:23:43 +0100 Subject: [PATCH 2/2] Add test for partial parsing --- .../LocalEntitiesFileInstanceParserTest.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/entities/src/test/java/org/odk/collect/entities/javarosa/LocalEntitiesFileInstanceParserTest.kt b/entities/src/test/java/org/odk/collect/entities/javarosa/LocalEntitiesFileInstanceParserTest.kt index 9d1184032eb..c84b1cb0e10 100644 --- a/entities/src/test/java/org/odk/collect/entities/javarosa/LocalEntitiesFileInstanceParserTest.kt +++ b/entities/src/test/java/org/odk/collect/entities/javarosa/LocalEntitiesFileInstanceParserTest.kt @@ -52,4 +52,28 @@ class LocalEntitiesFileInstanceParserTest { assertThat(item.numChildren, equalTo(3)) assertThat(item.getFirstChild(EntityItemElement.VERSION)?.value?.value, equalTo("1")) } + + @Test + fun `partial parse returns elements without values`() { + val entity = + Entity( + "people", + "1", + "Shiv Roy", + properties = listOf(Pair("age", "35")), + version = 1 + ) + entitiesRepository.save(entity) + + val parser = LocalEntitiesFileInstanceParser { entitiesRepository } + val instance = parser.parse("people", "people.csv", true) + assertThat(instance.numChildren, equalTo(1)) + + val item = instance.getChildAt(0)!! + assertThat(item.isPartial, equalTo(true)) + assertThat(item.numChildren, equalTo(4)) + 0.until(item.numChildren).forEach { + assertThat(item.getChildAt(it).value?.value, equalTo(null)) + } + } }