diff --git a/app/src/androidTest/java/com/codemate/koffeemate/data/local/CoffeeEventRepositoryTest.kt b/app/src/androidTest/java/com/codemate/koffeemate/data/local/CoffeeEventRepositoryTest.kt index c427f0c..b3d4048 100644 --- a/app/src/androidTest/java/com/codemate/koffeemate/data/local/CoffeeEventRepositoryTest.kt +++ b/app/src/androidTest/java/com/codemate/koffeemate/data/local/CoffeeEventRepositoryTest.kt @@ -96,6 +96,30 @@ class CoffeeEventRepositoryTest { assertThat(coffeeEventRepository.getAccidentCountForUser(user), equalTo(3L)) } + @Test + fun getTopBrewers_ReturnsTopBrewersSorted() { + coffeeEventRepository.recordBrewingEvent() + coffeeEventRepository.recordBrewingEvent() + + val brewingMaster = User(id = "abc123") + coffeeEventRepository.recordBrewingEvent(brewingMaster) + coffeeEventRepository.recordBrewingEvent(brewingMaster) + coffeeEventRepository.recordBrewingEvent(brewingMaster) + + val brewingApprentice = User(id = "a1b2c3") + coffeeEventRepository.recordBrewingEvent(brewingApprentice) + coffeeEventRepository.recordBrewingEvent(brewingApprentice) + + val brewingNoob = User(id = "cba321") + coffeeEventRepository.recordBrewingEvent(brewingNoob) + + val sortedBrewers = coffeeEventRepository.getTopBrewers() + assertThat(sortedBrewers.size, equalTo(3)) + assertThat(sortedBrewers[0].id, equalTo(brewingMaster.id)) + assertThat(sortedBrewers[1].id, equalTo(brewingApprentice.id)) + assertThat(sortedBrewers[2].id, equalTo(brewingNoob.id)) + } + private fun coffeeEventCount() = with(Realm.getDefaultInstance()) { val count = where(CoffeeBrewingEvent::class.java) .equalTo("isSuccessful", true) diff --git a/app/src/main/java/com/codemate/koffeemate/data/local/CoffeeEventRepository.kt b/app/src/main/java/com/codemate/koffeemate/data/local/CoffeeEventRepository.kt index b136e98..d997269 100644 --- a/app/src/main/java/com/codemate/koffeemate/data/local/CoffeeEventRepository.kt +++ b/app/src/main/java/com/codemate/koffeemate/data/local/CoffeeEventRepository.kt @@ -13,9 +13,26 @@ interface CoffeeEventRepository { fun getLastBrewingEvent(): CoffeeBrewingEvent? fun getLastBrewingAccident(): CoffeeBrewingEvent? + fun getTopBrewers(): List } class RealmCoffeeEventRepository : CoffeeEventRepository { + override fun getTopBrewers() = with(Realm.getDefaultInstance()) { + val users = where(CoffeeBrewingEvent::class.java) + .isNotNull("user") + .findAll() + + val copy = copyFromRealm(users) + .groupBy(CoffeeBrewingEvent::user) + .entries + .sortedByDescending { it.value.size } + .map { it.key } + .filterNotNull() + + close() + return@with copy + } + override fun recordBrewingEvent(user: User?) = with(Realm.getDefaultInstance()) { var event: CoffeeBrewingEvent? = null executeTransaction {