Skip to content

Commit 190eb36

Browse files
committed
aligning DefaultRowReaderFactory id handling with the actuial RSColumn[] layout
1 parent 7081c91 commit 190eb36

2 files changed

Lines changed: 11 additions & 49 deletions

File tree

cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java

Lines changed: 11 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,13 @@
1818
****************************************************************/
1919
package org.apache.cayenne.access.jdbc.reader;
2020

21-
import org.apache.cayenne.CayenneRuntimeException;
2221
import org.apache.cayenne.access.jdbc.RSColumn;
2322
import org.apache.cayenne.dba.DbAdapter;
24-
import org.apache.cayenne.map.DbEntity;
25-
import org.apache.cayenne.map.ObjEntity;
2623
import org.apache.cayenne.query.EmbeddableResultSegment;
2724
import org.apache.cayenne.query.EntityResultSegment;
2825
import org.apache.cayenne.query.QueryMetadata;
2926
import org.apache.cayenne.query.ScalarResultSegment;
3027

31-
import java.util.Arrays;
3228
import java.util.List;
3329

3430
/**
@@ -99,12 +95,14 @@ protected RowReader<?> scalarSegmentReader(RSColumn[] columns, QueryMetadata met
9995

10096
protected RowReader<?> entitySegmentReader(RSColumn[] columns, QueryMetadata metadata, EntityResultSegment segment) {
10197

102-
if (metadata.getPageSize() > 0) {
103-
ObjEntity objEntity = metadata.getObjEntity();
104-
return idReader(columns,
105-
segment.getColumnOffset(),
106-
objEntity != null ? objEntity.getName() : null,
107-
segment.getClassDescriptor().getEntity().getDbEntity());
98+
// For a paginated query the result columns are trimmed to the root PK (see IdColumnExtractor). A single-column
99+
// PK is read as a scalar (consumed by SimpleIdIncrementalFaultList); a compound PK falls through to the regular
100+
// DataRow reader below, which over PK-only columns yields exactly the id map IncrementalFaultList expects.
101+
if (metadata.getPageSize() > 0
102+
&& segment.getClassDescriptor().getEntity().getDbEntity().getPrimaryKeys().size() == 1) {
103+
int pk = segment.getColumnOffset();
104+
// jdbc column indexes start from 1
105+
return new ScalarRowReader<>(columns[pk].reader(), pk + 1, columns[pk].rsType());
108106
}
109107

110108
int startIndex = segment.getColumnOffset();
@@ -135,39 +133,8 @@ protected RowReader<?> entitySegmentReader(RSColumn[] columns, QueryMetadata met
135133
}
136134

137135
protected RowReader<?> noSegmentReader(RSColumn[] columns, QueryMetadata metadata) {
138-
if (metadata.getPageSize() > 0) {
139-
ObjEntity objEntity = metadata.getObjEntity();
140-
return idReader(
141-
columns,
142-
0,
143-
objEntity != null ? objEntity.getName() : null,
144-
metadata.getDbEntity());
145-
}
146-
return FullRowReader.of(columns, metadata);
136+
return metadata.getPageSize() > 0 && metadata.getDbEntity().getPrimaryKeys().size() == 1
137+
? new ScalarRowReader<>(columns[0].reader(), 1, columns[0].rsType())
138+
: FullRowReader.of(columns, metadata);
147139
}
148-
149-
private RowReader<?> idReader(RSColumn[] columns, int offset, String entityName, DbEntity dbEntity) {
150-
if (dbEntity == null) {
151-
throw new CayenneRuntimeException("Null root DbEntity, can't index PK");
152-
}
153-
154-
int pkLen = dbEntity.getPrimaryKeys().size();
155-
if (pkLen == 0) {
156-
throw new CayenneRuntimeException("Root DBEntity has no PK defined: %s", dbEntity);
157-
}
158-
159-
// TODO: An implicit assumption below is that "RSColumn[] columns" starts with a PK block (with an optional
160-
// segment offset), and PK columns are contiguous. If the upstream algorithm ever changes, this will no longer
161-
// work.
162-
163-
if (pkLen == 1) {
164-
RSColumn column = columns[offset];
165-
// jdbc column indexes start from 1
166-
return new ScalarRowReader<>(column.reader(), offset + 1, column.rsType());
167-
}
168-
169-
RSColumn[] pkColumns = Arrays.copyOfRange(columns, offset, offset + pkLen);
170-
return OffsetRowReader.of(pkColumns, offset, entityName);
171-
}
172-
173140
}

cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/OffsetRowReader.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,6 @@ static OffsetRowReader of(RSColumn[] columns, int offset, ClassDescriptor cd) {
4545
: new OffsetRowReader(columns, offset, entityName);
4646
}
4747

48-
// fixed entity name, no inheritance
49-
static OffsetRowReader of(RSColumn[] columns, int offset, String entityName) {
50-
return new OffsetRowReader(columns, offset, entityName);
51-
}
52-
5348
// no entity name, no inheritance
5449
static OffsetRowReader of(RSColumn[] columns, int offset) {
5550
return new OffsetRowReader(columns, offset, null);

0 commit comments

Comments
 (0)