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. * This is a collection of all available units.
*/ */
val allUnits: List<AbstractUnit> by lazy { private val allUnits: List<AbstractUnit> by lazy {
mapOfCollections.values.flatten() mapOfCollections.values.flatten()
} }
@ -79,12 +79,14 @@ class AllUnitsRepository @Inject constructor() {
/** /**
* Looks for a collection of units of the given [UnitGroup]. * 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 * @return List of [AbstractUnit]s. Will return null if the is no collection for the specified
* [UnitGroup]. * [UnitGroup].
*
* @throws [NoSuchElementException] from [Map.getValue]
*/ */
fun getCollectionByGroup(unitGroup: UnitGroup?): List<AbstractUnit>? { fun getCollectionByGroup(unitGroup: UnitGroup): List<AbstractUnit> {
return mapOfCollections[unitGroup] return mapOfCollections.getValue(unitGroup)
} }
/** /**
@ -106,11 +108,12 @@ class AllUnitsRepository @Inject constructor() {
searchQuery: String, searchQuery: String,
allUnitsGroups: List<UnitGroup> allUnitsGroups: List<UnitGroup>
): Map<UnitGroup, List<AbstractUnit>> { ): Map<UnitGroup, List<AbstractUnit>> {
val shownUnits: List<AbstractUnit> = var basicFilteredUnits: Sequence<AbstractUnit> = if (chosenUnitGroup == null) {
allUnitsGroups.flatMap { getCollectionByGroup(it) ?: listOf() } allUnits.filter { it.group in allUnitsGroups }
} else {
var basicFilteredUnits: Sequence<AbstractUnit> = val collection = getCollectionByGroup(chosenUnitGroup)
getCollectionByGroup(unitGroup = chosenUnitGroup)?.asSequence() ?: shownUnits.asSequence() collection
}.asSequence()
if (favoritesOnly) { if (favoritesOnly) {
basicFilteredUnits = basicFilteredUnits.filter { it.isFavorite } basicFilteredUnits = basicFilteredUnits.filter { it.isFavorite }
@ -159,7 +162,7 @@ class AllUnitsRepository @Inject constructor() {
fun updateBasicUnitsForCurrencies( fun updateBasicUnitsForCurrencies(
conversions: Map<String, BigDecimal> 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 // Getting rates from map. We set ZERO as default so that it can be skipped
val rate = conversions.getOrElse(it.unitId) { BigDecimal.ZERO } val rate = conversions.getOrElse(it.unitId) { BigDecimal.ZERO }
// We make sure that we don't divide by 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) // Now setting up right unit (pair for the left one)
unitTo = if (unitFrom.pairedUnit == null) { unitTo = if (unitFrom.pairedUnit == null) {
// Dangerous btw allUnitsRepository.getCollectionByGroup(unitFrom.group).first()
allUnitsRepository.getCollectionByGroup(unitFrom.group)!!.first()
} else { } else {
allUnitsRepository.getById(unitFrom.pairedUnit!!) allUnitsRepository.getById(unitFrom.pairedUnit!!)
} }

View File

@ -85,9 +85,6 @@ class SecondViewModel @Inject constructor(
hideBrokenCurrencies: Boolean hideBrokenCurrencies: Boolean
) { ) {
viewModelScope.launch { 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 // This is mostly not UI related stuff and viewModelScope.launch uses Dispatchers.Main
// So we switch to Default // So we switch to Default
withContext(Dispatchers.Default) { withContext(Dispatchers.Default) {

View File

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

View File

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