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;
         }
     }
 }

Reply via email to