From 9db3cf002f10d983317ea27409240ad09468f691 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 24 Mar 2021 10:01:13 +0100 Subject: [PATCH] [jOOQ/jOOQ#11700] Add support for ResultQuery.getRecordType() This allows for using selectFrom() and get UpdatableRecords (which can't be stored yet, but at least they have getters / setters). --- jOOQ/src/main/java/org/jooq/impl/Flow.java | 29 ++++++++++++++++------ 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Flow.java b/jOOQ/src/main/java/org/jooq/impl/Flow.java index 13e5ed28cc..46fa6f81de 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Flow.java +++ b/jOOQ/src/main/java/org/jooq/impl/Flow.java @@ -37,9 +37,12 @@ */ package org.jooq.impl; +import static org.jooq.impl.Tools.recordFactory; + import java.sql.SQLException; import java.util.ArrayDeque; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Supplier; import org.jooq.Cursor; import org.jooq.Field; @@ -112,26 +115,38 @@ final class Flow { s.request(1); } + @SuppressWarnings("unchecked") @Override public void onNext(io.r2dbc.spi.Result r) { r.map((row, m) -> { // TODO: Cache this getFields() call - Field[] fields = null; + Field[] fields; try { fields = query.getFields(null); } + + // TODO: Can this happen? If so, trigger onError() correctly catch (SQLException ignore) { throw new DataAccessException("", ignore); } - R record = (R) query.configuration().dsl().newRecord(fields); + // TODO: This call is duplicated from CursorImpl and related classes. + // Refactor this call to make sure code is re-used, especially when + // ExecuteListener lifecycle management is implemented + RecordDelegate delegate = Tools.newRecord(true, (Supplier) recordFactory(query.getRecordType(), Tools.row0(fields)), query.configuration()); - for (int j = 0; j < fields.length; j++) { - Field f = fields[j]; - record.set((Field) f, row.get(j, f.getType())); - } + return (R) delegate.operate(record -> { + // TODO: Go through Field.getBinding() + // TODO: Make sure all the embeddable records, and other types of nested records are supported + for (int i = 0; i < fields.length; i++) { + Field f = fields[i]; + Object value = row.get(i, f.getType()); + record.values[i] = value; + record.originals[i] = value; + } - return record; + return record; + }); }).subscribe(new RowSubscriber(this)); }