Simplified task builder.
This commit is contained in:
parent
55db973cd6
commit
58e65ba71e
@ -48,6 +48,14 @@ class JoinGroupBuilder<T : Any, R : Any>(val actionMeta: Meta) {
|
||||
}
|
||||
}
|
||||
|
||||
fun group(groupName: String, filter: (Name, Data<T>) -> Boolean, action: JoinGroup<T, R>.() -> Unit) {
|
||||
groupRules += { node ->
|
||||
listOf(
|
||||
JoinGroup<T, R>(groupName, node.filter(filter)).apply(action)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply transformation to the whole node
|
||||
*/
|
||||
@ -99,3 +107,5 @@ class JoinAction<T : Any, R : Any>(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
operator fun <T> Map<Name,T>.get(name:String) = get(name.toName())
|
||||
|
@ -127,7 +127,10 @@ class KTaskBuilder(val name: String) {
|
||||
|
||||
class TaskEnv(val name: Name, val meta: Meta, val context: Context)
|
||||
|
||||
inline fun <reified T : Any, reified R : Any> pipeAction(
|
||||
/**
|
||||
* A customized pipe action with ability to change meta and name
|
||||
*/
|
||||
inline fun <reified T : Any, reified R : Any> customPipe(
|
||||
from: String = "",
|
||||
to: String = "",
|
||||
crossinline block: PipeBuilder<T, R>.(Context) -> Unit
|
||||
@ -141,6 +144,9 @@ class KTaskBuilder(val name: String) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A simple pipe action without changing meta or name
|
||||
*/
|
||||
inline fun <reified T : Any, reified R : Any> pipe(
|
||||
from: String = "",
|
||||
to: String = "",
|
||||
@ -152,6 +158,7 @@ class KTaskBuilder(val name: String) {
|
||||
inputType = T::class,
|
||||
outputType = R::class
|
||||
) {
|
||||
//TODO automatically append task meta
|
||||
result = { data ->
|
||||
TaskEnv(name, meta, context).block(data)
|
||||
}
|
||||
@ -159,7 +166,10 @@ class KTaskBuilder(val name: String) {
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <reified T : Any, reified R : Any> joinAction(
|
||||
/**
|
||||
* Join elements in gathered data by multiple groups
|
||||
*/
|
||||
inline fun <reified T : Any, reified R : Any> joinByGroup(
|
||||
from: String = "",
|
||||
to: String = "",
|
||||
crossinline block: JoinGroupBuilder<T, R>.(Context) -> Unit
|
||||
@ -172,6 +182,9 @@ class KTaskBuilder(val name: String) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Join all elemlents in gathered data matching input type
|
||||
*/
|
||||
inline fun <reified T : Any, reified R : Any> join(
|
||||
from: String = "",
|
||||
to: String = "",
|
||||
@ -183,7 +196,7 @@ class KTaskBuilder(val name: String) {
|
||||
inputType = T::class,
|
||||
outputType = R::class,
|
||||
action = {
|
||||
result(actionMeta[TaskModel.MODEL_TARGET_KEY]?.string ?: "@anonimous") { data ->
|
||||
result(actionMeta[TaskModel.MODEL_TARGET_KEY]?.string ?: "@anonymous") { data ->
|
||||
TaskEnv(name, meta, context).block(data)
|
||||
}
|
||||
}
|
||||
@ -191,7 +204,10 @@ class KTaskBuilder(val name: String) {
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <reified T : Any, reified R : Any> splitAction(
|
||||
/**
|
||||
* Split each element in gathered data into fixed number of fragments
|
||||
*/
|
||||
inline fun <reified T : Any, reified R : Any> split(
|
||||
from: String = "",
|
||||
to: String = "",
|
||||
crossinline block: SplitBuilder<T, R>.(Context) -> Unit
|
||||
@ -211,7 +227,7 @@ class KTaskBuilder(val name: String) {
|
||||
this.descriptor = NodeDescriptor.build(transform)
|
||||
}
|
||||
|
||||
fun build(): GenericTask<Any> =
|
||||
internal fun build(): GenericTask<Any> =
|
||||
GenericTask(name, Any::class, descriptor ?: NodeDescriptor.empty(), modelTransform) {
|
||||
val workspace = this
|
||||
{ data ->
|
||||
@ -244,4 +260,6 @@ fun task(name: String, builder: KTaskBuilder.() -> Unit): GenericTask<Any> {
|
||||
|
||||
fun WorkspaceBuilder.task(name: String, builder: KTaskBuilder.() -> Unit) {
|
||||
task(KTaskBuilder(name).apply(builder).build())
|
||||
}
|
||||
}
|
||||
|
||||
//TODO add delegates to build gradle-like tasks
|
@ -33,6 +33,35 @@ class SimpleWorkspaceTest {
|
||||
data.values.sum()
|
||||
}
|
||||
}
|
||||
|
||||
task("average") {
|
||||
model {
|
||||
allData()
|
||||
}
|
||||
joinByGroup<Int, Double> { context ->
|
||||
group("even", filter = { name, data -> name.toString().toInt() % 2 == 0 }) {
|
||||
result { data ->
|
||||
context.logger.info { "Starting even" }
|
||||
data.values.average()
|
||||
}
|
||||
}
|
||||
group("odd", filter = { name, data -> name.toString().toInt() % 2 == 1 }) {
|
||||
result { data ->
|
||||
context.logger.info { "Starting odd" }
|
||||
data.values.average()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
task("delta"){
|
||||
model{
|
||||
dependsOn("average")
|
||||
}
|
||||
join<Double,Double> {data->
|
||||
data["even"]!! - data["odd"]!!
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
|
Loading…
Reference in New Issue
Block a user