Skip to content

Commit eecb97a

Browse files
committed
improve record filtering, remove duplications
1 parent 4e2e68f commit eecb97a

15 files changed

Lines changed: 51 additions & 47 deletions

File tree

core/src/main/java/com/example/util/simpletimetracker/core/interactor/GetCurrentRecordsDurationInteractor.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class GetCurrentRecordsDurationInteractor @Inject constructor(
2525
}
2626

2727
suspend fun getAllCurrents(
28-
typeIds: List<Long>,
28+
typeIds: Set<Long>,
2929
runningRecords: List<RunningRecord>,
3030
rangeLength: RangeLength,
3131
): Map<Long, Result> {
@@ -55,7 +55,7 @@ class GetCurrentRecordsDurationInteractor @Inject constructor(
5555
val rangeRecords = getRangeRecords(
5656
rangeLength = rangeLength,
5757
range = range,
58-
typeIds = recordTypeCategories.values.flatten().distinct(),
58+
typeIds = recordTypeCategories.values.flatten().toSet(),
5959
)
6060

6161
return recordTypeCategories.mapValues { (_, typeIds) ->
@@ -88,7 +88,7 @@ class GetCurrentRecordsDurationInteractor @Inject constructor(
8888
}
8989

9090
suspend fun getAllDailyCurrents(
91-
typeIds: List<Long>,
91+
typeIds: Set<Long>,
9292
runningRecords: List<RunningRecord>,
9393
): Map<Long, Result> {
9494
return getAllCurrents(
@@ -107,7 +107,7 @@ class GetCurrentRecordsDurationInteractor @Inject constructor(
107107
val rangeRecords = getRangeRecords(
108108
rangeLength = rangeLength,
109109
range = range,
110-
typeIds = listOf(typeId),
110+
typeIds = setOf(typeId),
111111
)
112112

113113
return getRangeCurrent(
@@ -155,7 +155,7 @@ class GetCurrentRecordsDurationInteractor @Inject constructor(
155155
private suspend fun getRangeRecords(
156156
rangeLength: RangeLength,
157157
range: Range,
158-
typeIds: List<Long>,
158+
typeIds: Set<Long>,
159159
): List<Record> {
160160
// Use getFromRange to hit cache.
161161
val params = if (rangeLength is RangeLength.Day) {

core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordCommentSearchViewDataInteractor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class RecordCommentSearchViewDataInteractor @Inject constructor(
132132
): List<ViewHolderType> {
133133
data class Data(val timeStarted: Long, val comment: String)
134134

135-
val records = recordInteractor.getWithParams(GetParam.TypeWithAnyComment(listOf(typeId)))
135+
val records = recordInteractor.getWithParams(GetParam.TypeWithAnyComment(setOf(typeId)))
136136
.map { Data(it.timeStarted, it.comment) }
137137
val runningRecords = runningRecordInteractor.getAll()
138138
.filter { it.id == typeId && it.comment.isNotEmpty() }

core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordFilterInteractor.kt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.example.util.simpletimetracker.domain.record.interactor.GetMultitaskR
2222
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
2323
import com.example.util.simpletimetracker.domain.record.interactor.RecordInteractor
2424
import com.example.util.simpletimetracker.domain.category.interactor.RecordTypeCategoryInteractor
25+
import com.example.util.simpletimetracker.domain.category.model.RecordTypeCategory
2526
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeInteractor
2627
import com.example.util.simpletimetracker.domain.record.interactor.RunningRecordInteractor
2728
import com.example.util.simpletimetracker.domain.record.mapper.RangeMapper
@@ -45,6 +46,7 @@ import com.example.util.simpletimetracker.domain.record.model.Record
4546
import com.example.util.simpletimetracker.domain.record.model.RecordBase
4647
import com.example.util.simpletimetracker.domain.record.model.RecordsFilter
4748
import com.example.util.simpletimetracker.domain.record.model.RunningRecord
49+
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
4850
import java.util.Calendar
4951
import java.util.concurrent.TimeUnit
5052
import javax.inject.Inject
@@ -93,22 +95,24 @@ class RecordFilterInteractor @Inject constructor(
9395

9496
val startOfDayShift = prefsInteractor.getStartOfDayShift()
9597
val calendar: Calendar = Calendar.getInstance()
96-
val typeIds: List<Long> = when {
98+
var types: List<RecordType>? = null
99+
var typeCategories: List<RecordTypeCategory>? = null
100+
val typeIds: Set<Long> = when {
97101
filters.hasSelectedCategoryFilter() -> {
98-
val types = recordTypeInteractor.getAll()
99-
val typeCategories = recordTypeCategoryInteractor.getAll()
102+
types = recordTypeInteractor.getAll()
103+
typeCategories = recordTypeCategoryInteractor.getAll()
100104
filters.getAllTypeIds(types, typeCategories)
101105
}
102106
else -> filters.getTypeIds()
103-
}
104-
val filteredTypeIds: List<Long> = when {
107+
}.toSet()
108+
val filteredTypeIds: Set<Long> = when {
105109
filters.hasFilteredCategoryFilter() -> {
106-
val types = recordTypeInteractor.getAll()
107-
val typeCategories = recordTypeCategoryInteractor.getAll()
110+
types = types ?: recordTypeInteractor.getAll()
111+
typeCategories = typeCategories ?: recordTypeCategoryInteractor.getAll()
108112
filters.getAllFilteredTypeIds(types, typeCategories)
109113
}
110114
else -> filters.getFilteredTypeIds()
111-
}
115+
}.toSet()
112116
val hasUntracked: Boolean = filters.hasUntrackedFilter()
113117
val hasMultitask: Boolean = filters.hasMultitaskFilter()
114118
val runningRecords = runningRecordInteractor.getAll()
@@ -119,10 +123,10 @@ class RecordFilterInteractor @Inject constructor(
119123
val ranges: List<Range> = filters.getDate()?.let { getRange(it) }?.let(::listOf).orEmpty()
120124
val definedRanges = ranges.filter { it.timeStarted != 0L && it.timeEnded != 0L }
121125
val selectedTagItems: List<RecordsFilter.TagItem> = filters.getSelectedTags()
122-
val selectedTaggedIds: List<Long> = selectedTagItems.getTaggedIds()
126+
val selectedTaggedIds: Set<Long> = selectedTagItems.getTaggedIds().toSet()
123127
val selectedUntagged: Boolean = selectedTagItems.hasUntaggedItem()
124128
val filteredTagItems: List<RecordsFilter.TagItem> = filters.getFilteredTags()
125-
val filteredTaggedIds: List<Long> = filteredTagItems.getTaggedIds()
129+
val filteredTaggedIds: Set<Long> = filteredTagItems.getTaggedIds().toSet()
126130
val filteredUntagged: Boolean = filteredTagItems.hasUntaggedItem()
127131
val manuallyFilteredItems: Map<RecordsFilter.ManuallyFilteredItem, Boolean> = filters.getManuallyFilteredItems()
128132
val daysOfWeek: Set<DayOfWeek> = filters.getDaysOfWeek()

data_local/src/main/java/com/example/util/simpletimetracker/data_local/record/RecordDao.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,27 @@ interface RecordDao {
1919

2020
@Transaction
2121
@Query("SELECT * FROM records WHERE type_id IN (:typesIds)")
22-
suspend fun getByType(typesIds: List<Long>): List<RecordWithRecordTagsDBO>
22+
suspend fun getByType(typesIds: Set<Long>): List<RecordWithRecordTagsDBO>
2323

2424
@Transaction
2525
@Query("SELECT * FROM records WHERE type_id IN (:typesIds) AND comment != \"\"")
26-
suspend fun getByTypeWithAnyComment(typesIds: List<Long>): List<RecordWithRecordTagsDBO>
26+
suspend fun getByTypeWithAnyComment(typesIds: Set<Long>): List<RecordWithRecordTagsDBO>
2727

2828
@Transaction
2929
@Query("SELECT * FROM records WHERE instr(lower(comment), lower(:text)) > 0")
3030
suspend fun searchComment(text: String): List<RecordWithRecordTagsDBO>
3131

3232
@Transaction
3333
@Query("SELECT * FROM records WHERE type_id IN (:typesIds) AND instr(lower(comment), lower(:text)) > 0")
34-
suspend fun searchByTypeWithComment(typesIds: List<Long>, text: String): List<RecordWithRecordTagsDBO>
34+
suspend fun searchByTypeWithComment(typesIds: Set<Long>, text: String): List<RecordWithRecordTagsDBO>
3535

3636
@Transaction
3737
@Query("SELECT * FROM records WHERE comment != \"\"")
3838
suspend fun searchAnyComments(): List<RecordWithRecordTagsDBO>
3939

4040
@Transaction
4141
@Query("SELECT * FROM records WHERE EXISTS(SELECT 1 FROM recordToRecordTag WHERE record_id = records.id AND record_tag_id IN (:tagIds))")
42-
suspend fun getTagged(tagIds: List<Long>): List<RecordWithRecordTagsDBO>
42+
suspend fun getTagged(tagIds: Set<Long>): List<RecordWithRecordTagsDBO>
4343

4444
@Transaction
4545
@Query("SELECT * FROM records WHERE NOT EXISTS(SELECT 1 FROM recordToRecordTag WHERE record_id = records.id)")
@@ -55,7 +55,7 @@ interface RecordDao {
5555

5656
@Transaction
5757
@Query("SELECT * FROM records WHERE type_id IN (:typesIds) AND time_started < :end AND time_ended > :start")
58-
suspend fun getFromRangeByType(typesIds: List<Long>, start: Long, end: Long): List<RecordWithRecordTagsDBO>
58+
suspend fun getFromRangeByType(typesIds: Set<Long>, start: Long, end: Long): List<RecordWithRecordTagsDBO>
5959

6060
@Transaction
6161
@Query(

data_local/src/main/java/com/example/util/simpletimetracker/data_local/record/RecordRepoImpl.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ class RecordRepoImpl @Inject constructor(
3838
recordDao.getAll().map(::mapItem)
3939
}
4040

41-
override suspend fun getByType(typeIds: List<Long>): List<Record> = withContext(Dispatchers.IO) {
41+
override suspend fun getByType(typeIds: Set<Long>): List<Record> = withContext(Dispatchers.IO) {
4242
logDataAccess("getByType")
4343
recordDao.getByType(typeIds).map(::mapItem)
4444
}
4545

46-
override suspend fun getByTypeWithAnyComment(typeIds: List<Long>): List<Record> = withContext(Dispatchers.IO) {
46+
override suspend fun getByTypeWithAnyComment(typeIds: Set<Long>): List<Record> = withContext(Dispatchers.IO) {
4747
logDataAccess("getByTypeWithAnyComment")
4848
recordDao.getByTypeWithAnyComment(typeIds).map(::mapItem)
4949
}
@@ -56,7 +56,7 @@ class RecordRepoImpl @Inject constructor(
5656
}
5757

5858
override suspend fun searchByTypeWithComment(
59-
typeIds: List<Long>,
59+
typeIds: Set<Long>,
6060
text: String,
6161
): List<Record> = withContext(Dispatchers.IO) {
6262
logDataAccess("searchByTypeWithComment")
@@ -68,7 +68,7 @@ class RecordRepoImpl @Inject constructor(
6868
recordDao.searchAnyComments().map(::mapItem)
6969
}
7070

71-
override suspend fun getTagged(tagIds: List<Long>): List<Record> = withContext(Dispatchers.IO) {
71+
override suspend fun getTagged(tagIds: Set<Long>): List<Record> = withContext(Dispatchers.IO) {
7272
logDataAccess("getTagged")
7373
recordDao.getTagged(tagIds).map(::mapItem)
7474
}
@@ -89,7 +89,7 @@ class RecordRepoImpl @Inject constructor(
8989
val cacheKey = GetFromRangeKey(range)
9090
return mutex.withLockedCache(
9191
logMessage = "getFromRange",
92-
accessCache = { getFromRangeCache.get(cacheKey) },
92+
accessCache = { getFromRangeCache[cacheKey] },
9393
accessSource = {
9494
recordDao.getFromRange(
9595
start = range.timeStarted,
@@ -100,7 +100,7 @@ class RecordRepoImpl @Inject constructor(
100100
)
101101
}
102102

103-
override suspend fun getFromRangeByType(typeIds: List<Long>, range: Range): List<Record> {
103+
override suspend fun getFromRangeByType(typeIds: Set<Long>, range: Range): List<Record> {
104104
val cacheKey = GetFromRangeByTypeKey(typeIds, range)
105105
return mutex.withLockedCache(
106106
logMessage = "getFromRangeByType",
@@ -229,7 +229,7 @@ class RecordRepoImpl @Inject constructor(
229229
}
230230

231231
private data class GetFromRangeByTypeKey(
232-
val typeIds: List<Long>,
232+
val typeIds: Set<Long>,
233233
val range: Range,
234234
)
235235

domain/src/main/java/com/example/util/simpletimetracker/domain/record/interactor/RecordInteractor.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,14 @@ class RecordInteractor @Inject constructor(
122122
}
123123

124124
sealed interface GetParam {
125-
data class Type(val ids: List<Long>) : GetParam
126-
data class TypeWithAnyComment(val ids: List<Long>) : GetParam
127-
data class TypeWithComment(val ids: List<Long>, val text: String) : GetParam
125+
data class Type(val ids: Set<Long>) : GetParam
126+
data class TypeWithAnyComment(val ids: Set<Long>) : GetParam
127+
data class TypeWithComment(val ids: Set<Long>, val text: String) : GetParam
128128
data class Comment(val text: String) : GetParam
129129
data object AnyComment : GetParam
130-
data class Tagged(val ids: List<Long>) : GetParam
130+
data class Tagged(val ids: Set<Long>) : GetParam
131131
data object Untagged : GetParam
132132
data class FromRange(val range: Range) : GetParam
133-
data class FromRangeByType(val ids: List<Long>, val range: Range) : GetParam
133+
data class FromRangeByType(val ids: Set<Long>, val range: Range) : GetParam
134134
}
135135
}

domain/src/main/java/com/example/util/simpletimetracker/domain/record/repo/RecordRepo.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,25 @@ interface RecordRepo {
99

1010
suspend fun getAll(): List<Record>
1111

12-
suspend fun getByType(typeIds: List<Long>): List<Record>
12+
suspend fun getByType(typeIds: Set<Long>): List<Record>
1313

14-
suspend fun getByTypeWithAnyComment(typeIds: List<Long>): List<Record>
14+
suspend fun getByTypeWithAnyComment(typeIds: Set<Long>): List<Record>
1515

1616
suspend fun searchComment(text: String): List<Record>
1717

18-
suspend fun searchByTypeWithComment(typeIds: List<Long>, text: String): List<Record>
18+
suspend fun searchByTypeWithComment(typeIds: Set<Long>, text: String): List<Record>
1919

2020
suspend fun searchAnyComments(): List<Record>
2121

22-
suspend fun getTagged(tagIds: List<Long>): List<Record>
22+
suspend fun getTagged(tagIds: Set<Long>): List<Record>
2323

2424
suspend fun getUntagged(): List<Record>
2525

2626
suspend fun get(id: Long): Record?
2727

2828
suspend fun getFromRange(range: Range): List<Record>
2929

30-
suspend fun getFromRangeByType(typeIds: List<Long>, range: Range): List<Record>
30+
suspend fun getFromRangeByType(typeIds: Set<Long>, range: Range): List<Record>
3131

3232
suspend fun getPrev(timeStarted: Long, ignoreTypeIds: List<Long> = emptyList()): Record?
3333

domain/src/main/java/com/example/util/simpletimetracker/domain/recordType/interactor/RecordTypeInteractor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class RecordTypeInteractor @Inject constructor(
6666
}
6767

6868
suspend fun remove(id: Long) {
69-
val recordsToRemove = recordRepo.getByType(listOf(id)).map { it.id }
69+
val recordsToRemove = recordRepo.getByType(setOf(id)).map { it.id }
7070
recordsToRemove.forEach { recordId ->
7171
recordToRecordTagRepo.removeAllByRecordId(recordId) // TODO do better?
7272
}

features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/archive/interactor/ArchiveDialogViewDataInteractor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class ArchiveDialogViewDataInteractor @Inject constructor(
4040
checkState = GoalCheckmarkView.CheckState.HIDDEN,
4141
isComplete = false,
4242
)
43-
val recordsCount = recordInteractor.getWithParams(GetParam.Type(listOf(typeId))).size
43+
val recordsCount = recordInteractor.getWithParams(GetParam.Type(setOf(typeId))).size
4444

4545
return mutableListOf<ViewHolderType>().apply {
4646
item.let(::add)

features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/activitySwitch/interactor/NotificationActivitySwitchInteractorImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ class NotificationActivitySwitchInteractorImpl @Inject constructor(
117117
).groupBy { it.idData.value }
118118
val allDailyCurrents = if (goals.isNotEmpty()) {
119119
getCurrentRecordsDurationInteractor.getAllDailyCurrents(
120-
typeIds = recordTypes.keys.toList(),
120+
typeIds = recordTypes.keys,
121121
runningRecords = runningRecords,
122122
)
123123
} else {

0 commit comments

Comments
 (0)