From 7d034fdc0effc49b8349d7d7794a730a4790fcc2 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 28 Feb 2020 12:35:52 +0100 Subject: [PATCH] [jOOQ/jOOQ#9900] Add TransactionalRunnable.of(TransactionalRunnable...) to compose nested transactions --- .../java/org/jooq/TransactionalCallable.java | 50 +++++++++++++++++++ .../java/org/jooq/TransactionalRunnable.java | 26 ++++++++++ 2 files changed, 76 insertions(+) diff --git a/jOOQ/src/main/java/org/jooq/TransactionalCallable.java b/jOOQ/src/main/java/org/jooq/TransactionalCallable.java index b66727f3e8..d1c358a1f8 100644 --- a/jOOQ/src/main/java/org/jooq/TransactionalCallable.java +++ b/jOOQ/src/main/java/org/jooq/TransactionalCallable.java @@ -37,6 +37,10 @@ */ package org.jooq; +import java.util.Arrays; +import java.util.Collection; +import java.util.stream.Collector; + /** * An FunctionalInterface that wraps transactional code. *

@@ -71,4 +75,50 @@ public interface TransactionalCallable { * before executing this TransactionalCallable. */ T run(Configuration configuration) throws Throwable; + + + + /** + * Wrap a set of nested {@link TransactionalCallable} objects in a single + * global {@link TransactionalCallable}, returning the last callable's + * result. + */ + @SafeVarargs + static TransactionalCallable of(TransactionalCallable... callables) { + return of(Arrays.asList(callables)); + } + + /** + * Wrap a set of nested {@link TransactionalCallable} objects in a single + * global {@link TransactionalCallable}, returning the last callable's + * result. + */ + static TransactionalCallable of(Collection> callables) { + return configuration -> { + T result = null; + + for (TransactionalCallable callable : callables) + result = configuration.dsl().transactionResult(callable); + + return result; + }; + } + + /** + * Wrap a set of nested {@link TransactionalCallable} objects in a single + * global {@link TransactionalCallable}, collecting the callables' results. + */ + static TransactionalCallable of(TransactionalCallable[] callables, Collector collector) { + return of(Arrays.asList(callables), collector); + } + + /** + * Wrap a set of nested {@link TransactionalCallable} objects in a single + * global {@link TransactionalCallable}, collecting the callables' results. + */ + static TransactionalCallable of(Collection> callables, Collector collector) { + return configuration -> callables.stream().map(configuration.dsl()::transactionResult).collect(collector); + } + + } diff --git a/jOOQ/src/main/java/org/jooq/TransactionalRunnable.java b/jOOQ/src/main/java/org/jooq/TransactionalRunnable.java index 0eb34b27fc..fb65f5e746 100644 --- a/jOOQ/src/main/java/org/jooq/TransactionalRunnable.java +++ b/jOOQ/src/main/java/org/jooq/TransactionalRunnable.java @@ -37,6 +37,9 @@ */ package org.jooq; +import java.util.Arrays; +import java.util.Collection; + /** * An FunctionalInterface that wraps transactional code. *

@@ -70,4 +73,27 @@ public interface TransactionalRunnable { * before executing this TransactionalRunnable. */ void run(Configuration configuration) throws Throwable; + + + + /** + * Wrap a set of nested {@link TransactionalRunnable} objects in a single + * global {@link TransactionalRunnable}. + */ + static TransactionalRunnable of(TransactionalRunnable... runnables) { + return of(Arrays.asList(runnables)); + } + + /** + * Wrap a set of nested {@link TransactionalRunnable} objects in a single + * global {@link TransactionalRunnable}. + */ + static TransactionalRunnable of(Collection runnables) { + return configuration -> { + for (TransactionalRunnable runnable : runnables) + configuration.dsl().transaction(runnable); + }; + } + + }