Add 'has subtasks' filter

pull/1194/head
Alex Baker 4 years ago
parent 2b98b12723
commit 431acedda7

@ -6,6 +6,7 @@ class Operator private constructor(private val operator: String) {
companion object {
val eq = Operator("=")
val isNull = Operator("IS NULL")
val isNotNull = Operator("IS NOT NULL")
val and = Operator("AND")
val or = Operator("OR")
val not = Operator("NOT")

@ -25,6 +25,12 @@ open class UnaryCriterion private constructor(private val expression: Field, ope
fun lte(field: Field, value: Any?): Criterion = UnaryCriterion(field, Operator.lte, value)
fun isNotNull(field: Field): Criterion {
return object : UnaryCriterion(field, Operator.isNotNull, null) {
override fun populateOperator() = " $operator"
}
}
fun isNull(field: Field): Criterion {
return object : UnaryCriterion(field, Operator.isNull, null) {
override fun populateOperator() = " $operator"

@ -7,6 +7,7 @@ import com.todoroo.andlib.sql.Field.Companion.field
import com.todoroo.andlib.sql.Join.Companion.inner
import com.todoroo.andlib.sql.Join.Companion.left
import com.todoroo.andlib.sql.Query.Companion.select
import com.todoroo.andlib.sql.UnaryCriterion.Companion.isNotNull
import com.todoroo.astrid.api.*
import com.todoroo.astrid.data.Task
import dagger.hilt.android.qualifiers.ApplicationContext
@ -36,6 +37,7 @@ class FilterCriteriaProvider @Inject constructor(
IDENTIFIER_RECUR -> recurringFilter
IDENTIFIER_COMPLETED -> completedFilter
IDENTIFIER_HIDDEN -> hiddenFilter
IDENTIFIER_PARENT -> parentFilter
IDENTIFIER_SUBTASK -> subtaskFilter
else -> throw RuntimeException("Unknown identifier: $identifier")
}
@ -65,6 +67,7 @@ class FilterCriteriaProvider @Inject constructor(
result.add(recurringFilter)
result.add(completedFilter)
result.add(hiddenFilter)
result.add(parentFilter)
result.add(subtaskFilter)
return result
}
@ -123,6 +126,21 @@ class FilterCriteriaProvider @Inject constructor(
.toString()
)
private val parentFilter: CustomFilterCriterion
get() = BooleanCriterion(
IDENTIFIER_PARENT,
context.getString(R.string.custom_filter_has_subtask),
select(Task.ID)
.from(Task.TABLE)
.join(left(Task.TABLE.`as`("children"), Task.ID.eq(field("children.parent"))))
.join(left(GoogleTask.TABLE, GoogleTask.PARENT.eq(Task.ID)))
.where(or(
isNotNull(field("children._id")),
isNotNull(GoogleTask.ID)
))
.toString()
)
private val subtaskFilter: CustomFilterCriterion
get() = BooleanCriterion(
IDENTIFIER_SUBTASK,
@ -282,6 +300,7 @@ class FilterCriteriaProvider @Inject constructor(
private const val IDENTIFIER_RECUR = "recur"
private const val IDENTIFIER_COMPLETED = "completed"
private const val IDENTIFIER_HIDDEN = "hidden"
private const val IDENTIFIER_PARENT = "parent"
private const val IDENTIFIER_SUBTASK = "subtask"
}
}

@ -656,5 +656,6 @@ File %1$s contained %2$s.\n\n
<string name="multi_select_reschedule">Reschedule</string>
<string name="date_picker_multiple">Multiple</string>
<string name="delete_comment">Delete this comment?</string>
<string name="custom_filter_has_subtask">Has subtasks</string>
<string name="custom_filter_is_subtask">Is subtask</string>
</resources>

Loading…
Cancel
Save