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) - } - ) - } } 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)) + } + } }