-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: support browsing events by area
- Loading branch information
Showing
12 changed files
with
224 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
79 changes: 79 additions & 0 deletions
79
data/database/src/commonMain/kotlin/ly/david/musicsearch/data/database/dao/AreaEventDao.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
package ly.david.musicsearch.data.database.dao | ||
|
||
import app.cash.paging.PagingSource | ||
import app.cash.sqldelight.coroutines.asFlow | ||
import app.cash.sqldelight.coroutines.mapToOne | ||
import app.cash.sqldelight.paging3.QueryPagingSource | ||
import kotlinx.coroutines.flow.Flow | ||
import kotlinx.coroutines.flow.map | ||
import ly.david.musicsearch.core.coroutines.CoroutineDispatchers | ||
import ly.david.musicsearch.core.models.listitem.EventListItemModel | ||
import ly.david.musicsearch.data.database.Database | ||
import ly.david.musicsearch.data.database.mapper.mapToEventListItemModel | ||
import lydavidmusicsearchdatadatabase.Area_event | ||
|
||
class AreaEventDao( | ||
database: Database, | ||
private val coroutineDispatchers: CoroutineDispatchers, | ||
) : EntityDao { | ||
override val transacter = database.area_eventQueries | ||
|
||
fun insert( | ||
areaId: String, | ||
eventId: String, | ||
) { | ||
transacter.insert( | ||
Area_event( | ||
area_id = areaId, | ||
event_id = eventId, | ||
), | ||
) | ||
} | ||
|
||
fun insertAll( | ||
areaAndEventIds: List<Pair<String, String>>, | ||
) { | ||
transacter.transaction { | ||
areaAndEventIds.forEach { (areaId, eventId) -> | ||
insert( | ||
areaId = areaId, | ||
eventId = eventId, | ||
) | ||
} | ||
} | ||
} | ||
|
||
fun deleteEventsByArea(areaId: String) { | ||
transacter.deleteEventsByArea(areaId) | ||
} | ||
|
||
fun getNumberOfEventsByArea(areaId: String): Flow<Int> = | ||
transacter.getNumberOfEventsByArea( | ||
areaId = areaId, | ||
query = "%%", | ||
) | ||
.asFlow() | ||
.mapToOne(coroutineDispatchers.io) | ||
.map { it.toInt() } | ||
|
||
fun getEventsByArea( | ||
areaId: String, | ||
query: String, | ||
): PagingSource<Int, EventListItemModel> = QueryPagingSource( | ||
countQuery = transacter.getNumberOfEventsByArea( | ||
areaId = areaId, | ||
query = "%$query%", | ||
), | ||
transacter = transacter, | ||
context = coroutineDispatchers.io, | ||
queryProvider = { limit, offset -> | ||
transacter.getEventsByArea( | ||
areaId = areaId, | ||
query = "%$query%", | ||
limit = limit, | ||
offset = offset, | ||
mapper = ::mapToEventListItemModel, | ||
) | ||
}, | ||
) | ||
} |
51 changes: 51 additions & 0 deletions
51
data/database/src/commonMain/sqldelight/ly.david.musicsearch.data.database/area_event.sq
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
CREATE TABLE IF NOT EXISTS area_event ( | ||
area_id TEXT NOT NULL, | ||
event_id TEXT NOT NULL, | ||
|
||
PRIMARY KEY (area_id, event_id) | ||
); | ||
|
||
insert: | ||
INSERT OR IGNORE INTO area_event | ||
VALUES ?; | ||
|
||
deleteEventsByArea: | ||
DELETE FROM event WHERE id IN ( | ||
SELECT e.id | ||
FROM area a | ||
INNER JOIN area_event ae ON a.id = ae.area_id | ||
INNER JOIN event e ON e.id = ae.event_id | ||
WHERE a.id = :areaId | ||
); | ||
|
||
getNumberOfEventsByArea: | ||
SELECT IFNULL( | ||
( | ||
SELECT COUNT(*) | ||
FROM area a | ||
INNER JOIN area_event ae ON a.id = ae.area_id | ||
INNER JOIN event e ON e.id = ae.event_id | ||
WHERE a.id = :areaId | ||
AND (e.name LIKE :query OR e.disambiguation LIKE :query OR e.type LIKE :query) | ||
), | ||
0 | ||
) AS count; | ||
|
||
getEventsByArea: | ||
SELECT | ||
e.id, | ||
e.name, | ||
e.disambiguation, | ||
e.type, | ||
e.time, | ||
e.cancelled, | ||
e.begin, | ||
e.end, | ||
e.ended | ||
FROM area a | ||
INNER JOIN area_event ae ON a.id = ae.area_id | ||
INNER JOIN event e ON e.id = ae.event_id | ||
WHERE a.id = :areaId | ||
AND (e.name LIKE :query OR e.disambiguation LIKE :query OR e.type LIKE :query) | ||
ORDER BY e.begin, e.end, e.name | ||
LIMIT :limit OFFSET :offset; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
CREATE TABLE IF NOT EXISTS area_event ( | ||
area_id TEXT NOT NULL, | ||
event_id TEXT NOT NULL, | ||
|
||
PRIMARY KEY (area_id, event_id) | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.