Skip to content

Commit 3437608

Browse files
authored
Merge pull request #253 from modelix/MODELIX-552
MODELIX-552 ClassCastException in .mapIfNotNull
2 parents 1a45e64 + cf51cc9 commit 3437608

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+90
-399
lines changed

modelql-core/src/commonMain/kotlin/org/modelix/modelql/core/AndOperatorStep.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import kotlinx.serialization.Serializable
1919
import kotlinx.serialization.modules.SerializersModule
2020
import kotlinx.serialization.serializer
2121

22-
class AndOperatorStep() : MonoTransformingStep<IZipOutput<Boolean>, Boolean>() {
22+
class AndOperatorStep() : SimpleMonoTransformingStep<IZipOutput<Boolean>, Boolean>() {
2323

2424
override fun transform(evaluationContext: QueryEvaluationContext, input: IZipOutput<Boolean>): Boolean {
2525
return input.values.all { it == true }

modelql-core/src/commonMain/kotlin/org/modelix/modelql/core/CollectionSizeStep.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import kotlinx.serialization.Serializable
1919
import kotlinx.serialization.modules.SerializersModule
2020
import kotlinx.serialization.serializer
2121

22-
class CollectionSizeStep : MonoTransformingStep<Collection<*>, Int>() {
22+
class CollectionSizeStep : SimpleMonoTransformingStep<Collection<*>, Int>() {
2323
override fun getOutputSerializer(serializersModule: SerializersModule): KSerializer<out IStepOutput<Int>> {
2424
return serializersModule.serializer<Int>().stepOutputSerializer(this)
2525
}

modelql-core/src/commonMain/kotlin/org/modelix/modelql/core/CollectorStep.kt

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,6 @@ class ListCollectorStep<E> : CollectorStep<E, List<E>>() {
9999
val outputList = inputList.map { it.value }
100100
return CollectorStepOutput(inputList, inputList, outputList)
101101
}
102-
override fun aggregate(input: Sequence<IStepOutput<E>>): IStepOutput<List<E>> {
103-
val inputList = input.toList()
104-
val outputList = inputList.map { it.value }
105-
return CollectorStepOutput(inputList, inputList, outputList)
106-
}
107102

108103
@Serializable
109104
@SerialName("toList")
@@ -132,12 +127,6 @@ class SetCollectorStep<E> : CollectorStep<E, Set<E>>() {
132127
input.collect { if (outputSet.add(it.value)) inputList.add(it) }
133128
return CollectorStepOutput(inputList, inputList, outputSet)
134129
}
135-
override fun aggregate(input: Sequence<IStepOutput<E>>): IStepOutput<Set<E>> {
136-
val inputList = ArrayList<IStepOutput<E>>()
137-
val outputSet = HashSet<E>()
138-
input.forEach { if (outputSet.add(it.value)) inputList.add(it) }
139-
return CollectorStepOutput(inputList, inputList, outputSet)
140-
}
141130

142131
@Serializable
143132
@SerialName("toSet")
@@ -173,19 +162,6 @@ class MapCollectorStep<K, V> : CollectorStep<IZip2Output<Any?, K, V>, Map<K, V>>
173162
val outputMap: Map<K, V> = internalMap.mapValues { it.value.value }
174163
return CollectorStepOutput(inputList, internalMap, outputMap)
175164
}
176-
override fun aggregate(input: Sequence<IStepOutput<IZip2Output<Any?, K, V>>>): IStepOutput<Map<K, V>> {
177-
val inputList = ArrayList<IStepOutput<IZip2Output<Any?, K, V>>>()
178-
val internalMap = HashMap<K, IStepOutput<V>>()
179-
input.forEach {
180-
val zipStepOutput = it as ZipStepOutput<IZip2Output<Any?, K, V>, Any?>
181-
if (!internalMap.containsKey(it.value.first)) {
182-
inputList.add(it)
183-
internalMap.put(zipStepOutput.values[0].value as K, zipStepOutput.values[1] as IStepOutput<V>)
184-
}
185-
}
186-
val outputMap: Map<K, V> = internalMap.mapValues { it.value.value }
187-
return CollectorStepOutput(inputList, internalMap, outputMap)
188-
}
189165

190166
@Serializable
191167
@SerialName("toMap")

modelql-core/src/commonMain/kotlin/org/modelix/modelql/core/ConstantSourceStep.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,6 @@ open class ConstantSourceStep<E>(val element: E, val type: KType) : ProducingSte
5656
override fun requiresWriteAccess(): Boolean = false
5757
override fun needsCoroutineScope(): Boolean = false
5858

59-
override fun createSequence(evaluationContext: QueryEvaluationContext, queryInput: Sequence<Any?>): Sequence<E> {
60-
return sequenceOf(element)
61-
}
62-
63-
override fun evaluate(evaluationContext: QueryEvaluationContext, queryInput: Any?): Optional<E> {
64-
return Optional.of(element)
65-
}
66-
6759
override fun evaluateStatically(): E {
6860
return element
6961
}
@@ -172,3 +164,5 @@ fun String?.asMono() = createConstantSourceStep(this)
172164

173165
@JvmName("asMono_nullable")
174166
fun Set<String?>.asMono() = createConstantSourceStep(this)
167+
168+
inline fun <reified T> nullMono(): IMonoStep<T?> = ConstantSourceStep<T?>(null, typeOf<T?>())

modelql-core/src/commonMain/kotlin/org/modelix/modelql/core/CountingStep.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ class CountingStep() : AggregationStep<Any?, Int>() {
2525
return input.count().asStepOutput(this)
2626
}
2727

28-
override fun aggregate(input: Sequence<IStepOutput<Any?>>): IStepOutput<Int> = input.count().asStepOutput(this)
29-
3028
override fun createDescriptor(context: QueryGraphDescriptorBuilder) = CountDescriptor()
3129

3230
@Serializable

modelql-core/src/commonMain/kotlin/org/modelix/modelql/core/EmptyStringIfNullStep.kt

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,34 @@
1313
*/
1414
package org.modelix.modelql.core
1515

16+
import kotlinx.coroutines.flow.map
1617
import kotlinx.serialization.KSerializer
1718
import kotlinx.serialization.SerialName
1819
import kotlinx.serialization.Serializable
1920
import kotlinx.serialization.modules.SerializersModule
2021
import kotlinx.serialization.serializer
2122

2223
class EmptyStringIfNullStep : MonoTransformingStep<String?, String>() {
24+
2325
override fun getOutputSerializer(serializersModule: SerializersModule): KSerializer<out IStepOutput<String>> {
24-
return serializersModule.serializer<String>().stepOutputSerializer(this)
26+
val inputSerializer: KSerializer<IStepOutput<String?>> = getProducer().getOutputSerializer(serializersModule).upcast()
27+
return MultiplexedOutputSerializer<String>(
28+
this,
29+
listOf<KSerializer<IStepOutput<String>>>(
30+
inputSerializer as KSerializer<IStepOutput<String>>,
31+
serializersModule.serializer<String>().stepOutputSerializer(this).upcast(),
32+
),
33+
)
2534
}
2635

27-
override fun transform(evaluationContext: QueryEvaluationContext, input: String?): String {
28-
return input ?: ""
36+
override fun createFlow(input: StepFlow<String?>, context: IFlowInstantiationContext): StepFlow<String> {
37+
return input.map {
38+
if (it.value == null) {
39+
MultiplexedOutput(1, "".asStepOutput(this))
40+
} else {
41+
MultiplexedOutput(0, it.upcast())
42+
}
43+
}
2944
}
3045

3146
override fun createDescriptor(context: QueryGraphDescriptorBuilder): StepDescriptor {

modelql-core/src/commonMain/kotlin/org/modelix/modelql/core/FilteringStep.kt

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,6 @@ class FilteringStep<E>(val condition: MonoUnboundQuery<E, Boolean?>) : Transform
4343
// return input.filter { condition.evaluate(it.value).presentAndEqual(true) }
4444
}
4545

46-
override fun createSequence(evaluationContext: QueryEvaluationContext, queryInput: Sequence<Any?>): Sequence<E> {
47-
return getProducer().createSequence(evaluationContext, queryInput).filter {
48-
condition.evaluate(
49-
evaluationContext,
50-
it,
51-
).presentAndEqual(true)
52-
}
53-
}
54-
5546
override fun getOutputSerializer(serializersModule: SerializersModule): KSerializer<out IStepOutput<E>> {
5647
return getProducer().getOutputSerializer(serializersModule)
5748
}

modelql-core/src/commonMain/kotlin/org/modelix/modelql/core/FirstElementStep.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,6 @@ class FirstElementStep<E>() : MonoTransformingStep<E, E>() {
2828

2929
override fun requiresSingularQueryInput(): Boolean = true
3030

31-
override fun transform(evaluationContext: QueryEvaluationContext, input: IStepOutput<E>): IStepOutput<E> {
32-
return input
33-
}
34-
35-
override fun transform(evaluationContext: QueryEvaluationContext, input: E): E {
36-
return input
37-
}
38-
3931
override fun toString(): String {
4032
return getProducer().toString() + ".first()"
4133
}

modelql-core/src/commonMain/kotlin/org/modelix/modelql/core/FirstOrNullStep.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ class FirstOrNullStep<E>() : AggregationStep<E, E?>() {
2626
?: MultiplexedOutput(1, null.asStepOutput(this))
2727
}
2828

29-
override fun aggregate(input: Sequence<IStepOutput<E>>): IStepOutput<E?> {
30-
return input.firstOrNull() ?: null.asStepOutput(this)
31-
}
32-
3329
override fun toString(): String {
3430
return "${getProducer()}.firstOrNull()"
3531
}

modelql-core/src/commonMain/kotlin/org/modelix/modelql/core/FlatMapStep.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,6 @@ class FlatMapStep<In, Out>(val query: FluxUnboundQuery<In, Out>) : TransformingS
3636
return input.flatMapConcat { query.asFlow(context.evaluationContext, it) }
3737
}
3838

39-
override fun createSequence(evaluationContext: QueryEvaluationContext, queryInput: Sequence<Any?>): Sequence<Out> {
40-
return query.asSequence(evaluationContext, getProducer().createSequence(evaluationContext, queryInput))
41-
}
42-
4339
override fun getOutputSerializer(serializersModule: SerializersModule): KSerializer<out IStepOutput<Out>> {
4440
return query.outputStep.getOutputSerializer(serializersModule)
4541
}

0 commit comments

Comments
 (0)