diff --git a/core/src/main/kotlin/ch/kleis/lcaac/core/datasource/DataSourceOperationsBase.kt b/core/src/main/kotlin/ch/kleis/lcaac/core/datasource/DataSourceOperationsBase.kt index 6496d788..0c217106 100644 --- a/core/src/main/kotlin/ch/kleis/lcaac/core/datasource/DataSourceOperationsBase.kt +++ b/core/src/main/kotlin/ch/kleis/lcaac/core/datasource/DataSourceOperationsBase.kt @@ -21,12 +21,6 @@ open class DataSourceOperationsBase( val description = DataSourceDescription(source.location, source.schema) val records = load(description) val filter = source.filter - val reducer = DataExpressionReducer( - dataRegister = Prelude.units(), - dataSourceRegister = DataSourceRegister.empty(), - ops = ops, - sourceOps = this, - ) return records .filter { record -> filter.entries.all { @@ -40,10 +34,6 @@ open class DataSourceOperationsBase( actual == expected } else throw EvaluatorException("invalid matching condition $it") } - }.map { record -> - ERecord( - record.entries.mapValues { reducer.reduce(it.value) } - ) } } diff --git a/core/src/main/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/DataExpressionReducer.kt b/core/src/main/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/DataExpressionReducer.kt index 275b0e15..f6b616f0 100644 --- a/core/src/main/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/DataExpressionReducer.kt +++ b/core/src/main/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/DataExpressionReducer.kt @@ -50,7 +50,7 @@ class DataExpressionReducer( private fun reduceFirstRecordOf(expression: EFirstRecordOf): DataExpression { val dataSource = evalDataSource(expression.dataSource) - return sourceOps.getFirst(dataSource) + return reduceMap(sourceOps.getFirst(dataSource)) } fun reduceDataSource(expression: DataSourceExpression, filter: Map> = emptyMap()): EDataSource { diff --git a/core/src/main/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/LcaExpressionReducer.kt b/core/src/main/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/LcaExpressionReducer.kt index d556db6e..4eb5a067 100644 --- a/core/src/main/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/LcaExpressionReducer.kt +++ b/core/src/main/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/LcaExpressionReducer.kt @@ -85,6 +85,7 @@ class LcaExpressionReducer( is EBlockForEach -> { val ds = dataExpressionReducer.evalDataSource(expression.dataSource) sourceOps.readAll(ds) + .map { dataExpressionReducer.reduce(it) } .flatMap { record -> val reducer = push(mapOf( DataKey(expression.rowRef) to record @@ -110,6 +111,7 @@ class LcaExpressionReducer( is EBlockForEach -> { val ds = dataExpressionReducer.evalDataSource(expression.dataSource) sourceOps.readAll(ds) + .map { dataExpressionReducer.reduce(it) } .flatMap { record -> val reducer = push(mapOf( DataKey(expression.rowRef) to record @@ -135,6 +137,7 @@ class LcaExpressionReducer( is EBlockForEach -> { val ds = dataExpressionReducer.evalDataSource(expression.dataSource) sourceOps.readAll(ds) + .map { dataExpressionReducer.reduce(it) } .flatMap { record -> val reducer = push(mapOf( DataKey(expression.rowRef) to record diff --git a/core/src/test/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/DataExpressionReducerTest.kt b/core/src/test/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/DataExpressionReducerTest.kt index 4cd540a9..37c35166 100644 --- a/core/src/test/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/DataExpressionReducerTest.kt +++ b/core/src/test/kotlin/ch/kleis/lcaac/core/lang/evaluator/reducer/DataExpressionReducerTest.kt @@ -255,7 +255,7 @@ class DataExpressionReducerTest { "mass" to QuantityFixture.oneKilogram ) ) - val record = EFirstRecordOf(EDataSourceRef("source")) + val firstRecordOf = EFirstRecordOf(EDataSourceRef("source")) val reducer = DataExpressionReducer( DataRegister.empty(), DataSourceRegister.from(mapOf( @@ -264,12 +264,16 @@ class DataExpressionReducerTest { ops, sourceOps, ) - val expected = mockk>() + val expected = ERecord( + mapOf( + "mass" to QuantityFixture.twoKilograms + ) + ) val dataSourceValue = with(ToValue(ops)) { dataSource.toValue() } every { sourceOps.getFirst(dataSourceValue) } returns expected // when - val actual = reducer.reduce(record) + val actual = reducer.reduce(firstRecordOf) // then assertEquals(expected, actual)