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 7d6639f9b cleanup
7d6639f9b is described below
commit 7d6639f9bbaeb07d2817cf533eb1b877279fcb7a
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun Jun 28 17:48:32 2026 -0400
cleanup
---
.../reader/CryptoRowReaderFactoryDecorator.java | 22 ++--
.../jdbc/reader/DefaultRowReaderFactory.java | 122 +++++++++++----------
.../access/jdbc/reader/EmbeddableRowReader.java | 64 -----------
.../access/jdbc/reader/EntityRowReader.java | 116 --------------------
.../cayenne/access/jdbc/reader/FullRowReader.java | 10 +-
.../access/jdbc/reader/IndexedRowReader.java | 66 -----------
.../{FullRowReader.java => OffsetRowReader.java} | 53 +++++----
7 files changed, 107 insertions(+), 346 deletions(-)
diff --git
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java
index 61ddd42b3..29777c5d3 100644
---
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java
+++
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java
@@ -59,30 +59,26 @@ public class CryptoRowReaderFactoryDecorator extends
DefaultRowReaderFactory {
}
@Override
- public RowReader<?> rowReader(RSColumn[] columns, QueryMetadata
queryMetadata, DbAdapter adapter) {
- return super.rowReader(encryptedColumns(columns,
adapter.getExtendedTypes()), queryMetadata, adapter);
+ public RowReader<?> rowReader(RSColumn[] columns, QueryMetadata metadata,
DbAdapter adapter) {
+ return super.rowReader(encryptedColumns(columns,
adapter.getExtendedTypes()), metadata, adapter);
}
@Override
- protected RowReader<?> createScalarRowReader(RSColumn[] columns,
QueryMetadata queryMetadata,
- ScalarResultSegment segment) {
- RowReader<?> scalarRowReader = super
- .createScalarRowReader(columns, queryMetadata, segment);
+ protected RowReader<?> scalarSegmentReader(RSColumn[] columns,
QueryMetadata metadata, ScalarResultSegment segment) {
+ RowReader<?> scalarRowReader = super.scalarSegmentReader(columns,
metadata, segment);
return new
DecoratedScalarRowReader(columns[segment.getColumnOffset()], scalarRowReader);
}
@Override
- protected RowReader<?> createEntityRowReader(RSColumn[] columns,
QueryMetadata queryMetadata,
- EntityResultSegment
resultMetadata) {
- RowReader<?> entityRowReader = super
- .createEntityRowReader(columns, queryMetadata, resultMetadata);
- return new DecoratedEntityRowReader(columns, entityRowReader,
resultMetadata);
+ protected RowReader<?> entitySegmentReader(RSColumn[] columns,
QueryMetadata metadata, EntityResultSegment segment) {
+ RowReader<?> entityRowReader = super.entitySegmentReader(columns,
metadata, segment);
+ return new DecoratedEntityRowReader(columns, entityRowReader, segment);
}
@Override
- protected RowReader<?> createFullRowReader(RSColumn[] columns,
QueryMetadata queryMetadata) {
+ protected RowReader<?> fullRowReader(RSColumn[] columns, QueryMetadata
metadata) {
RowReader<?> fullRowReader = super
- .createFullRowReader(columns, queryMetadata);
+ .fullRowReader(columns, metadata);
return new DecoratedFullRowReader(columns, fullRowReader);
}
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 0952a3d6f..159a65c91 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
@@ -20,7 +20,6 @@ package org.apache.cayenne.access.jdbc.reader;
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.access.jdbc.RSColumn;
-import org.apache.cayenne.access.types.ExtendedType;
import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
@@ -30,6 +29,7 @@ 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;
/**
@@ -38,52 +38,58 @@ import java.util.List;
public class DefaultRowReaderFactory implements RowReaderFactory {
@Override
- public RowReader<?> rowReader(RSColumn[] columns, QueryMetadata
queryMetadata, DbAdapter adapter) {
+ public RowReader<?> rowReader(RSColumn[] columns, QueryMetadata metadata,
DbAdapter adapter) {
- List<Object> segments = queryMetadata.getResultSetMapping();
+ List<Object> segments = metadata.getResultSetMapping();
if (segments == null || segments.isEmpty()) {
- return createFullRowReader(columns, queryMetadata);
+ return fullRowReader(columns, metadata);
}
- if (queryMetadata.isSingleResultSetMapping()) {
- return segmentRowReader(segments.getFirst(), columns,
queryMetadata);
+ if (metadata.isSingleResultSetMapping()) {
+ return segmentRowReader(segments.getFirst(), columns, metadata);
}
int w = segments.size();
RowReader<?>[] readers = new RowReader[w];
for (int i = 0; i < w; i++) {
- readers[i] = segmentRowReader(segments.get(i), columns,
queryMetadata);
+ readers[i] = segmentRowReader(segments.get(i), columns, metadata);
}
return new CompoundRowReader(readers);
}
- private RowReader<?> segmentRowReader(Object segment, RSColumn[] columns,
QueryMetadata queryMetadata) {
+ private RowReader<?> segmentRowReader(Object segment, RSColumn[] columns,
QueryMetadata metadata) {
return switch (segment) {
- case EntityResultSegment ers -> createEntityRowReader(columns,
queryMetadata, ers);
- case EmbeddableResultSegment ers ->
createEmbeddableRowReader(columns, ers);
- case ScalarResultSegment srs -> createScalarRowReader(columns,
queryMetadata, srs);
+ case EntityResultSegment ers -> entitySegmentReader(columns,
metadata, ers);
+ case EmbeddableResultSegment ers ->
embeddableSegmentReader(columns, ers);
+ case ScalarResultSegment srs -> scalarSegmentReader(columns,
metadata, srs);
case null, default -> throw new IllegalStateException("Unknown
segment type: " + segment);
};
}
- private RowReader<?> createEmbeddableRowReader(RSColumn[] columns,
EmbeddableResultSegment segment) {
- int segmentWidth = segment.getFields().size();
+ private RowReader<?> embeddableSegmentReader(RSColumn[] columns,
EmbeddableResultSegment segment) {
int startIndex = segment.getColumnOffset();
- ExtendedType<?>[] converters = new ExtendedType[segmentWidth];
- int[] types = new int[segmentWidth];
- String[] labels = new String[segmentWidth];
+ int segmentWidth = segment.getFields().size();
+
+ // recast the segment's columns into a compact array so their
dataRowName carries the embeddable field
+ // label (keyed by the result-set column name); OffsetRowReader reads
them from startIndex onward
+ RSColumn[] relabeled = new RSColumn[segmentWidth];
for (int i = 0; i < segmentWidth; i++) {
- converters[i] = columns[startIndex + i].reader();
- types[i] = columns[startIndex + i].rsType();
- labels[i] = segment.getFields().get(columns[startIndex +
i].rsName());
+ RSColumn column = columns[startIndex + i];
+ relabeled[i] = new RSColumn(
+ column.rsName(),
+ column.rsType(),
+ segment.getFields().get(column.rsName()),
+ column.reader(),
+ column.attribute());
}
- return new EmbeddableRowReader(converters, types, labels, startIndex);
+ // an embeddable segment carries no entity - no entity name, no
inheritance
+ return OffsetRowReader.of(relabeled, startIndex);
}
- protected RowReader<?> createScalarRowReader(RSColumn[] columns,
QueryMetadata queryMetadata, ScalarResultSegment segment) {
+ protected RowReader<?> scalarSegmentReader(RSColumn[] columns,
QueryMetadata metadata, ScalarResultSegment segment) {
int scalarIndex = segment.getColumnOffset();
return new ScalarRowReader<>(
columns[scalarIndex].reader(),
@@ -92,51 +98,50 @@ public class DefaultRowReaderFactory implements
RowReaderFactory {
columns[scalarIndex].rsType());
}
- protected RowReader<?> createEntityRowReader(
- RSColumn[] columns,
- QueryMetadata queryMetadata,
- EntityResultSegment resultMetadata) {
+ protected RowReader<?> entitySegmentReader(RSColumn[] columns,
QueryMetadata metadata, EntityResultSegment segment) {
- if (queryMetadata.getPageSize() > 0) {
- return createIdRowReader(columns, queryMetadata, resultMetadata);
+ if (metadata.getPageSize() > 0) {
+ return idReader(columns, metadata, segment);
}
- int startIndex = resultMetadata.getColumnOffset();
- int segmentWidth = resultMetadata.getFields().size();
- ExtendedType<?>[] readers = new ExtendedType[segmentWidth];
- int[] types = new int[segmentWidth];
- String[] labels = new String[segmentWidth];
+ int startIndex = segment.getColumnOffset();
+ int segmentWidth = segment.getFields().size();
+
+ // recast the segment's columns into a compact array so their
dataRowName carries the resolved DataRow
+ // label (which is how the reader keys the DataRow); OffsetRowReader
reads them from startIndex onward
+ RSColumn[] relabeled = new RSColumn[segmentWidth];
for (int i = 0; i < segmentWidth; i++) {
RSColumn column = columns[startIndex + i];
- readers[i] = column.reader();
- types[i] = column.rsType();
// the query translator may reorder fields compared to the entity
result, so resolve the
- // DataRow label by reverse lookup of the column name...
- if (column.dataRowName().contains(".")) {
- // a dotted dataRowName is a prefetched column - use it
directly instead of by alias
- labels[i] = column.dataRowName();
- } else {
- labels[i] = resultMetadata.getColumnPath(column.dataRowName());
- }
+ // DataRow label by reverse lookup of the column name; a dotted
dataRowName is a prefetched
+ // column, used directly instead of by alias
+ String name = column.dataRowName();
+ String label = name.contains(".") ? name :
segment.getColumnPath(name);
+
+ relabeled[i] = new RSColumn(
+ column.rsName(),
+ column.rsType(),
+ label,
+ column.reader(),
+ column.attribute());
}
- return EntityRowReader.of(readers, types, labels, startIndex,
resultMetadata.getClassDescriptor());
+ return OffsetRowReader.of(relabeled, startIndex,
segment.getClassDescriptor());
}
- protected RowReader<?> createFullRowReader(RSColumn[] columns,
QueryMetadata queryMetadata) {
+ protected RowReader<?> fullRowReader(RSColumn[] columns, QueryMetadata
metadata) {
- if (queryMetadata.getPageSize() > 0) {
- return createIdRowReader(columns, queryMetadata, null);
+ if (metadata.getPageSize() > 0) {
+ return idReader(columns, metadata, null);
}
- return FullRowReader.of(columns, queryMetadata);
+ return FullRowReader.of(columns, metadata);
}
- private RowReader<?> createIdRowReader(RSColumn[] columns, QueryMetadata
queryMetadata,
- EntityResultSegment resultMetadata)
{
- int[] pk = pkIndices(columns, queryMetadata, resultMetadata);
+ 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) {
@@ -145,18 +150,17 @@ public class DefaultRowReaderFactory implements
RowReaderFactory {
return new ScalarRowReader<>(column.reader(), pk[0] + 1,
column.rsType());
}
- return new IndexedRowReader(columns, entityName(queryMetadata), pk);
- }
+ // 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);
- private static String entityName(QueryMetadata queryMetadata) {
- ObjEntity objEntity = queryMetadata.getObjEntity();
- return objEntity != null ? objEntity.getName() : null;
+ ObjEntity objEntity = metadata.getObjEntity();
+ return OffsetRowReader.of(pkColumns, pk[0], objEntity != null ?
objEntity.getName() : null);
}
- private static int[] pkIndices(RSColumn[] columns, QueryMetadata
queryMetadata, EntityResultSegment resultMetadata) {
- DbEntity dbEntity = resultMetadata == null
- ? queryMetadata.getDbEntity()
- :
resultMetadata.getClassDescriptor().getEntity().getDbEntity();
+ private static int[] pkIndices(RSColumn[] columns, QueryMetadata metadata,
EntityResultSegment segment) {
+ DbEntity dbEntity = segment == null
+ ? metadata.getDbEntity()
+ : segment.getClassDescriptor().getEntity().getDbEntity();
if (dbEntity == null) {
throw new CayenneRuntimeException("Null root DbEntity, can't index
PK");
}
@@ -167,7 +171,7 @@ public class DefaultRowReaderFactory implements
RowReaderFactory {
}
int[] pk = new int[len];
- int offset = resultMetadata != null ? resultMetadata.getColumnOffset()
: 0;
+ 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()) {
diff --git
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EmbeddableRowReader.java
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EmbeddableRowReader.java
deleted file mode 100644
index c172c3528..000000000
---
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EmbeddableRowReader.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ****************************************************************/
-
-package org.apache.cayenne.access.jdbc.reader;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.access.types.ExtendedType;
-
-import java.sql.ResultSet;
-
-/**
- * @since 4.2
- */
-class EmbeddableRowReader implements RowReader<DataRow> {
-
- private final int startIndex;
- private final int mapCapacity;
- private final ExtendedType<?>[] converters;
- private final String[] labels;
- private final int[] types;
-
- EmbeddableRowReader(ExtendedType<?>[] converters, int[] types, String[]
labels, int startIndex) {
- this.converters = converters;
- this.types = types;
- this.labels = labels;
- this.startIndex = startIndex;
- this.mapCapacity = (int) Math.ceil(converters.length / 0.75);
- }
-
- @Override
- public DataRow readRow(ResultSet resultSet) {
- try {
- DataRow row = new DataRow(mapCapacity);
- int len = converters.length;
- for (int i = 0; i < len; i++) {
- // note: jdbc column indexes start from 1, not 0 as in arrays
- Object val = converters[i].materializeObject(resultSet,
startIndex + i + 1, types[i]);
- row.put(labels[i], val);
- }
- return row;
- } catch (CayenneRuntimeException ex) {
- throw ex;
- } catch (Exception ex) {
- throw new CayenneRuntimeException("Exception materializing
column.", ex);
- }
- }
-}
diff --git
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EntityRowReader.java
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EntityRowReader.java
deleted file mode 100644
index eb4413829..000000000
---
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EntityRowReader.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ****************************************************************/
-package org.apache.cayenne.access.jdbc.reader;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.access.types.ExtendedType;
-import org.apache.cayenne.map.EntityInheritanceTree;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.reflect.ClassDescriptor;
-import org.apache.cayenne.util.Util;
-
-import java.sql.ResultSet;
-
-/**
- * @since 3.0
- */
-class EntityRowReader implements RowReader<DataRow> {
-
- private final ExtendedType<?>[] readers;
- private final String[] labels;
- private final int[] types;
- private final int mapCapacity;
- private final int startIndex;
- protected final String entityName;
-
- static RowReader<DataRow> of(
- ExtendedType<?>[] readers,
- int[] types,
- String[] labels,
- int startIndex,
- ClassDescriptor classDescriptor) {
-
- String entityName = classDescriptor != null ?
classDescriptor.getEntity().getName() : null;
- return classDescriptor != null && classDescriptor.hasSubclasses()
- ? new InheritanceAwareEntityRowReader(readers, types, labels,
startIndex, entityName, classDescriptor.getEntityInheritanceTree())
- : new EntityRowReader(readers, types, labels, startIndex,
entityName);
- }
-
- protected EntityRowReader(ExtendedType<?>[] readers, int[] types, String[]
labels, int startIndex, String entityName) {
- this.readers = readers;
- this.types = types;
- this.labels = labels;
- this.startIndex = startIndex;
- this.entityName = entityName;
- this.mapCapacity = (int) Math.ceil(readers.length / 0.75);
- }
-
- @Override
- public DataRow readRow(ResultSet resultSet) {
-
- try {
- DataRow row = new DataRow(mapCapacity);
- int len = readers.length;
-
- for (int i = 0; i < len; i++) {
-
- // note: jdbc column indexes start from 1, not 0 as in arrays
- Object val = readers[i].materializeObject(resultSet,
startIndex + i + 1, types[i]);
- row.put(labels[i], val);
- }
-
- postprocessRow(resultSet, row);
-
- return row;
- } catch (CayenneRuntimeException cex) {
- // rethrow unmodified
- throw cex;
- } catch (Exception otherex) {
- throw new CayenneRuntimeException("Exception materializing id
column.", Util.unwindException(otherex));
- }
- }
-
- protected void postprocessRow(ResultSet resultSet, DataRow dataRow) {
- dataRow.setEntityName(entityName);
- }
-
- private static class InheritanceAwareEntityRowReader extends
EntityRowReader {
-
- private final EntityInheritanceTree entityInheritanceTree;
-
- InheritanceAwareEntityRowReader(
- ExtendedType<?>[] readers,
- int[] types,
- String[] labels,
- int startIndex,
- String entityName,
- EntityInheritanceTree entityInheritanceTree) {
-
- super(readers, types, labels, startIndex, entityName);
- this.entityInheritanceTree = entityInheritanceTree;
- }
-
- @Override
- protected void postprocessRow(ResultSet resultSet, DataRow dataRow) {
- ObjEntity entity =
entityInheritanceTree.entityMatchingRow(dataRow);
- dataRow.setEntityName(entity != null ? entity.getName() :
entityName);
- }
- }
-}
diff --git
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/FullRowReader.java
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/FullRowReader.java
index 84bd20284..ae4e863bf 100644
---
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/FullRowReader.java
+++
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/FullRowReader.java
@@ -70,7 +70,7 @@ class FullRowReader implements RowReader<DataRow> {
dataRow.put(column.dataRowName(), val);
}
- postprocessRow(resultSet, dataRow);
+ dataRow.setEntityName(resolveEntityName(dataRow));
return dataRow;
} catch (CayenneRuntimeException ex) {
@@ -80,8 +80,8 @@ class FullRowReader implements RowReader<DataRow> {
}
}
- protected void postprocessRow(ResultSet resultSet, DataRow dataRow) {
- dataRow.setEntityName(entityName);
+ protected String resolveEntityName(DataRow dataRow) {
+ return entityName;
}
private static class InheritanceAwareRowReader extends FullRowReader {
@@ -94,9 +94,9 @@ class FullRowReader implements RowReader<DataRow> {
}
@Override
- protected void postprocessRow(ResultSet resultSet, DataRow dataRow) {
+ protected String resolveEntityName(DataRow dataRow) {
ObjEntity entity =
entityInheritanceTree.entityMatchingRow(dataRow);
- dataRow.setEntityName(entity != null ? entity.getName() :
entityName);
+ return entity != null ? entity.getName() : entityName;
}
}
}
diff --git
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/IndexedRowReader.java
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/IndexedRowReader.java
deleted file mode 100644
index 605b99790..000000000
---
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/IndexedRowReader.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ****************************************************************/
-package org.apache.cayenne.access.jdbc.reader;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.access.jdbc.RSColumn;
-
-import java.sql.ResultSet;
-
-/**
- * A {@link RowReader} that materializes a subset of the result columns.
- */
-class IndexedRowReader implements RowReader<DataRow> {
-
- private final String entityName;
- private final RSColumn[] columns;
- private final int[] indices;
- private final int mapCapacity;
-
- public IndexedRowReader(RSColumn[] columns, String entityName, int[]
indices) {
- this.columns = columns;
- this.entityName = entityName;
- this.mapCapacity = (int) Math.ceil(indices.length / 0.75);
- this.indices = indices;
- }
-
- @Override
- public DataRow readRow(ResultSet resultSet) {
- DataRow dataRow = new DataRow(mapCapacity);
-
- try {
-
- for (int index : indices) {
- RSColumn column = columns[index];
- // jdbc column indexes start from 1, not 0 unlike everywhere
else
- Object val = column.reader().materializeObject(resultSet,
index + 1, column.rsType());
- dataRow.put(column.dataRowName(), val);
- }
-
- dataRow.setEntityName(entityName);
-
- return dataRow;
- } catch (CayenneRuntimeException ex) {
- throw ex;
- } catch (Exception ex) {
- throw new CayenneRuntimeException("Exception materializing id
column.", ex);
- }
- }
-}
diff --git
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/FullRowReader.java
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/OffsetRowReader.java
similarity index 59%
copy from
cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/FullRowReader.java
copy to
cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/OffsetRowReader.java
index 84bd20284..2a8d73fe2 100644
---
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/FullRowReader.java
+++
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/OffsetRowReader.java
@@ -23,35 +23,41 @@ import org.apache.cayenne.DataRow;
import org.apache.cayenne.access.jdbc.RSColumn;
import org.apache.cayenne.map.EntityInheritanceTree;
import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.query.QueryMetadata;
import org.apache.cayenne.reflect.ClassDescriptor;
import java.sql.ResultSet;
/**
- * @since 3.0
+ * A {@link RowReader} that materializes a contiguous run of result-set
columns starting at a given offset.
*/
-class FullRowReader implements RowReader<DataRow> {
+class OffsetRowReader implements RowReader<DataRow> {
+ protected final String entityName;
private final RSColumn[] columns;
+ private final int offset;
private final int mapCapacity;
- protected final String entityName;
-
- static RowReader<DataRow> of(RSColumn[] columns, QueryMetadata
queryMetadata) {
- ObjEntity objEntity = queryMetadata.getObjEntity();
- String entityName = objEntity != null ? objEntity.getName() : null;
+ // possible inherotance
+ static RowReader<DataRow> of(RSColumn[] columns, int offset,
ClassDescriptor cd) {
+ String entityName = cd != null ? cd.getEntity().getName() : null;
+ return cd != null && cd.hasSubclasses()
+ ? new InheritanceAwareOffsetRowReader(columns, offset,
entityName, cd.getEntityInheritanceTree())
+ : new OffsetRowReader(columns, offset, entityName);
+ }
- ClassDescriptor classDescriptor = queryMetadata.getClassDescriptor();
- if (classDescriptor != null && classDescriptor.hasSubclasses()) {
- return new InheritanceAwareRowReader(columns, entityName,
classDescriptor.getEntityInheritanceTree());
- }
+ // fixed entity name, no inheritance
+ static RowReader<DataRow> of(RSColumn[] columns, int offset, String
entityName) {
+ return new OffsetRowReader(columns, offset, entityName);
+ }
- return new FullRowReader(columns, entityName);
+ // no entity name, no inheritance
+ static RowReader<DataRow> of(RSColumn[] columns, int offset) {
+ return new OffsetRowReader(columns, offset, null);
}
- public FullRowReader(RSColumn[] columns, String entityName) {
+ private OffsetRowReader(RSColumn[] columns, int offset, String entityName)
{
this.columns = columns;
+ this.offset = offset;
this.entityName = entityName;
this.mapCapacity = (int) Math.ceil(columns.length / 0.75);
}
@@ -66,11 +72,11 @@ class FullRowReader implements RowReader<DataRow> {
for (int i = 0; i < w; i++) {
RSColumn column = columns[i];
// jdbc column indexes start from 1, not 0 unlike everywhere
else
- Object val = column.reader().materializeObject(resultSet, i +
1, column.rsType());
+ Object val = column.reader().materializeObject(resultSet,
offset + i + 1, column.rsType());
dataRow.put(column.dataRowName(), val);
}
- postprocessRow(resultSet, dataRow);
+ dataRow.setEntityName(resolveEntityName(dataRow));
return dataRow;
} catch (CayenneRuntimeException ex) {
@@ -80,23 +86,24 @@ class FullRowReader implements RowReader<DataRow> {
}
}
- protected void postprocessRow(ResultSet resultSet, DataRow dataRow) {
- dataRow.setEntityName(entityName);
+ protected String resolveEntityName(DataRow dataRow) {
+ return entityName;
}
- private static class InheritanceAwareRowReader extends FullRowReader {
+ private static class InheritanceAwareOffsetRowReader extends
OffsetRowReader {
private final EntityInheritanceTree entityInheritanceTree;
- InheritanceAwareRowReader(RSColumn[] columns, String entityName,
EntityInheritanceTree entityInheritanceTree) {
- super(columns, entityName);
+ InheritanceAwareOffsetRowReader(RSColumn[] columns, int startIndex,
String entityName,
+ EntityInheritanceTree
entityInheritanceTree) {
+ super(columns, startIndex, entityName);
this.entityInheritanceTree = entityInheritanceTree;
}
@Override
- protected void postprocessRow(ResultSet resultSet, DataRow dataRow) {
+ protected String resolveEntityName(DataRow dataRow) {
ObjEntity entity =
entityInheritanceTree.entityMatchingRow(dataRow);
- dataRow.setEntityName(entity != null ? entity.getName() :
entityName);
+ return entity != null ? entity.getName() : entityName;
}
}
}