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
The following commit(s) were added to refs/heads/master by this push:
new af84f4259 Fixing DefaultRowReaderFactory ID mapping
af84f4259 is described below
commit af84f425927dfa34d2b7860f42373aeb20edf993
Author: Andrus Adamchik <[email protected]>
AuthorDate: Mon Jun 29 07:57:18 2026 -0400
Fixing DefaultRowReaderFactory ID mapping
---
.../jdbc/reader/DefaultRowReaderFactory.java | 62 ++++++++++------------
1 file changed, 27 insertions(+), 35 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 0296ea5bc..63c38a369 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
@@ -21,7 +21,6 @@ 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.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.query.EmbeddableResultSegment;
@@ -101,7 +100,11 @@ public class DefaultRowReaderFactory implements
RowReaderFactory {
protected RowReader<?> entitySegmentReader(RSColumn[] columns,
QueryMetadata metadata, EntityResultSegment segment) {
if (metadata.getPageSize() > 0) {
- return idReader(columns, metadata, segment);
+ ObjEntity objEntity = metadata.getObjEntity();
+ return idReader(columns,
+ segment.getColumnOffset(),
+ objEntity != null ? objEntity.getName() : null,
+ segment.getClassDescriptor().getEntity().getDbEntity());
}
int startIndex = segment.getColumnOffset();
@@ -132,50 +135,39 @@ public class DefaultRowReaderFactory implements
RowReaderFactory {
}
protected RowReader<?> noSegmentReader(RSColumn[] columns, QueryMetadata
metadata) {
- return metadata.getPageSize() > 0
- ? idReader(columns, metadata, null)
- : FullRowReader.of(columns, metadata);
- }
-
- private RowReader<?> idReader(RSColumn[] columns, QueryMetadata metadata,
EntityResultSegment segment) {
- int[] pk = pkIndices(columns, metadata, segment);
-
- // single-column PK - read the value directly as a scalar
- if (pk.length == 1) {
- RSColumn column = columns[pk[0]];
- // jdbc column indexes start from 1
- return new ScalarRowReader<>(column.reader(), pk[0] + 1,
column.rsType());
+ if (metadata.getPageSize() > 0) {
+ ObjEntity objEntity = metadata.getObjEntity();
+ return idReader(
+ columns,
+ 0,
+ objEntity != null ? objEntity.getName() : null,
+ metadata.getDbEntity());
}
-
- // a multi-column PK occupies a contiguous run starting at pk[0] -
read it as a compact segment
- RSColumn[] pkColumns = Arrays.copyOfRange(columns, pk[0], pk[0] +
pk.length);
-
- ObjEntity objEntity = metadata.getObjEntity();
- return OffsetRowReader.of(pkColumns, pk[0], objEntity != null ?
objEntity.getName() : null);
+ return FullRowReader.of(columns, metadata);
}
- private static int[] pkIndices(RSColumn[] columns, QueryMetadata metadata,
EntityResultSegment segment) {
- DbEntity dbEntity = segment == null
- ? metadata.getDbEntity()
- : segment.getClassDescriptor().getEntity().getDbEntity();
+ 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 len = dbEntity.getPrimaryKeys().size();
- if (len == 0) {
+ int pkLen = dbEntity.getPrimaryKeys().size();
+ if (pkLen == 0) {
throw new CayenneRuntimeException("Root DBEntity has no PK
defined: %s", dbEntity);
}
- int[] pk = new int[len];
- int offset = segment != null ? segment.getColumnOffset() : 0;
- for (int i = offset, j = 0; i < offset + len; i++) {
- DbAttribute a = dbEntity.getAttribute(columns[i].rsName());
- if (a != null && a.isPrimaryKey()) {
- pk[j++] = i;
- }
+ // 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());
}
- return pk;
+
+ RSColumn[] pkColumns = Arrays.copyOfRange(columns, offset, offset +
pkLen);
+ return OffsetRowReader.of(pkColumns, offset, entityName);
}
}