From 3f03bd952f452872e2f07d142ca8e950ef2d51dc Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 25 Sep 2024 11:57:54 +0200 Subject: [PATCH] [jOOQ/jOOQ#17363] Add Records.nullOnAllNull and Records.nullOnAnyNull utilities --- jOOQ/src/main/java/org/jooq/Records.java | 46 ++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/jOOQ/src/main/java/org/jooq/Records.java b/jOOQ/src/main/java/org/jooq/Records.java index 31d0669bf1..3b95af3c40 100644 --- a/jOOQ/src/main/java/org/jooq/Records.java +++ b/jOOQ/src/main/java/org/jooq/Records.java @@ -60,6 +60,8 @@ import java.util.stream.Collectors; import org.jooq.exception.InvalidResultException; import org.jooq.impl.Internal; +import org.jetbrains.annotations.Nullable; + /** * Common utilities related to {@link Record} types and constructing * {@link RecordMapper}. @@ -637,6 +639,50 @@ public final class Records { ); } + /** + * Create a {@link RecordMapper} that turns {@link Record} values containing + * all null values into a null record value. + *

+ * This is useful, for example, when nesting records from implicit path + * joins following optional foreign keys, where a + * (NULL, NULL, …, NULL) record isn't so useful. + */ + public static final RecordMapper nullOnAllNull() { + return r -> { + if (r == null) + return null; + + int size = r.size(); + for (int i = 0; i < size; i++) + if (r.get(i) != null) + return r; + + return null; + }; + } + + /** + * Create a {@link RecordMapper} that turns {@link Record} values containing + * any null value into a null record value. + *

+ * This is useful, for example, when nesting records from implicit path + * joins following optional foreign keys, where a + * (NULL, NULL, …, NULL) record isn't so useful. + */ + public static final RecordMapper nullOnAnyNull() { + return r -> { + if (r == null) + return null; + + int size = r.size(); + for (int i = 0; i < size; i++) + if (r.get(i) == null) + return null; + + return r; + }; + } + /**