Skip to content

Commit b2d2588

Browse files
committed
Generate sqlite selections and selection args instead of adding new helper methods
1 parent 9bd7962 commit b2d2588

File tree

6 files changed

+70
-20
lines changed

6 files changed

+70
-20
lines changed

collect_app/src/main/java/org/odk/collect/android/database/entities/DatabaseEntitiesRepository.kt

+20
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,26 @@ class DatabaseEntitiesRepository(context: Context, dbPath: String) : EntitiesRep
208208
updateRowIdTables()
209209
}
210210

211+
override fun query(list: String, selection: String, selectionArgs: Array<String>): List<Entity.Saved> {
212+
return databaseConnection.withConnection {
213+
readableDatabase
214+
.rawQuery(
215+
"""
216+
SELECT *, i.$ROW_ID
217+
FROM "$list" e, "${getRowIdTableName(list)}" i
218+
WHERE $selection
219+
ORDER BY i.$ROW_ID
220+
""".trimIndent(),
221+
selectionArgs
222+
)
223+
}.foldAndClose {
224+
mapCursorRowToEntity(
225+
it,
226+
it.getInt(ROW_ID)
227+
)
228+
}
229+
}
230+
211231
override fun getById(list: String, id: String): Entity.Saved? {
212232
if (!listExists(list)) {
213233
return null

entities/src/main/java/org/odk/collect/entities/javarosa/filter/LocalEntitiesFilterStrategy.kt

+10-20
Original file line numberDiff line numberDiff line change
@@ -40,30 +40,20 @@ class LocalEntitiesFilterStrategy(entitiesRepository: EntitiesRepository) :
4040
return when (val original = candidate?.original) {
4141
is XPathEqExpr -> {
4242
val child = candidate.nodeSide.steps[0].name.name
43-
val value = candidate.evalContextSide(sourceInstance, evaluationContext)
43+
val value = candidate.evalContextSide(sourceInstance, evaluationContext) as String
4444

45-
val results = if (original.isEqual) {
46-
instanceAdapter.queryEq(
47-
sourceInstance.instanceId,
48-
child,
49-
value as String
50-
)
45+
val selection = if (original.isEqual) {
46+
"$child = ?"
5147
} else {
52-
instanceAdapter.queryNotEq(
53-
sourceInstance.instanceId,
54-
child,
55-
value as String
56-
)
48+
"$child != ?"
5749
}
50+
val selectionArgs = arrayOf(value)
5851

59-
if (results == null) {
60-
next.get()
61-
} else {
62-
sourceInstance.replacePartialElements(results)
63-
results.map {
64-
it.parent = sourceInstance.root
65-
it.ref
66-
}
52+
val results = instanceAdapter.query(sourceInstance.instanceId, selection, selectionArgs)
53+
sourceInstance.replacePartialElements(results)
54+
results.map {
55+
it.parent = sourceInstance.root
56+
it.ref
6757
}
6858
}
6959

entities/src/main/java/org/odk/collect/entities/javarosa/intance/LocalEntitiesInstanceAdapter.kt

+6
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ class LocalEntitiesInstanceAdapter(private val entitiesRepository: EntitiesRepos
3838
}
3939
}
4040

41+
fun query(list: String, selection: String, selectionArgs: Array<String>): List<TreeElement> {
42+
return entitiesRepository
43+
.query(list, selection, selectionArgs)
44+
.map { convertToElement(it) }
45+
}
46+
4147
fun queryEq(instanceId: String, child: String, value: String): List<TreeElement> {
4248
return when (child) {
4349
EntityItemElement.ID -> {

entities/src/main/java/org/odk/collect/entities/storage/EntitiesRepository.kt

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ interface EntitiesRepository {
88
fun clear()
99
fun addList(list: String)
1010
fun delete(id: String)
11+
fun query(list: String, selection: String, selectionArgs: Array<String>): List<Entity.Saved>
1112
fun getById(list: String, id: String): Entity.Saved?
1213
fun getByIdNot(list: String, id: String): List<Entity.Saved>
1314
fun getByLabel(list: String, label: String?): List<Entity.Saved>

entities/src/main/java/org/odk/collect/entities/storage/InMemEntitiesRepository.kt

+24
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,30 @@ class InMemEntitiesRepository : EntitiesRepository {
4646
}
4747
}
4848

49+
override fun query(
50+
list: String,
51+
selection: String,
52+
selectionArgs: Array<String>
53+
): List<Entity.Saved> {
54+
return getEntities(list).filter { entity ->
55+
val (fieldName, operator, _) = selection.split(" ").map { it }
56+
val value = selectionArgs.first()
57+
58+
val fieldValue = when (fieldName) {
59+
"name" -> entity.id
60+
"label" -> entity.label
61+
"__version" -> entity.version
62+
else -> entity.properties.find { it.first == fieldName }?.second
63+
}.toString()
64+
65+
when (operator) {
66+
"=" -> fieldValue == value
67+
"!=" -> fieldValue != value
68+
else -> false
69+
}
70+
}
71+
}
72+
4973
override fun getById(list: String, id: String): Entity.Saved? {
5074
return getEntities(list).firstOrNull { it.id == id }
5175
}

entities/src/test/java/org/odk/collect/entities/LocalEntityUseCasesTest.kt

+9
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,15 @@ private class MeasurableEntitiesRepository(private val wrapped: EntitiesReposito
541541
wrapped.delete(id)
542542
}
543543

544+
override fun query(
545+
list: String,
546+
selection: String,
547+
selectionArgs: Array<String>
548+
): List<Entity.Saved> {
549+
accesses += 1
550+
return wrapped.query(list, selection, selectionArgs)
551+
}
552+
544553
override fun getById(list: String, id: String): Entity.Saved? {
545554
accesses += 1
546555
return wrapped.getById(list, id)

0 commit comments

Comments
 (0)