|
18 | 18 | ****************************************************************/ |
19 | 19 | package org.apache.cayenne.access.jdbc.reader; |
20 | 20 |
|
21 | | -import org.apache.cayenne.CayenneRuntimeException; |
22 | 21 | import org.apache.cayenne.access.jdbc.RSColumn; |
23 | 22 | import org.apache.cayenne.dba.DbAdapter; |
24 | | -import org.apache.cayenne.map.DbEntity; |
25 | | -import org.apache.cayenne.map.ObjEntity; |
26 | 23 | import org.apache.cayenne.query.EmbeddableResultSegment; |
27 | 24 | import org.apache.cayenne.query.EntityResultSegment; |
28 | 25 | import org.apache.cayenne.query.QueryMetadata; |
29 | 26 | import org.apache.cayenne.query.ScalarResultSegment; |
30 | 27 |
|
31 | | -import java.util.Arrays; |
32 | 28 | import java.util.List; |
33 | 29 |
|
34 | 30 | /** |
@@ -99,12 +95,14 @@ protected RowReader<?> scalarSegmentReader(RSColumn[] columns, QueryMetadata met |
99 | 95 |
|
100 | 96 | protected RowReader<?> entitySegmentReader(RSColumn[] columns, QueryMetadata metadata, EntityResultSegment segment) { |
101 | 97 |
|
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()); |
108 | 106 | } |
109 | 107 |
|
110 | 108 | int startIndex = segment.getColumnOffset(); |
@@ -135,39 +133,8 @@ protected RowReader<?> entitySegmentReader(RSColumn[] columns, QueryMetadata met |
135 | 133 | } |
136 | 134 |
|
137 | 135 | 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); |
147 | 139 | } |
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 | | - |
173 | 140 | } |
0 commit comments