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; + }; + } + /**