From 533d8b18f063b6df71dbd4f3c5217c3ac79b90e6 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Sat, 16 Aug 2025 10:45:37 +0100 Subject: [PATCH] Remove duplicate functionality from Cache implementations and use instead common methods in CacheOperations utility class Create override for forEach and size as they are needed internally and do slightly different things --- .../vitorpamplona/quartz/utils/LargeCache.kt | 156 +----------------- .../quartz/utils/LargeSoftCache.kt | 156 +----------------- 2 files changed, 8 insertions(+), 304 deletions(-) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/utils/LargeCache.kt b/quartz/src/main/java/com/vitorpamplona/quartz/utils/LargeCache.kt index 4254d94bf..962932c9a 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/utils/LargeCache.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/utils/LargeCache.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.quartz.utils import java.util.concurrent.ConcurrentSkipListMap import java.util.function.BiConsumer -class LargeCache { +class LargeCache : CacheOperations { private val cache = ConcurrentSkipListMap() fun keys() = cache.keys @@ -34,7 +34,7 @@ class LargeCache { fun remove(key: K) = cache.remove(key) - fun size() = cache.size + override fun size() = cache.size fun isEmpty() = cache.isEmpty() @@ -76,155 +76,7 @@ class LargeCache { } } - fun forEach(consumer: BiConsumer) { - innerForEach(consumer) - } - - fun filter(consumer: CacheCollectors.BiFilter): List { - val runner = CacheCollectors.BiFilterCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun filterIntoSet(consumer: CacheCollectors.BiFilter): Set { - val runner = CacheCollectors.BiFilterUniqueCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun map(consumer: CacheCollectors.BiNotNullMapper): List { - val runner = CacheCollectors.BiNotNullMapCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun mapNotNull(consumer: CacheCollectors.BiMapper): List { - val runner = CacheCollectors.BiMapCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun mapNotNullIntoSet(consumer: CacheCollectors.BiMapper): Set { - val runner = CacheCollectors.BiMapUniqueCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun mapFlatten(consumer: CacheCollectors.BiMapper?>): List { - val runner = CacheCollectors.BiMapFlattenCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun mapFlattenIntoSet(consumer: CacheCollectors.BiMapper?>): Set { - val runner = CacheCollectors.BiMapFlattenUniqueCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun maxOrNullOf( - filter: CacheCollectors.BiFilter, - comparator: Comparator, - ): V? { - val runner = CacheCollectors.BiMaxOfCollector(filter, comparator) - innerForEach(runner) - return runner.maxV - } - - fun sumOf(consumer: CacheCollectors.BiSumOf): Int { - val runner = CacheCollectors.BiSumOfCollector(consumer) - innerForEach(runner) - return runner.sum - } - - fun sumOfLong(consumer: CacheCollectors.BiSumOfLong): Long { - val runner = CacheCollectors.BiSumOfLongCollector(consumer) - innerForEach(runner) - return runner.sum - } - - fun groupBy(consumer: CacheCollectors.BiNotNullMapper): Map> { - val runner = CacheCollectors.BiGroupByCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun countByGroup(consumer: CacheCollectors.BiNotNullMapper): Map { - val runner = CacheCollectors.BiCountByGroupCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun sumByGroup( - groupMap: CacheCollectors.BiNotNullMapper, - sumOf: CacheCollectors.BiNotNullMapper, - ): Map { - val runner = CacheCollectors.BiSumByGroupCollector(groupMap, sumOf) - innerForEach(runner) - return runner.results - } - - fun count(consumer: CacheCollectors.BiFilter): Int { - val runner = CacheCollectors.BiCountIfCollector(consumer) - innerForEach(runner) - return runner.count - } - - fun associate(transform: (K, V) -> Pair): Map { - val runner = CacheCollectors.BiAssociateCollector(size(), transform) - innerForEach(runner) - return runner.results - } - - fun associateNotNull(transform: (K, V) -> Pair?): Map { - val runner = CacheCollectors.BiAssociateNotNullCollector(size(), transform) - innerForEach(runner) - return runner.results - } - - fun associateWith(transform: (K, V) -> U?): Map { - val runner = CacheCollectors.BiAssociateWithCollector(size(), transform) - innerForEach(runner) - return runner.results - } - - fun associateNotNullWith(transform: (K, V) -> U): Map { - val runner = CacheCollectors.BiAssociateNotNullWithCollector(size(), transform) - innerForEach(runner) - return runner.results - } - - private fun innerForEach(runner: BiConsumer) { - cache.forEach(runner) - } - - fun joinToString( - separator: CharSequence = ", ", - prefix: CharSequence = "", - postfix: CharSequence = "", - limit: Int = -1, - truncated: CharSequence = "...", - transform: ((K, V) -> CharSequence)? = null, - ): String { - val buffer = StringBuilder() - buffer.append(prefix) - var count = 0 - forEach { key, value -> - val str = if (transform != null) transform(key, value) else "" - if (str.isNotEmpty()) { - if (++count > 1) buffer.append(separator) - if (limit < 0 || count <= limit) { - when { - transform != null -> buffer.append(str) - else -> buffer.append("$key $value") - } - } else { - return@forEach - } - } - } - if (limit >= 0 && count > limit) buffer.append(truncated) - buffer.append(postfix) - return buffer.toString() + override fun forEach(consumer: BiConsumer) { + cache.forEach(consumer) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/utils/LargeSoftCache.kt b/quartz/src/main/java/com/vitorpamplona/quartz/utils/LargeSoftCache.kt index 6f1c90c55..17f9ba265 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/utils/LargeSoftCache.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/utils/LargeSoftCache.kt @@ -24,7 +24,7 @@ import java.lang.ref.WeakReference import java.util.concurrent.ConcurrentSkipListMap import java.util.function.BiConsumer -class LargeSoftCache { +class LargeSoftCache : CacheOperations { private val cache = ConcurrentSkipListMap>() fun keys() = cache.keys @@ -43,7 +43,7 @@ class LargeSoftCache { fun remove(key: K) = cache.remove(key) - fun size() = cache.size + override fun size() = cache.size fun isEmpty() = cache.isEmpty() @@ -122,156 +122,8 @@ class LargeSoftCache { println("Cache cleanup completed. Remaining size: ${cache.size}") } - fun forEach(consumer: BiConsumer) { - innerForEach(consumer) - } - - fun filter(consumer: CacheCollectors.BiFilter): List { - val runner = CacheCollectors.BiFilterCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun filterIntoSet(consumer: CacheCollectors.BiFilter): Set { - val runner = CacheCollectors.BiFilterUniqueCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun map(consumer: CacheCollectors.BiNotNullMapper): List { - val runner = CacheCollectors.BiNotNullMapCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun mapNotNull(consumer: CacheCollectors.BiMapper): List { - val runner = CacheCollectors.BiMapCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun mapNotNullIntoSet(consumer: CacheCollectors.BiMapper): Set { - val runner = CacheCollectors.BiMapUniqueCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun mapFlatten(consumer: CacheCollectors.BiMapper?>): List { - val runner = CacheCollectors.BiMapFlattenCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun mapFlattenIntoSet(consumer: CacheCollectors.BiMapper?>): Set { - val runner = CacheCollectors.BiMapFlattenUniqueCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun maxOrNullOf( - filter: CacheCollectors.BiFilter, - comparator: Comparator, - ): V? { - val runner = CacheCollectors.BiMaxOfCollector(filter, comparator) - innerForEach(runner) - return runner.maxV - } - - fun sumOf(consumer: CacheCollectors.BiSumOf): Int { - val runner = CacheCollectors.BiSumOfCollector(consumer) - innerForEach(runner) - return runner.sum - } - - fun sumOfLong(consumer: CacheCollectors.BiSumOfLong): Long { - val runner = CacheCollectors.BiSumOfLongCollector(consumer) - innerForEach(runner) - return runner.sum - } - - fun groupBy(consumer: CacheCollectors.BiNotNullMapper): Map> { - val runner = CacheCollectors.BiGroupByCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun countByGroup(consumer: CacheCollectors.BiNotNullMapper): Map { - val runner = CacheCollectors.BiCountByGroupCollector(consumer) - innerForEach(runner) - return runner.results - } - - fun sumByGroup( - groupMap: CacheCollectors.BiNotNullMapper, - sumOf: CacheCollectors.BiNotNullMapper, - ): Map { - val runner = CacheCollectors.BiSumByGroupCollector(groupMap, sumOf) - innerForEach(runner) - return runner.results - } - - fun count(consumer: CacheCollectors.BiFilter): Int { - val runner = CacheCollectors.BiCountIfCollector(consumer) - innerForEach(runner) - return runner.count - } - - fun associate(transform: (K, V) -> Pair): Map { - val runner = CacheCollectors.BiAssociateCollector(size(), transform) - innerForEach(runner) - return runner.results - } - - fun associateNotNull(transform: (K, V) -> Pair?): Map { - val runner = CacheCollectors.BiAssociateNotNullCollector(size(), transform) - innerForEach(runner) - return runner.results - } - - fun associateWith(transform: (K, V) -> U?): Map { - val runner = CacheCollectors.BiAssociateWithCollector(size(), transform) - innerForEach(runner) - return runner.results - } - - fun associateNotNullWith(transform: (K, V) -> U): Map { - val runner = CacheCollectors.BiAssociateNotNullWithCollector(size(), transform) - innerForEach(runner) - return runner.results - } - - private fun innerForEach(runner: BiConsumer) { - cache.forEach(BiConsumerWrapper(this, runner)) - } - - fun joinToString( - separator: CharSequence = ", ", - prefix: CharSequence = "", - postfix: CharSequence = "", - limit: Int = -1, - truncated: CharSequence = "...", - transform: ((K, V) -> CharSequence)? = null, - ): String { - val buffer = StringBuilder() - buffer.append(prefix) - var count = 0 - forEach { key, value -> - val str = if (transform != null) transform(key, value) else "" - if (str.isNotEmpty()) { - if (++count > 1) buffer.append(separator) - if (limit < 0 || count <= limit) { - when { - transform != null -> buffer.append(str) - else -> buffer.append("$key $value") - } - } else { - return@forEach - } - } - } - if (limit >= 0 && count > limit) buffer.append(truncated) - buffer.append(postfix) - return buffer.toString() + override fun forEach(consumer: BiConsumer) { + cache.forEach(BiConsumerWrapper(this, consumer)) } class BiConsumerWrapper(