diff --git a/app/src/main/java/com/orgzly/android/data/DataRepository.kt b/app/src/main/java/com/orgzly/android/data/DataRepository.kt index 6c879e64e..9331c96c6 100644 --- a/app/src/main/java/com/orgzly/android/data/DataRepository.kt +++ b/app/src/main/java/com/orgzly/android/data/DataRepository.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.content.res.Resources +import android.database.DatabaseUtils import android.media.MediaScannerConnection import android.net.Uri import android.os.Handler @@ -1127,7 +1128,11 @@ class DataRepository @Inject constructor( } private fun buildSqlQuery(query: Query): SupportSQLiteQuery { - val queryBuilder = SqliteQueryBuilder(context) + val defaultPriority = AppPreferences.defaultPriority(context); + val todoKeywordsSet = AppPreferences.todoKeywordsSet(context) + val doneKeywordsSet = AppPreferences.doneKeywordsSet(context) + val sqlEscape = DatabaseUtils::sqlEscapeString; + val queryBuilder = SqliteQueryBuilder(defaultPriority, todoKeywordsSet, doneKeywordsSet, sqlEscape) val (selection, selectionArgs, having, orderBy) = queryBuilder.build(query) diff --git a/app/src/main/java/com/orgzly/android/query/sql/SqliteQueryBuilder.kt b/app/src/main/java/com/orgzly/android/query/sql/SqliteQueryBuilder.kt index 0dc04919d..2209749b4 100644 --- a/app/src/main/java/com/orgzly/android/query/sql/SqliteQueryBuilder.kt +++ b/app/src/main/java/com/orgzly/android/query/sql/SqliteQueryBuilder.kt @@ -1,14 +1,14 @@ package com.orgzly.android.query.sql -import android.content.Context -import android.database.DatabaseUtils -import com.orgzly.android.prefs.AppPreferences import com.orgzly.android.query.* import com.orgzly.org.datetime.OrgInterval import java.util.* -class SqliteQueryBuilder(val context: Context) { +class SqliteQueryBuilder(private val defaultPriority: String, + private val todoKeywordsSet: Set, + private val doneKeywordsSet: Set, + private val sqlEscape: (str: String) -> String) { private var where: String = "" private val arguments: MutableList = ArrayList() @@ -39,7 +39,7 @@ class SqliteQueryBuilder(val context: Context) { o.add("book_name") /* Priority or default priority. */ - o.add("COALESCE(priority, '" + AppPreferences.defaultPriority(context) + "')") + o.add("COALESCE(priority, '" + defaultPriority + "')") o.add("priority IS NULL") if (hasScheduledCondition) { @@ -141,19 +141,18 @@ class SqliteQueryBuilder(val context: Context) { } is SortOrder.Priority -> { - o.add("COALESCE(priority, '" + AppPreferences.defaultPriority(context) + "')" + if (order.desc) " DESC" else "") + o.add("COALESCE(priority, '" + defaultPriority + "')" + if (order.desc) " DESC" else "") o.add("priority" + if (order.desc) " IS NOT NULL" else " IS NULL") } is SortOrder.State -> { - val states = AppPreferences.todoKeywordsSet(context) - .union(AppPreferences.doneKeywordsSet(context)) + val states = todoKeywordsSet.union(doneKeywordsSet) if (states.isNotEmpty()) { val statesInOrder = if (order.desc) states.reversed() else states o.add(statesInOrder.foldIndexed("CASE state") { i, str, state -> - "$str WHEN ${DatabaseUtils.sqlEscapeString(state)} THEN $i" + "$str WHEN ${sqlEscape(state)} THEN $i" } + " ELSE ${states.size} END") } } @@ -194,12 +193,12 @@ class SqliteQueryBuilder(val context: Context) { is Condition.HasStateType -> { when (expr.type) { StateType.TODO -> { - val states = AppPreferences.todoKeywordsSet(context) + val states = todoKeywordsSet arguments.addAll(states) not(expr.not, "COALESCE(state, '') IN (" + Collections.nCopies(states.size, "?").joinToString() + ")") } StateType.DONE -> { - val states = AppPreferences.doneKeywordsSet(context) + val states = doneKeywordsSet arguments.addAll(states) not(expr.not, "COALESCE(state, '') IN (" + Collections.nCopies(states.size, "?").joinToString() + ")") @@ -209,7 +208,7 @@ class SqliteQueryBuilder(val context: Context) { } is Condition.HasPriority -> { - arguments.add(AppPreferences.defaultPriority(context)) + arguments.add(defaultPriority) arguments.add(expr.priority) not(expr.not, "LOWER(COALESCE(NULLIF(priority, ''), ?)) = ?") } diff --git a/app/src/androidTest/java/com/orgzly/android/query/QueryTest.kt b/app/src/test/java/com/orgzly/android/query/QueryTest.kt similarity index 97% rename from app/src/androidTest/java/com/orgzly/android/query/QueryTest.kt rename to app/src/test/java/com/orgzly/android/query/QueryTest.kt index b056cd3e4..d9b511e7a 100644 --- a/app/src/androidTest/java/com/orgzly/android/query/QueryTest.kt +++ b/app/src/test/java/com/orgzly/android/query/QueryTest.kt @@ -1,11 +1,10 @@ package com.orgzly.android.query -import androidx.test.espresso.matcher.ViewMatchers.assertThat -import com.orgzly.android.OrgzlyTest import com.orgzly.android.query.sql.SqliteQueryBuilder import com.orgzly.android.query.user.DottedQueryBuilder import com.orgzly.android.query.user.DottedQueryParser -import org.hamcrest.Matchers.`is` +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.core.Is.`is` import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -13,7 +12,7 @@ import org.junit.runners.Parameterized import java.util.* @RunWith(value = Parameterized::class) -class QueryTest(private val param: Parameter) : OrgzlyTest() { +class QueryTest(private val param: Parameter) { private lateinit var actualParsedQuery: String private lateinit var actualQueryString: String @@ -305,8 +304,7 @@ class QueryTest(private val param: Parameter) : OrgzlyTest() { } @Before - override fun setUp() { - super.setUp() + fun setUp() { // Parse query val parser = DottedQueryParser() @@ -314,7 +312,11 @@ class QueryTest(private val param: Parameter) : OrgzlyTest() { actualParsedQuery = query.toString() // Build SQL - val sqlBuilder = SqliteQueryBuilder(context) + val defaultPriority = "B" + val todoKeywordsSet = setOf("TODO", "NEXT") + val doneKeywordsSet = setOf("DONE") + val sqlEscape = fun (str: String) : String {return "'$str'" } + val sqlBuilder = SqliteQueryBuilder(defaultPriority, todoKeywordsSet, doneKeywordsSet, sqlEscape) val sqlQuery = sqlBuilder.build(query) // Build query