This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 190eb36187c42b2dcb0c07865f207d2139571f3a Author: Andrus Adamchik <[email protected]> AuthorDate: Mon Jun 29 11:39:17 2026 -0400 aligning DefaultRowReaderFactory id handling with the actuial RSColumn[] layout --- .../jdbc/reader/DefaultRowReaderFactory.java | 55 +++++----------------- .../access/jdbc/reader/OffsetRowReader.java | 5 -- 2 files changed, 11 insertions(+), 49 deletions(-) diff --git a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java index 63c38a369..47bd4f07e 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java @@ -18,17 +18,13 @@ ****************************************************************/ package org.apache.cayenne.access.jdbc.reader; -import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.access.jdbc.RSColumn; import org.apache.cayenne.dba.DbAdapter; -import org.apache.cayenne.map.DbEntity; -import org.apache.cayenne.map.ObjEntity; import org.apache.cayenne.query.EmbeddableResultSegment; import org.apache.cayenne.query.EntityResultSegment; import org.apache.cayenne.query.QueryMetadata; import org.apache.cayenne.query.ScalarResultSegment; -import java.util.Arrays; import java.util.List; /** @@ -99,12 +95,14 @@ public class DefaultRowReaderFactory implements RowReaderFactory { protected RowReader<?> entitySegmentReader(RSColumn[] columns, QueryMetadata metadata, EntityResultSegment segment) { - if (metadata.getPageSize() > 0) { - ObjEntity objEntity = metadata.getObjEntity(); - return idReader(columns, - segment.getColumnOffset(), - objEntity != null ? objEntity.getName() : null, - segment.getClassDescriptor().getEntity().getDbEntity()); + // For a paginated query the result columns are trimmed to the root PK (see IdColumnExtractor). A single-column + // PK is read as a scalar (consumed by SimpleIdIncrementalFaultList); a compound PK falls through to the regular + // DataRow reader below, which over PK-only columns yields exactly the id map IncrementalFaultList expects. + if (metadata.getPageSize() > 0 + && segment.getClassDescriptor().getEntity().getDbEntity().getPrimaryKeys().size() == 1) { + int pk = segment.getColumnOffset(); + // jdbc column indexes start from 1 + return new ScalarRowReader<>(columns[pk].reader(), pk + 1, columns[pk].rsType()); } int startIndex = segment.getColumnOffset(); @@ -135,39 +133,8 @@ public class DefaultRowReaderFactory implements RowReaderFactory { } protected RowReader<?> noSegmentReader(RSColumn[] columns, QueryMetadata metadata) { - if (metadata.getPageSize() > 0) { - ObjEntity objEntity = metadata.getObjEntity(); - return idReader( - columns, - 0, - objEntity != null ? objEntity.getName() : null, - metadata.getDbEntity()); - } - return FullRowReader.of(columns, metadata); + return metadata.getPageSize() > 0 && metadata.getDbEntity().getPrimaryKeys().size() == 1 + ? new ScalarRowReader<>(columns[0].reader(), 1, columns[0].rsType()) + : FullRowReader.of(columns, metadata); } - - private RowReader<?> idReader(RSColumn[] columns, int offset, String entityName, DbEntity dbEntity) { - if (dbEntity == null) { - throw new CayenneRuntimeException("Null root DbEntity, can't index PK"); - } - - int pkLen = dbEntity.getPrimaryKeys().size(); - if (pkLen == 0) { - throw new CayenneRuntimeException("Root DBEntity has no PK defined: %s", dbEntity); - } - - // TODO: An implicit assumption below is that "RSColumn[] columns" starts with a PK block (with an optional - // segment offset), and PK columns are contiguous. If the upstream algorithm ever changes, this will no longer - // work. - - if (pkLen == 1) { - RSColumn column = columns[offset]; - // jdbc column indexes start from 1 - return new ScalarRowReader<>(column.reader(), offset + 1, column.rsType()); - } - - RSColumn[] pkColumns = Arrays.copyOfRange(columns, offset, offset + pkLen); - return OffsetRowReader.of(pkColumns, offset, entityName); - } - } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/OffsetRowReader.java b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/OffsetRowReader.java index 3ba96adcd..1538df403 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/OffsetRowReader.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/OffsetRowReader.java @@ -45,11 +45,6 @@ class OffsetRowReader implements RowReader<DataRow> { : new OffsetRowReader(columns, offset, entityName); } - // fixed entity name, no inheritance - static OffsetRowReader of(RSColumn[] columns, int offset, String entityName) { - return new OffsetRowReader(columns, offset, entityName); - } - // no entity name, no inheritance static OffsetRowReader of(RSColumn[] columns, int offset) { return new OffsetRowReader(columns, offset, null);
