[Refactor] Refactor EventDao class.

This commit is contained in:
Kuba Szczodrzyński 2020-03-28 11:17:39 +01:00
parent ef4527f140
commit d4d548846f
3 changed files with 93 additions and 93 deletions

View File

@ -58,7 +58,7 @@ class Notifications(val app: App, val notifications: MutableList<Notification>,
}
private fun eventNotifications() {
for (event in app.db.eventDao().notNotifiedNow.filter { it.date >= today }) {
for (event in app.db.eventDao().getNotNotifiedNow().filter { it.date >= today }) {
val text = if (event.type == Event.TYPE_HOMEWORK)
app.getString(
if (event.subjectLongName.isNullOrEmpty())
@ -93,7 +93,7 @@ class Notifications(val app: App, val notifications: MutableList<Notification>,
}
fun sharedEventNotifications() {
for (event in app.db.eventDao().notNotifiedNow.filter { it.date >= today && it.sharedBy != null }) {
for (event in app.db.eventDao().getNotNotifiedNow().filter { it.date >= today && it.sharedBy != null }) {
val text = app.getString(
R.string.notification_shared_event_format,
event.sharedByName,

View File

@ -0,0 +1,34 @@
/*
* Copyright (c) Kuba Szczodrzyński 2020-3-28.
*/
package pl.szczodrzynski.edziennik.data.db.dao
import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.RawQuery
import androidx.sqlite.db.SimpleSQLiteQuery
import androidx.sqlite.db.SupportSQLiteQuery
@Dao
interface BaseDao<T, F> {
@RawQuery
fun getRaw(query: SupportSQLiteQuery): LiveData<List<F>>
fun getRaw(query: String) = getRaw(SimpleSQLiteQuery(query))
@RawQuery
fun getRawNow(query: SupportSQLiteQuery): List<F>
fun getRawNow(query: String) = getRawNow(SimpleSQLiteQuery(query))
@RawQuery
fun getOneNow(query: SupportSQLiteQuery): F?
fun getOneNow(query: String) = getOneNow(SimpleSQLiteQuery(query))
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun add(item: T): Long
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun addAll(items: List<T>): LongArray
fun clear(profileId: Int)
}

View File

@ -4,7 +4,10 @@
package pl.szczodrzynski.edziennik.data.db.dao
import androidx.lifecycle.LiveData
import androidx.room.*
import androidx.room.Dao
import androidx.room.Query
import androidx.room.RawQuery
import androidx.room.Transaction
import androidx.sqlite.db.SimpleSQLiteQuery
import androidx.sqlite.db.SupportSQLiteQuery
import pl.szczodrzynski.edziennik.data.db.entity.Event
@ -14,15 +17,37 @@ import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
@Dao
abstract class EventDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun add(event: Event): Long
abstract class EventDao : BaseDao<Event, EventFull> {
companion object {
private const val QUERY = """
SELECT
*,
teachers.teacherName ||" "|| teachers.teacherSurname AS teacherName,
eventTypes.eventTypeName AS typeName,
eventTypes.eventTypeColor AS typeColor
FROM events
LEFT JOIN subjects USING(profileId, subjectId)
LEFT JOIN teachers USING(profileId, teacherId)
LEFT JOIN teams USING(profileId, teamId)
LEFT JOIN eventTypes USING(profileId, eventType)
LEFT JOIN metadata ON eventId = thingId AND (thingType = ${Metadata.TYPE_EVENT} OR thingType = ${Metadata.TYPE_HOMEWORK}) AND metadata.profileId = events.profileId
"""
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun addAll(eventList: List<Event>): LongArray
private const val ORDER_BY = """GROUP BY eventId ORDER BY addedDate ASC"""
private const val NOT_BLACKLISTED = """events.eventBlacklisted = 0"""
}
//abstract fun queryRaw(query: SupportSQLiteQuery)
//private fun queryRaw(query: String) = queryRaw(SimpleSQLiteQuery(query))
@Query("DELETE FROM events WHERE profileId = :profileId")
abstract fun clear(profileId: Int)
abstract override fun clear(profileId: Int)
/*fun update(event: Event) =
queryRaw("""UPDATE events SET
eventDate = '${event.date.stringY_m_d}',
eventTime = ${event.time?.stringValue},
eventTopic = '${event.topic}'""")*/
@Query("DELETE FROM events WHERE profileId = :profileId AND eventId = :id")
abstract fun remove(profileId: Int, id: Long)
@ -46,84 +71,39 @@ abstract class EventDao {
remove(profileId, event.type, event.id)
}
@Query("DELETE FROM events WHERE teamId = :teamId AND eventId = :id")
abstract fun removeByTeamId(teamId: Long, id: Long)
@RawQuery(observedEntities = [Event::class])
abstract fun getAll(query: SupportSQLiteQuery): LiveData<List<EventFull>>
abstract override fun getRaw(query: SupportSQLiteQuery): LiveData<List<EventFull>>
fun getAll(profileId: Int, filter: String, limit: String): LiveData<List<EventFull>> {
return getAll(SimpleSQLiteQuery("SELECT \n" +
"*, \n" +
"teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName,\n" +
"eventTypes.eventTypeName AS typeName,\n" +
"eventTypes.eventTypeColor AS typeColor\n" +
"FROM events\n" +
"LEFT JOIN subjects USING(profileId, subjectId)\n" +
"LEFT JOIN teachers USING(profileId, teacherId)\n" +
"LEFT JOIN teams USING(profileId, teamId)\n" +
"LEFT JOIN eventTypes USING(profileId, eventType)\n" +
"LEFT JOIN metadata ON eventId = thingId AND (thingType = " + Metadata.TYPE_EVENT + " OR thingType = " + Metadata.TYPE_HOMEWORK + ") AND metadata.profileId = " + profileId + "\n" +
"WHERE events.profileId = " + profileId + " AND events.eventBlacklisted = 0 AND " + filter + "\n" +
"GROUP BY eventId\n" +
"ORDER BY eventDate, eventTime ASC " + limit))
}
fun getAll(profileId: Int): LiveData<List<EventFull>> {
return getAll(profileId, "1", "")
}
fun getAllNow(profileId: Int): List<EventFull> {
return getAllNow(profileId, "1")
}
fun getAll(profileId: Int) =
getRaw("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId $ORDER_BY")
fun getAllByType(profileId: Int, type: Long, filter: String = "1") =
getRaw("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId AND eventType = $type AND $filter $ORDER_BY")
fun getAllByDate(profileId: Int, date: Date) =
getRaw("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId AND eventDate = '${date.stringY_m_d}' $ORDER_BY")
fun getAllByDateTime(profileId: Int, date: Date, time: Time) =
getRaw("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId AND eventDate = '${date.stringY_m_d}' AND eventTime = ${time.stringValue}")
fun getAllNearest(profileId: Int, today: Date, limit: Int) =
getRaw("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId AND eventDate >= '${today.stringY_m_d}' $ORDER_BY LIMIT $limit")
fun getAllWhere(profileId: Int, filter: String): LiveData<List<EventFull>> {
return getAll(profileId, filter, "")
}
fun getAllByType(profileId: Int, type: Long, filter: String): LiveData<List<EventFull>> {
return getAll(profileId, "eventType = $type AND $filter", "")
}
fun getAllByDate(profileId: Int, date: Date): LiveData<List<EventFull>> {
return getAll(profileId, "eventDate = '" + date.stringY_m_d + "'", "")
}
fun getAllNow(profileId: Int) =
getRawNow("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId $ORDER_BY")
fun getNotNotifiedNow() =
getRawNow("$QUERY WHERE $NOT_BLACKLISTED AND notified = 0 $ORDER_BY")
fun getNotNotifiedNow(profileId: Int) =
getRawNow("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId AND notified = 0 $ORDER_BY")
fun getAllByDateNow(profileId: Int, date: Date) =
getRawNow("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId AND eventDate = '${date.stringY_m_d}' $ORDER_BY")
fun getAllByDateNow(profileId: Int, date: Date): List<EventFull> {
return getAllNow(profileId, "eventDate = '" + date.stringY_m_d + "'")
}
fun getAllByDateTime(profileId: Int, date: Date, time: Time?): LiveData<List<EventFull>> {
return if (time == null) getAllByDate(profileId, date) else getAll(profileId, "eventDate = '" + date.stringY_m_d + "' AND eventTime = '" + time.stringValue + "'", "")
}
fun getAllNearest(profileId: Int, today: Date, limit: Int): LiveData<List<EventFull>> {
return getAll(profileId, "eventDate >= '" + today.stringY_m_d + "'", "LIMIT $limit")
}
fun getByIdNow(profileId: Int, id: Long) =
getOneNow("$QUERY WHERE events.profileId = $profileId AND eventId = $id")
@RawQuery
abstract fun getAllNow(query: SupportSQLiteQuery): List<EventFull>
fun getAllNow(profileId: Int, filter: String): List<EventFull> {
return getAllNow(SimpleSQLiteQuery("SELECT \n" +
"*, \n" +
"teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName,\n" +
"eventTypes.eventTypeName AS typeName,\n" +
"eventTypes.eventTypeColor AS typeColor\n" +
"FROM events \n" +
"LEFT JOIN subjects USING(profileId, subjectId)\n" +
"LEFT JOIN teachers USING(profileId, teacherId)\n" +
"LEFT JOIN teams USING(profileId, teamId)\n" +
"LEFT JOIN eventTypes USING(profileId, eventType)\n" +
"LEFT JOIN metadata ON eventId = thingId AND (thingType = " + Metadata.TYPE_EVENT + " OR thingType = " + Metadata.TYPE_HOMEWORK + ") AND metadata.profileId = " + profileId + "\n" +
"WHERE events.profileId = " + profileId + " AND events.eventBlacklisted = 0 AND " + filter + "\n" +
"GROUP BY eventId\n" +
"ORDER BY eventTime, addedDate ASC"))
}
fun getNotNotifiedNow(profileId: Int): List<EventFull> {
return getAllNow(profileId, "notified = 0")
}
@Query("SELECT eventId FROM events WHERE profileId = :profileId AND eventBlacklisted = 1")
abstract fun getBlacklistedIds(profileId: Int): List<Long>
@ -131,27 +111,12 @@ abstract class EventDao {
@get:Query("SELECT eventId FROM events WHERE eventBlacklisted = 1")
abstract val blacklistedIds: List<Long>
@get:Query("SELECT " +
"*, " +
"eventTypes.eventTypeName AS typeName, " +
"eventTypes.eventTypeColor AS typeColor " +
"FROM events " +
"LEFT JOIN subjects USING(profileId, subjectId) " +
"LEFT JOIN eventTypes USING(profileId, eventType) " +
"LEFT JOIN metadata ON eventId = thingId AND (thingType = " + Metadata.TYPE_EVENT + " OR thingType = " + Metadata.TYPE_HOMEWORK + ") AND metadata.profileId = events.profileId " +
"WHERE events.eventBlacklisted = 0 AND notified = 0 " +
"GROUP BY eventId " +
"ORDER BY addedDate ASC")
abstract val notNotifiedNow: List<EventFull>
fun getByIdNow(profileId: Int, eventId: Long): EventFull? {
val eventList = getAllNow(profileId, "eventId = $eventId")
return if (eventList.isEmpty()) null else eventList[0]
}
@Query("UPDATE events SET eventAddedManually = 1 WHERE profileId = :profileId AND eventDate < :date")
abstract fun convertOlderToManual(profileId: Int, date: Date?)
@Query("DELETE FROM events WHERE teamId = :teamId AND eventId = :id")
abstract fun removeByTeamId(teamId: Long, id: Long)
@Query("DELETE FROM events WHERE profileId = :profileId AND eventAddedManually = 0")
abstract fun removeNotManual(profileId: Int)
@ -181,4 +146,5 @@ abstract class EventDao {
@Query("UPDATE events SET eventBlacklisted = :blacklisted WHERE profileId = :profileId AND eventId = :eventId")
abstract fun setBlacklisted(profileId: Int, eventId: Long, blacklisted: Boolean)
}