Units repository updates

Units filter fixes
Performance drop fixed
This commit is contained in:
Sad Ellie 2022-08-22 22:24:52 +03:00
parent 0d1d08a951
commit f6c1d44be2
5 changed files with 26 additions and 22 deletions

View File

@ -37,7 +37,7 @@ class AllUnitsRepository @Inject constructor() {
/**
* This is a collection of all available units.
*/
val allUnits: List<AbstractUnit> by lazy {
private val allUnits: List<AbstractUnit> by lazy {
mapOfCollections.values.flatten()
}
@ -79,12 +79,14 @@ class AllUnitsRepository @Inject constructor() {
/**
* Looks for a collection of units of the given [UnitGroup].
*
* @param unitGroup Requested [UnitGroup]. If you give it null, you will likely get null.
* @param unitGroup Requested [UnitGroup]
* @return List of [AbstractUnit]s. Will return null if the is no collection for the specified
* [UnitGroup].
*
* @throws [NoSuchElementException] from [Map.getValue]
*/
fun getCollectionByGroup(unitGroup: UnitGroup?): List<AbstractUnit>? {
return mapOfCollections[unitGroup]
fun getCollectionByGroup(unitGroup: UnitGroup): List<AbstractUnit> {
return mapOfCollections.getValue(unitGroup)
}
/**
@ -106,11 +108,12 @@ class AllUnitsRepository @Inject constructor() {
searchQuery: String,
allUnitsGroups: List<UnitGroup>
): Map<UnitGroup, List<AbstractUnit>> {
val shownUnits: List<AbstractUnit> =
allUnitsGroups.flatMap { getCollectionByGroup(it) ?: listOf() }
var basicFilteredUnits: Sequence<AbstractUnit> =
getCollectionByGroup(unitGroup = chosenUnitGroup)?.asSequence() ?: shownUnits.asSequence()
var basicFilteredUnits: Sequence<AbstractUnit> = if (chosenUnitGroup == null) {
allUnits.filter { it.group in allUnitsGroups }
} else {
val collection = getCollectionByGroup(chosenUnitGroup)
collection
}.asSequence()
if (favoritesOnly) {
basicFilteredUnits = basicFilteredUnits.filter { it.isFavorite }
@ -159,7 +162,7 @@ class AllUnitsRepository @Inject constructor() {
fun updateBasicUnitsForCurrencies(
conversions: Map<String, BigDecimal>
) {
getCollectionByGroup(UnitGroup.CURRENCY)?.forEach {
getCollectionByGroup(UnitGroup.CURRENCY).forEach {
// Getting rates from map. We set ZERO as default so that it can be skipped
val rate = conversions.getOrElse(it.unitId) { BigDecimal.ZERO }
// We make sure that we don't divide by zero

View File

@ -147,8 +147,7 @@ class MainViewModel @Inject constructor(
// Now setting up right unit (pair for the left one)
unitTo = if (unitFrom.pairedUnit == null) {
// Dangerous btw
allUnitsRepository.getCollectionByGroup(unitFrom.group)!!.first()
allUnitsRepository.getCollectionByGroup(unitFrom.group).first()
} else {
allUnitsRepository.getById(unitFrom.pairedUnit!!)
}

View File

@ -85,9 +85,6 @@ class SecondViewModel @Inject constructor(
hideBrokenCurrencies: Boolean
) {
viewModelScope.launch {
// Prevent user from seeing invalid list
uiState = uiState.copy(unitsToShow = emptyMap())
// This is mostly not UI related stuff and viewModelScope.launch uses Dispatchers.Main
// So we switch to Default
withContext(Dispatchers.Default) {

View File

@ -25,6 +25,8 @@ class AllUnitsRepositoryTest {
private val allUnitsRepository = AllUnitsRepository()
private val allUnits: List<AbstractUnit> = ALL_UNIT_GROUPS.flatMap { allUnitsRepository.getCollectionByGroup(it) }
@Test
fun filterAllUnitsNoFiltersLeft() {
// No filters applied, empty search query, from Left side list
@ -35,7 +37,7 @@ class AllUnitsRepositoryTest {
searchQuery = "",
allUnitsGroups = ALL_UNIT_GROUPS
)
assertEquals(allUnitsRepository.allUnits.groupBy { it.group }, result)
assertEquals(allUnits.groupBy { it.group }, result)
}
@Test
@ -53,7 +55,8 @@ class AllUnitsRepositoryTest {
allUnitsGroups = ALL_UNIT_GROUPS
)
assertEquals(
mapOf(UnitGroup.SPEED to listOf(allUnitsRepository.getCollectionByGroup(UnitGroup.SPEED)?.first { it.unitId == MyUnitIDS.kilometer_per_hour })),
mapOf(UnitGroup.SPEED to listOf(allUnitsRepository.getCollectionByGroup(UnitGroup.SPEED)
.first { it.unitId == MyUnitIDS.kilometer_per_hour })),
result
)
}
@ -68,7 +71,7 @@ class AllUnitsRepositoryTest {
searchQuery = "",
allUnitsGroups = ALL_UNIT_GROUPS
)
assertEquals(allUnitsRepository.allUnits.filter { it.group == UnitGroup.TIME }
assertEquals(allUnits.filter { it.group == UnitGroup.TIME }
.groupBy { it.group }, result)
}
@ -83,7 +86,7 @@ class AllUnitsRepositoryTest {
searchQuery = "",
allUnitsGroups = ALL_UNIT_GROUPS
)
assertEquals(allUnitsRepository.allUnits.filter { it.unitId == MyUnitIDS.kilometer }
assertEquals(allUnits.filter { it.unitId == MyUnitIDS.kilometer }
.groupBy { it.group }, result)
}
@ -102,7 +105,8 @@ class AllUnitsRepositoryTest {
allUnitsGroups = ALL_UNIT_GROUPS
)
assertEquals(
mapOf(UnitGroup.SPEED to listOf(allUnitsRepository.getCollectionByGroup(UnitGroup.SPEED)?.first { it.unitId == MyUnitIDS.kilometer_per_hour })),
mapOf(UnitGroup.SPEED to listOf(allUnitsRepository.getCollectionByGroup(UnitGroup.SPEED)
.first { it.unitId == MyUnitIDS.kilometer_per_hour })),
result
)
}
@ -121,7 +125,8 @@ class AllUnitsRepositoryTest {
allUnitsGroups = ALL_UNIT_GROUPS
)
assertEquals(
mapOf(UnitGroup.CURRENCY to allUnitsRepository.getCollectionByGroup(UnitGroup.CURRENCY)?.filter { it.unitId != MyUnitIDS.currency_btc }),
mapOf(UnitGroup.CURRENCY to allUnitsRepository.getCollectionByGroup(UnitGroup.CURRENCY)
.filter { it.unitId != MyUnitIDS.currency_btc }),
result
)
}

View File

@ -354,6 +354,6 @@ class AllUnitsTest {
fun after() {
val unitGroup = history.keys.first()
// GROUP : testedCount / totalCount
println("${unitGroup.name} : ${history[unitGroup]?.size} / ${allUnitsRepository.getCollectionByGroup(unitGroup)?.size}")
println("${unitGroup.name} : ${history[unitGroup]?.size} / ${allUnitsRepository.getCollectionByGroup(unitGroup).size}")
}
}