From 592f911db7a8793d4e7e1f38c35071287e4edec6 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 1 Nov 2019 14:41:16 +0300 Subject: [PATCH] Changed map and reduce action API to include both meta from data and meta from task/action --- .../kotlin/hep/dataforge/data/MapAction.kt | 27 +++++++++++++------ .../kotlin/hep/dataforge/data/ReduceAction.kt | 15 ++++++----- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/MapAction.kt b/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/MapAction.kt index b184a2a8..ea24ca77 100644 --- a/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/MapAction.kt +++ b/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/MapAction.kt @@ -1,16 +1,19 @@ package hep.dataforge.data -import hep.dataforge.meta.* +import hep.dataforge.meta.Meta +import hep.dataforge.meta.MetaBuilder +import hep.dataforge.meta.builder +import hep.dataforge.meta.seal import hep.dataforge.names.Name import kotlin.reflect.KClass -class ActionEnv(val name: Name, val meta: Meta) +data class ActionEnv(val name: Name, val actionMeta: Meta, val meta: Meta) /** * Action environment */ -class MapActionBuilder(var name: Name, var meta: MetaBuilder) { +class MapActionBuilder(var name: Name, var meta: MetaBuilder, val actionMeta: Meta) { lateinit var result: suspend ActionEnv.(T) -> R /** @@ -33,16 +36,24 @@ class MapAction( return DataNode.invoke(outputType) { node.dataSequence().forEach { (name, data) -> - //merging data meta with action meta (data meta is primary) - val oldMeta = meta.builder().apply { update(data.meta) } - // creating environment from old meta and name - val env = ActionEnv(name, oldMeta) + /* + * Creating a new environment for action using **old** name, old meta and task meta + */ + val env = ActionEnv(name, meta, data.meta) + //applying transformation from builder - val builder = MapActionBuilder(name, oldMeta).apply(block) + val builder = MapActionBuilder( + name, + data.meta.builder(), // using data meta + meta + ).apply(block) + //getting new name val newName = builder.name + //getting new meta val newMeta = builder.meta.seal() + val newData = data.map(outputType, meta = newMeta) { builder.result(env, it) } //setting the data node this[newName] = newData diff --git a/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/ReduceAction.kt b/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/ReduceAction.kt index 48738452..1ce6d3c2 100644 --- a/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/ReduceAction.kt +++ b/dataforge-data/src/commonMain/kotlin/hep/dataforge/data/ReduceAction.kt @@ -1,9 +1,7 @@ package hep.dataforge.data -import hep.dataforge.meta.Laminate import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaBuilder -import hep.dataforge.meta.builder import hep.dataforge.names.Name import hep.dataforge.names.toName import kotlin.reflect.KClass @@ -84,15 +82,20 @@ class ReduceAction( return DataNode.invoke(outputType) { ReduceGroupBuilder(meta).apply(action).buildGroups(node).forEach { group -> - val laminate = Laminate(group.meta, meta) + //val laminate = Laminate(group.meta, meta) val dataMap = group.node.dataSequence().associate { it } - val groupName: String = group.name; + val groupName: String = group.name - val env = ActionEnv(groupName.toName(), laminate.builder()) + val groupMeta = group.meta - val res: DynamicData = dataMap.reduce(outputType, meta = laminate) { group.result.invoke(env, it) } + val env = ActionEnv(groupName.toName(), meta, groupMeta) + + val res: DynamicData = dataMap.reduce( + outputType, + meta = groupMeta + ) { group.result.invoke(env, it) } set(env.name, res) }