improve search performance, use search text in query itself

This commit is contained in:
tibbi 2023-01-13 23:42:43 +01:00
parent e40fbb9c77
commit 0d7f08786d
4 changed files with 42 additions and 10 deletions

View File

@ -70,7 +70,7 @@ android {
}
dependencies {
implementation 'com.github.SimpleMobileTools:Simple-Commons:449b24c6a4'
implementation 'com.github.SimpleMobileTools:Simple-Commons:edb874aa8f'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'

View File

@ -1212,7 +1212,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
maxFetchedSearchTS = DateTime().plusYears(1).seconds()
}
eventsHelper.getEvents(minFetchedSearchTS, maxFetchedSearchTS) { events ->
eventsHelper.getEvents(minFetchedSearchTS, maxFetchedSearchTS, searchQuery = text) { events ->
if (text == mLatestSearchQuery) {
showSearchResultEvents(events, INITIAL_EVENTS)
}

View File

@ -248,13 +248,27 @@ class EventsHelper(val context: Context) {
}
}
fun getEvents(fromTS: Long, toTS: Long, eventId: Long = -1L, applyTypeFilter: Boolean = true, callback: (events: ArrayList<Event>) -> Unit) {
fun getEvents(
fromTS: Long,
toTS: Long,
eventId: Long = -1L,
applyTypeFilter: Boolean = true,
searchQuery: String = "",
callback: (events: ArrayList<Event>) -> Unit
) {
ensureBackgroundThread {
getEventsSync(fromTS, toTS, eventId, applyTypeFilter, callback)
getEventsSync(fromTS, toTS, eventId, applyTypeFilter, searchQuery, callback)
}
}
fun getEventsSync(fromTS: Long, toTS: Long, eventId: Long = -1L, applyTypeFilter: Boolean, callback: (events: ArrayList<Event>) -> Unit) {
fun getEventsSync(
fromTS: Long,
toTS: Long,
eventId: Long = -1L,
applyTypeFilter: Boolean,
searchQuery: String = "",
callback: (events: ArrayList<Event>) -> Unit
) {
val birthDayEventId = getLocalBirthdaysEventTypeId(createIfNotExists = false)
val anniversaryEventId = getAnniversariesEventTypeId(createIfNotExists = false)
@ -268,7 +282,13 @@ class EventsHelper(val context: Context) {
try {
val typesList = context.config.getDisplayEventTypessAsList()
events.addAll(eventsDB.getOneTimeEventsFromToWithTypes(toTS, fromTS, typesList).toMutableList() as ArrayList<Event>)
if (searchQuery.isEmpty()) {
events.addAll(eventsDB.getOneTimeEventsFromToWithTypes(toTS, fromTS, typesList).toMutableList() as ArrayList<Event>)
} else {
events.addAll(
eventsDB.getOneTimeEventsFromToWithTypesForSearch(toTS, fromTS, typesList, "%$searchQuery%").toMutableList() as ArrayList<Event>
)
}
} catch (e: Exception) {
}
}
@ -284,7 +304,7 @@ class EventsHelper(val context: Context) {
)
}
events.addAll(getRepeatableEventsFor(fromTS, toTS, eventId, applyTypeFilter))
events.addAll(getRepeatableEventsFor(fromTS, toTS, eventId, applyTypeFilter, searchQuery))
events = events
.asSequence()
@ -298,7 +318,10 @@ class EventsHelper(val context: Context) {
}
events.forEach {
if (it.isTask()) updateIsTaskCompleted(it)
if (it.isTask()) {
updateIsTaskCompleted(it)
}
it.updateIsPastEvent()
val originalEvent = eventsDB.getEventWithId(it.id!!)
if (originalEvent != null &&
@ -354,13 +377,16 @@ class EventsHelper(val context: Context) {
return eventTypeId
}
fun getRepeatableEventsFor(fromTS: Long, toTS: Long, eventId: Long = -1L, applyTypeFilter: Boolean = false): List<Event> {
fun getRepeatableEventsFor(fromTS: Long, toTS: Long, eventId: Long = -1L, applyTypeFilter: Boolean = false, searchQuery: String = ""): List<Event> {
val events = if (applyTypeFilter) {
val displayEventTypes = context.config.displayEventTypes
if (displayEventTypes.isEmpty()) {
return ArrayList()
} else {
} else if (searchQuery.isEmpty()) {
eventsDB.getRepeatableEventsOrTasksWithTypes(toTS, context.config.getDisplayEventTypessAsList()).toMutableList() as ArrayList<Event>
} else {
eventsDB.getRepeatableEventsOrTasksWithTypesForSearch(toTS, context.config.getDisplayEventTypessAsList(), "%$searchQuery%")
.toMutableList() as ArrayList<Event>
}
} else {
if (eventId == -1L) {

View File

@ -39,6 +39,9 @@ interface EventsDao {
@Query("SELECT * FROM events WHERE start_ts <= :toTS AND end_ts >= :fromTS AND start_ts != 0 AND repeat_interval = 0 AND event_type IN (:eventTypeIds)")
fun getOneTimeEventsFromToWithTypes(toTS: Long, fromTS: Long, eventTypeIds: List<Long>): List<Event>
@Query("SELECT * FROM events WHERE start_ts <= :toTS AND end_ts >= :fromTS AND start_ts != 0 AND repeat_interval = 0 AND event_type IN (:eventTypeIds) AND (title LIKE :searchQuery OR location LIKE :searchQuery OR description LIKE :searchQuery)")
fun getOneTimeEventsFromToWithTypesForSearch(toTS: Long, fromTS: Long, eventTypeIds: List<Long>, searchQuery: String): List<Event>
@Query("SELECT * FROM events WHERE end_ts > :toTS AND repeat_interval = 0 AND event_type IN (:eventTypeIds) AND type = $TYPE_EVENT")
fun getOneTimeFutureEventsWithTypes(toTS: Long, eventTypeIds: List<Long>): List<Event>
@ -51,6 +54,9 @@ interface EventsDao {
@Query("SELECT * FROM events WHERE start_ts <= :toTS AND start_ts != 0 AND repeat_interval != 0 AND event_type IN (:eventTypeIds)")
fun getRepeatableEventsOrTasksWithTypes(toTS: Long, eventTypeIds: List<Long>): List<Event>
@Query("SELECT * FROM events WHERE start_ts <= :toTS AND start_ts != 0 AND repeat_interval != 0 AND event_type IN (:eventTypeIds) AND (title LIKE :searchQuery OR location LIKE :searchQuery OR description LIKE :searchQuery)")
fun getRepeatableEventsOrTasksWithTypesForSearch(toTS: Long, eventTypeIds: List<Long>, searchQuery: String): List<Event>
@Query("SELECT * FROM events WHERE repeat_interval != 0 AND (repeat_limit == 0 OR repeat_limit > :currTS) AND event_type IN (:eventTypeIds) AND type = $TYPE_EVENT")
fun getRepeatableFutureEventsWithTypes(currTS: Long, eventTypeIds: List<Long>): List<Event>