package com.todoroo.astrid.api import android.os.Parcel import android.os.Parcelable import com.todoroo.andlib.sql.Criterion import com.todoroo.andlib.sql.Join import com.todoroo.andlib.sql.Query import com.todoroo.andlib.sql.QueryTemplate import com.todoroo.astrid.data.Task import org.tasks.data.CaldavCalendar import org.tasks.data.CaldavTask import org.tasks.data.Geofence import org.tasks.data.Place import org.tasks.data.Tag import org.tasks.data.UserActivity class SearchFilter : Filter { private constructor() constructor(title: String?, query: String) : super(title, getQueryTemplate(query)) override fun supportsHiddenTasks() = false companion object { /** Parcelable Creator Object */ @JvmField val CREATOR: Parcelable.Creator = object : Parcelable.Creator { /** {@inheritDoc} */ override fun createFromParcel(source: Parcel): SearchFilter { val item = SearchFilter() item.readFromParcel(source) return item } /** {@inheritDoc} */ override fun newArray(size: Int): Array { return arrayOfNulls(size) } } private fun getQueryTemplate(query: String): QueryTemplate { val matcher = "%$query%" return QueryTemplate() .where( Criterion.and( Task.DELETION_DATE.eq(0), Criterion.or( Task.NOTES.like(matcher), Task.TITLE.like(matcher), Task.ID.`in`( Query.select(Tag.TASK) .from(Tag.TABLE) .where(Tag.NAME.like(matcher))), Task.UUID.`in`( Query.select(UserActivity.TASK) .from(UserActivity.TABLE) .where(UserActivity.MESSAGE.like(matcher))), Task.ID.`in`( Query.select(Geofence.TASK) .from(Geofence.TABLE) .join(Join.inner(Place.TABLE, Place.UID.eq(Geofence.PLACE))) .where(Criterion.or(Place.NAME.like(matcher), Place.ADDRESS.like(matcher)))), Task.ID.`in`( Query.select(CaldavTask.TASK) .from(CaldavTask.TABLE) .join(Join.inner(CaldavCalendar.TABLE, CaldavCalendar.UUID.eq(CaldavTask.CALENDAR))) .where(CaldavCalendar.NAME.like(matcher))), ))) } } }