From a72fff5f8fa611c54d589ff4151db12a5a79850a Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Sat, 16 Aug 2025 18:50:01 +0100 Subject: [PATCH] Lifted out collectors from CacheCollectors object --- .../quartz/utils/CacheCollectors.kt | 592 +++++++++--------- .../quartz/utils/CacheOperations.kt | 32 +- 2 files changed, 316 insertions(+), 308 deletions(-) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/utils/CacheCollectors.kt b/quartz/src/main/java/com/vitorpamplona/quartz/utils/CacheCollectors.kt index b6203e5c9..5b54c8be7 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/utils/CacheCollectors.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/utils/CacheCollectors.kt @@ -20,8 +20,308 @@ */ package com.vitorpamplona.quartz.utils +import com.vitorpamplona.quartz.utils.CacheCollectors.BiFilter +import com.vitorpamplona.quartz.utils.CacheCollectors.BiMapper +import com.vitorpamplona.quartz.utils.CacheCollectors.BiMapperNotNull +import com.vitorpamplona.quartz.utils.CacheCollectors.BiNotNullMapper +import com.vitorpamplona.quartz.utils.CacheCollectors.BiSumOfLong import java.util.function.BiConsumer +class BiFilterCollector( + private val filter: BiFilter, +) : BiConsumer { + val results: ArrayList = ArrayList() + + override fun accept( + k: K, + v: V, + ) { + if (filter.filter(k, v)) { + results.add(v) + } + } +} + +class BiFilterUniqueCollector( + private val filter: BiFilter, +) : BiConsumer { + val results: HashSet = HashSet() + + override fun accept( + k: K, + v: V, + ) { + if (filter.filter(k, v)) { + results.add(v) + } + } +} + +class BiMapCollector( + private val mapper: BiMapper, +) : BiConsumer { + val results: ArrayList = ArrayList() + + override fun accept( + k: K, + v: V, + ) { + val result = mapper.map(k, v) + if (result != null) { + results.add(result) + } + } +} + +class BiMapUniqueCollector( + private val mapper: BiMapper, +) : BiConsumer { + val results: HashSet = HashSet() + + override fun accept( + k: K, + v: V, + ) { + val result = mapper.map(k, v) + if (result != null) { + results.add(result) + } + } +} + +class BiMapFlattenCollector( + private val mapper: BiMapper?>, +) : BiConsumer { + val results: ArrayList = ArrayList() + + override fun accept( + k: K, + v: V, + ) { + val result = mapper.map(k, v) + if (result != null) { + results.addAll(result) + } + } +} + +class BiMapFlattenUniqueCollector( + private val mapper: BiMapper?>, +) : BiConsumer { + val results: HashSet = HashSet() + + override fun accept( + k: K, + v: V, + ) { + val result = mapper.map(k, v) + if (result != null) { + results.addAll(result) + } + } +} + +class BiNotNullMapCollector( + private val mapper: BiNotNullMapper, +) : BiConsumer { + val results: ArrayList = ArrayList() + + override fun accept( + k: K, + v: V, + ) { + results.add(mapper.map(k, v)) + } +} + +class BiMaxOfCollector( + private val filter: BiFilter, + private val comparator: Comparator, +) : BiConsumer { + private var _maxK: K? = null + private var _maxV: V? = null + + val maxK: K? get() = _maxK + val maxV: V? get() = _maxV + + override fun accept( + k: K, + v: V, + ) { + if (filter.filter(k, v)) { + if (_maxK == null || comparator.compare(v, _maxV) > 0) { + _maxK = k + _maxV = v + } + } + } +} + +class BiSumOfCollector( + private val mapper: CacheCollectors.BiSumOf, +) : BiConsumer { + private var _sum = 0 + val sum: Int get() = _sum + + override fun accept( + k: K, + v: V, + ) { + _sum += mapper.map(k, v) + } +} + +class BiSumOfLongCollector( + private val mapper: BiSumOfLong, +) : BiConsumer { + private var _sum = 0L + val sum: Long get() = _sum + + override fun accept( + k: K, + v: V, + ) { + _sum += mapper.map(k, v) + } +} + +class BiGroupByCollector( + private val mapper: BiNotNullMapper, +) : BiConsumer { + val results = HashMap>() + + override fun accept( + k: K, + v: V, + ) { + val group = mapper.map(k, v) + val list = results[group] + if (list == null) { + val answer = ArrayList() + answer.add(v) + results[group] = answer + } else { + list.add(v) + } + } +} + +class BiCountByGroupCollector( + private val mapper: BiNotNullMapper, +) : BiConsumer { + val results = HashMap() + + override fun accept( + k: K, + v: V, + ) { + val group = mapper.map(k, v) + val count = results[group] + if (count == null) { + results[group] = 1 + } else { + results[group] = count + 1 + } + } +} + +class BiSumByGroupCollector( + private val mapper: BiNotNullMapper, + private val sumOf: BiNotNullMapper, +) : BiConsumer { + val results = HashMap() + + override fun accept( + k: K, + v: V, + ) { + val group = mapper.map(k, v) + val sum = results[group] + if (sum == null) { + results[group] = sumOf.map(k, v) + } else { + results[group] = sum + sumOf.map(k, v) + } + } +} + +class BiCountIfCollector( + private val filter: BiFilter, +) : BiConsumer { + private var _count = 0 + val count: Int get() = _count + + override fun accept( + k: K, + v: V, + ) { + if (filter.filter(k, v)) _count++ + } +} + +class BiAssociateCollector( + size: Int, + private val mapper: BiMapperNotNull>, +) : BiConsumer { + val results: LinkedHashMap = LinkedHashMap(size) + + override fun accept( + k: K, + v: V, + ) { + val pair = mapper.map(k, v) + results[pair.first] = pair.second + } +} + +class BiAssociateNotNullCollector( + size: Int, + private val mapper: BiMapper?>, +) : BiConsumer { + val results: LinkedHashMap = LinkedHashMap(size) + + override fun accept( + k: K, + v: V, + ) { + val pair = mapper.map(k, v) + if (pair != null) { + results[pair.first] = pair.second + } + } +} + +class BiAssociateWithCollector( + size: Int, + private val mapper: BiMapper, +) : BiConsumer { + val results: LinkedHashMap = LinkedHashMap(size) + + override fun accept( + k: K, + v: V, + ) { + results[k] = mapper.map(k, v) + } +} + +class BiAssociateNotNullWithCollector( + size: Int, + private val mapper: BiMapper, +) : BiConsumer { + val results: LinkedHashMap = LinkedHashMap(size) + + override fun accept( + k: K, + v: V, + ) { + val newValue = mapper.map(k, v) + if (newValue != null) { + results[k] = newValue + } + } +} + object CacheCollectors { fun interface BiFilter { fun filter( @@ -30,36 +330,6 @@ object CacheCollectors { ): Boolean } - class BiFilterCollector( - val filter: BiFilter, - ) : BiConsumer { - val results: ArrayList = ArrayList() - - override fun accept( - k: K, - v: V, - ) { - if (filter.filter(k, v)) { - results.add(v) - } - } - } - - class BiFilterUniqueCollector( - val filter: BiFilter, - ) : BiConsumer { - val results: HashSet = HashSet() - - override fun accept( - k: K, - v: V, - ) { - if (filter.filter(k, v)) { - results.add(v) - } - } - } - fun interface BiMapper { fun map( k: K, @@ -74,133 +344,6 @@ object CacheCollectors { ): R } - class BiMapCollector( - val mapper: BiMapper, - ) : BiConsumer { - val results: ArrayList = ArrayList() - - override fun accept( - k: K, - v: V, - ) { - val result = mapper.map(k, v) - if (result != null) { - results.add(result) - } - } - } - - class BiAssociateCollector( - val size: Int, - val mapper: BiMapperNotNull>, - ) : BiConsumer { - val results: LinkedHashMap = LinkedHashMap(size) - - override fun accept( - k: K, - v: V, - ) { - val pair = mapper.map(k, v) - results.put(pair.first, pair.second) - } - } - - class BiAssociateNotNullCollector( - val size: Int, - val mapper: BiMapper?>, - ) : BiConsumer { - val results: LinkedHashMap = LinkedHashMap(size) - - override fun accept( - k: K, - v: V, - ) { - val pair = mapper.map(k, v) - if (pair != null) { - results.put(pair.first, pair.second) - } - } - } - - class BiAssociateWithCollector( - val size: Int, - val mapper: BiMapper, - ) : BiConsumer { - val results: LinkedHashMap = LinkedHashMap(size) - - override fun accept( - k: K, - v: V, - ) { - results.put(k, mapper.map(k, v)) - } - } - - class BiAssociateNotNullWithCollector( - val size: Int, - val mapper: BiMapper, - ) : BiConsumer { - val results: LinkedHashMap = LinkedHashMap(size) - - override fun accept( - k: K, - v: V, - ) { - val newValue = mapper.map(k, v) - if (newValue != null) { - results.put(k, newValue) - } - } - } - - class BiMapUniqueCollector( - val mapper: BiMapper, - ) : BiConsumer { - val results: HashSet = HashSet() - - override fun accept( - k: K, - v: V, - ) { - val result = mapper.map(k, v) - if (result != null) { - results.add(result) - } - } - } - - class BiMapFlattenCollector( - val mapper: BiMapper?>, - ) : BiConsumer { - val results: ArrayList = ArrayList() - - override fun accept( - k: K, - v: V, - ) { - val result = mapper.map(k, v) - if (result != null) { - results.addAll(result) - } - } - } - - class BiMapFlattenUniqueCollector( - val mapper: BiMapper?>, - ) : BiConsumer { - val results: HashSet = HashSet() - - override fun accept( - k: K, - v: V, - ) { - val result = mapper.map(k, v) - if (result != null) { - results.addAll(result) - } - } - } - fun interface BiNotNullMapper { fun map( k: K, @@ -208,19 +351,6 @@ object CacheCollectors { ): R } - class BiNotNullMapCollector( - val mapper: BiNotNullMapper, - ) : BiConsumer { - val results: ArrayList = ArrayList() - - override fun accept( - k: K, - v: V, - ) { - results.add(mapper.map(k, v)) - } - } - fun interface BiSumOf { fun map( k: K, @@ -228,132 +358,10 @@ object CacheCollectors { ): Int } - class BiMaxOfCollector( - val filter: BiFilter, - val comparator: Comparator, - ) : BiConsumer { - var maxK: K? = null - var maxV: V? = null - - override fun accept( - k: K, - v: V, - ) { - if (filter.filter(k, v)) { - if (maxK == null || comparator.compare(v, maxV) > 0) { - maxK = k - maxV = v - } - } - } - } - - class BiSumOfCollector( - val mapper: BiSumOf, - ) : BiConsumer { - var sum = 0 - - override fun accept( - k: K, - v: V, - ) { - sum += mapper.map(k, v) - } - } - fun interface BiSumOfLong { fun map( k: K, v: V, ): Long } - - class BiSumOfLongCollector( - val mapper: BiSumOfLong, - ) : BiConsumer { - var sum = 0L - - override fun accept( - k: K, - v: V, - ) { - sum += mapper.map(k, v) - } - } - - class BiGroupByCollector( - val mapper: BiNotNullMapper, - ) : BiConsumer { - val results = HashMap>() - - override fun accept( - k: K, - v: V, - ) { - val group = mapper.map(k, v) - - val list = results[group] - if (list == null) { - val answer = ArrayList() - answer.add(v) - results[group] = answer - } else { - list.add(v) - } - } - } - - class BiCountByGroupCollector( - val mapper: BiNotNullMapper, - ) : BiConsumer { - val results = HashMap() - - override fun accept( - k: K, - v: V, - ) { - val group = mapper.map(k, v) - - val count = results[group] - if (count == null) { - results[group] = 1 - } else { - results[group] = count + 1 - } - } - } - - class BiSumByGroupCollector( - val mapper: BiNotNullMapper, - val sumOf: BiNotNullMapper, - ) : BiConsumer { - val results = HashMap() - - override fun accept( - k: K, - v: V, - ) { - val group = mapper.map(k, v) - - val sum = results[group] - if (sum == null) { - results[group] = sumOf.map(k, v) - } else { - results[group] = sum + sumOf.map(k, v) - } - } - } - - class BiCountIfCollector( - val filter: BiFilter, - ) : BiConsumer { - var count = 0 - - override fun accept( - k: K, - v: V, - ) { - if (filter.filter(k, v)) count++ - } - } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/utils/CacheOperations.kt b/quartz/src/main/java/com/vitorpamplona/quartz/utils/CacheOperations.kt index c44ff5814..24e057707 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/utils/CacheOperations.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/utils/CacheOperations.kt @@ -28,43 +28,43 @@ interface CacheOperations { fun size(): Int fun filter(consumer: CacheCollectors.BiFilter): List { - val runner = CacheCollectors.BiFilterCollector(consumer) + val runner = BiFilterCollector(consumer) forEach(runner) return runner.results } fun filterIntoSet(consumer: CacheCollectors.BiFilter): Set { - val runner = CacheCollectors.BiFilterUniqueCollector(consumer) + val runner = BiFilterUniqueCollector(consumer) forEach(runner) return runner.results } fun map(consumer: CacheCollectors.BiNotNullMapper): List { - val runner = CacheCollectors.BiNotNullMapCollector(consumer) + val runner = BiNotNullMapCollector(consumer) forEach(runner) return runner.results } fun mapNotNull(consumer: CacheCollectors.BiMapper): List { - val runner = CacheCollectors.BiMapCollector(consumer) + val runner = BiMapCollector(consumer) forEach(runner) return runner.results } fun mapNotNullIntoSet(consumer: CacheCollectors.BiMapper): Set { - val runner = CacheCollectors.BiMapUniqueCollector(consumer) + val runner = BiMapUniqueCollector(consumer) forEach(runner) return runner.results } fun mapFlatten(consumer: CacheCollectors.BiMapper?>): List { - val runner = CacheCollectors.BiMapFlattenCollector(consumer) + val runner = BiMapFlattenCollector(consumer) forEach(runner) return runner.results } fun mapFlattenIntoSet(consumer: CacheCollectors.BiMapper?>): Set { - val runner = CacheCollectors.BiMapFlattenUniqueCollector(consumer) + val runner = BiMapFlattenUniqueCollector(consumer) forEach(runner) return runner.results } @@ -73,31 +73,31 @@ interface CacheOperations { filter: CacheCollectors.BiFilter, comparator: Comparator, ): V? { - val runner = CacheCollectors.BiMaxOfCollector(filter, comparator) + val runner = BiMaxOfCollector(filter, comparator) forEach(runner) return runner.maxV } fun sumOf(consumer: CacheCollectors.BiSumOf): Int { - val runner = CacheCollectors.BiSumOfCollector(consumer) + val runner = BiSumOfCollector(consumer) forEach(runner) return runner.sum } fun sumOfLong(consumer: CacheCollectors.BiSumOfLong): Long { - val runner = CacheCollectors.BiSumOfLongCollector(consumer) + val runner = BiSumOfLongCollector(consumer) forEach(runner) return runner.sum } fun groupBy(consumer: CacheCollectors.BiNotNullMapper): Map> { - val runner = CacheCollectors.BiGroupByCollector(consumer) + val runner = BiGroupByCollector(consumer) forEach(runner) return runner.results } fun countByGroup(consumer: CacheCollectors.BiNotNullMapper): Map { - val runner = CacheCollectors.BiCountByGroupCollector(consumer) + val runner = BiCountByGroupCollector(consumer) forEach(runner) return runner.results } @@ -106,25 +106,25 @@ interface CacheOperations { groupMap: CacheCollectors.BiNotNullMapper, sumOf: CacheCollectors.BiNotNullMapper, ): Map { - val runner = CacheCollectors.BiSumByGroupCollector(groupMap, sumOf) + val runner = BiSumByGroupCollector(groupMap, sumOf) forEach(runner) return runner.results } fun count(consumer: CacheCollectors.BiFilter): Int { - val runner = CacheCollectors.BiCountIfCollector(consumer) + val runner = BiCountIfCollector(consumer) forEach(runner) return runner.count } fun associate(transform: (K, V) -> Pair): Map { - val runner = CacheCollectors.BiAssociateCollector(size(), transform) + val runner = BiAssociateCollector(size(), transform) forEach(runner) return runner.results } fun associateWith(transform: (K, V) -> U?): Map { - val runner = CacheCollectors.BiAssociateWithCollector(size(), transform) + val runner = BiAssociateWithCollector(size(), transform) forEach(runner) return runner.results }