diff --git a/collect_app/src/main/java/org/odk/collect/android/database/entities/DatabaseEntitiesRepository.kt b/collect_app/src/main/java/org/odk/collect/android/database/entities/DatabaseEntitiesRepository.kt index fc9ac65be2e..b5dc0663cf4 100644 --- a/collect_app/src/main/java/org/odk/collect/android/database/entities/DatabaseEntitiesRepository.kt +++ b/collect_app/src/main/java/org/odk/collect/android/database/entities/DatabaseEntitiesRepository.kt @@ -69,7 +69,7 @@ class DatabaseEntitiesRepository(context: Context, dbPath: String) : EntitiesRep entities.forEach { entity -> val existing = if (listExists) { query( - "\"$list\"", + quote(list), "${EntitiesTable.COLUMN_ID} = ?", arrayOf(entity.id) ).first { mapCursorRowToEntity(it, 0) } @@ -96,7 +96,7 @@ class DatabaseEntitiesRepository(context: Context, dbPath: String) : EntitiesRep } update( - "\"$list\"", + quote(list), contentValues, "${EntitiesTable.COLUMN_ID} = ?", arrayOf(entity.id) @@ -114,7 +114,7 @@ class DatabaseEntitiesRepository(context: Context, dbPath: String) : EntitiesRep } insertOrThrow( - "\"$list\"", + quote(list), null, contentValues ) @@ -180,12 +180,6 @@ class DatabaseEntitiesRepository(context: Context, dbPath: String) : EntitiesRep } } - override fun clear() { - databaseConnection.withConnection { - dropAllTablesFromDB(writableDatabase) - } - } - override fun addList(list: String) { if (!listExists(list)) { createList(list) @@ -197,7 +191,7 @@ class DatabaseEntitiesRepository(context: Context, dbPath: String) : EntitiesRep databaseConnection.withConnection { getLists().forEach { writableDatabase.delete( - it, + quote(it), "${EntitiesTable.COLUMN_ID} = ?", arrayOf(id) ) @@ -240,7 +234,7 @@ class DatabaseEntitiesRepository(context: Context, dbPath: String) : EntitiesRep } val propertyExists = databaseConnection.withConnection { - readableDatabase.doesColumnExist(list, EntitiesTable.getPropertyColumn(property)) + readableDatabase.doesColumnExist(quote(list), EntitiesTable.getPropertyColumn(property)) } return if (propertyExists) { @@ -368,7 +362,7 @@ class DatabaseEntitiesRepository(context: Context, dbPath: String) : EntitiesRep private fun updatePropertyColumns(list: String, entity: Entity) { val columnNames = databaseConnection.withConnection { - readableDatabase.getColumnNames("\"$list\"") + readableDatabase.getColumnNames(quote(list)) } val missingColumns = entity.properties @@ -391,7 +385,7 @@ class DatabaseEntitiesRepository(context: Context, dbPath: String) : EntitiesRep private fun addPropertiesToContentValues(contentValues: ContentValues, entity: Entity) { entity.properties.forEach { (name, value) -> - contentValues.put("\"${EntitiesTable.getPropertyColumn(name)}\"", value) + contentValues.put(quote(EntitiesTable.getPropertyColumn(name)), value) } } @@ -442,6 +436,8 @@ class DatabaseEntitiesRepository(context: Context, dbPath: String) : EntitiesRep } } + private fun quote(text: String) = "\"$text\"" + companion object { private const val DATABASE_VERSION = 2 } diff --git a/collect_app/src/test/java/org/odk/collect/android/entities/EntitiesRepositoryTest.kt b/collect_app/src/test/java/org/odk/collect/android/entities/EntitiesRepositoryTest.kt index 0d0cea60a8c..ebb6ae42b6f 100644 --- a/collect_app/src/test/java/org/odk/collect/android/entities/EntitiesRepositoryTest.kt +++ b/collect_app/src/test/java/org/odk/collect/android/entities/EntitiesRepositoryTest.kt @@ -314,27 +314,6 @@ abstract class EntitiesRepositoryTest { assertThat(repository.getEntities("favourite.wines")[0], sameEntityAs(wine)) } - @Test - fun `#clear deletes all entities`() { - val repository = buildSubject() - - val wine = Entity.New("1", "Léoville Barton 2008") - val whisky = Entity.New("2", "Lagavulin 16") - repository.save("wines", wine) - repository.save("whiskys", whisky) - - repository.clear() - assertThat(repository.getLists().size, equalTo(0)) - assertThat(repository.getEntities("wines").size, equalTo(0)) - assertThat(repository.getEntities("whiskys").size, equalTo(0)) - - repository.addList("wines") - assertThat(repository.getEntities("wines").size, equalTo(0)) - - repository.addList("whiskys") - assertThat(repository.getEntities("whiskys").size, equalTo(0)) - } - @Test fun `#save can save multiple entities`() { val repository = buildSubject() @@ -429,6 +408,27 @@ abstract class EntitiesRepositoryTest { ) } + @Test + fun `#delete supports list names with dots and dashes`() { + val repository = buildSubject() + + val leoville = Entity.New("1", "Léoville Barton 2008") + + repository.save("wines.x", leoville) + repository.save("wines-x", leoville) + + repository.delete("1") + + assertThat( + repository.getEntities("wines.x").isEmpty(), + equalTo(true) + ) + assertThat( + repository.getEntities("wines-x").isEmpty(), + equalTo(true) + ) + } + @Test fun `#delete updates index values so that they are always in sequence and start at 0`() { val repository = buildSubject() @@ -517,7 +517,7 @@ abstract class EntitiesRepositoryTest { } @Test - fun `#getByAllByProperty returns entities with matching property value`() { + fun `#getAllByProperty returns entities with matching property value`() { val repository = buildSubject() val leoville = Entity.New( @@ -542,7 +542,7 @@ abstract class EntitiesRepositoryTest { } @Test - fun `#getByAllByProperty returns entities without property when searching for empty string`() { + fun `#getAllByProperty returns entities without property when searching for empty string`() { val repository = buildSubject() val leoville = Entity.New( @@ -566,7 +566,7 @@ abstract class EntitiesRepositoryTest { } @Test - fun `#getByAllByProperty returns entities when searching for empty string for property that doesn't exist`() { + fun `#getAllByProperty returns entities when searching for empty string for property that doesn't exist`() { val repository = buildSubject() val leoville = Entity.New( @@ -580,7 +580,7 @@ abstract class EntitiesRepositoryTest { } @Test - fun `#getByAllByProperty returns empty list when searching for non empty string for property that doesn't exist`() { + fun `#getAllByProperty returns empty list when searching for non empty string for property that doesn't exist`() { val repository = buildSubject() val leoville = Entity.New( @@ -639,6 +639,32 @@ abstract class EntitiesRepositoryTest { assertThat(repository.getAllByProperty("wines", "vintage", "1983"), equalTo(emptyList())) } + @Test + fun `#getAllByProperty supports list names with dots and dashes`() { + val repository = buildSubject() + + val leoville = Entity.New( + "1", + "Léoville Barton 2008", + properties = listOf("vintage" to "2008") + ) + + repository.save("favourite-wines", leoville) + repository.save("favourite.wines", leoville) + + var wines = repository.getEntities("favourite-wines") + assertThat( + repository.getAllByProperty("favourite-wines", "vintage", "2008"), + containsInAnyOrder(wines.first { it.id == "1" }) + ) + + wines = repository.getEntities("favourite.wines") + assertThat( + repository.getAllByProperty("favourite.wines", "vintage", "2008"), + containsInAnyOrder(wines.first { it.id == "1" }) + ) + } + @Test fun `#getCount returns 0 when a list is empty`() { val repository = buildSubject() diff --git a/entities/src/main/java/org/odk/collect/entities/browser/EntitiesViewModel.kt b/entities/src/main/java/org/odk/collect/entities/browser/EntitiesViewModel.kt index f95b8fd8986..30c0ce17dfd 100644 --- a/entities/src/main/java/org/odk/collect/entities/browser/EntitiesViewModel.kt +++ b/entities/src/main/java/org/odk/collect/entities/browser/EntitiesViewModel.kt @@ -29,11 +29,4 @@ class EntitiesViewModel( return result } - - fun clearAll() { - scheduler.immediate { - entitiesRepository.clear() - _lists.postValue(entitiesRepository.getLists().toList()) - } - } } diff --git a/entities/src/main/java/org/odk/collect/entities/storage/EntitiesRepository.kt b/entities/src/main/java/org/odk/collect/entities/storage/EntitiesRepository.kt index ae98f78ea9b..b3623411cdb 100644 --- a/entities/src/main/java/org/odk/collect/entities/storage/EntitiesRepository.kt +++ b/entities/src/main/java/org/odk/collect/entities/storage/EntitiesRepository.kt @@ -14,7 +14,6 @@ interface EntitiesRepository { ) fun getEntities(list: String): List fun getCount(list: String): Int - fun clear() fun addList(list: String) fun delete(id: String) fun query(list: String, query: Query): List diff --git a/entities/src/main/java/org/odk/collect/entities/storage/InMemEntitiesRepository.kt b/entities/src/main/java/org/odk/collect/entities/storage/InMemEntitiesRepository.kt index 652bd8eafd5..d1e50e68e92 100644 --- a/entities/src/main/java/org/odk/collect/entities/storage/InMemEntitiesRepository.kt +++ b/entities/src/main/java/org/odk/collect/entities/storage/InMemEntitiesRepository.kt @@ -34,11 +34,6 @@ class InMemEntitiesRepository : EntitiesRepository { return getEntities(list).count() } - override fun clear() { - entities.clear() - lists.clear() - } - override fun addList(list: String) { lists.add(list) } diff --git a/entities/src/test/java/org/odk/collect/entities/LocalEntityUseCasesTest.kt b/entities/src/test/java/org/odk/collect/entities/LocalEntityUseCasesTest.kt index 1600613471b..3225f00d885 100644 --- a/entities/src/test/java/org/odk/collect/entities/LocalEntityUseCasesTest.kt +++ b/entities/src/test/java/org/odk/collect/entities/LocalEntityUseCasesTest.kt @@ -527,11 +527,6 @@ private class MeasurableEntitiesRepository(private val wrapped: EntitiesReposito return wrapped.getCount(list) } - override fun clear() { - accesses += 1 - wrapped.clear() - } - override fun addList(list: String) { accesses += 1 wrapped.addList(list)