From 231929993098e1d5b406ace02de03482a2a91180 Mon Sep 17 00:00:00 2001 From: ailitchev Date: Wed, 6 Feb 2013 17:39:09 -0500 Subject: [PATCH] Some improvements for ResultSetOptimizedQuery (part of old bug 298985): now works with descriptor with multiple tables and handles reference mappings, too. Still to be done - proper cloning and registering all the objects. --- .../internal/databaseaccess/DatabaseAccessor.java | 12 +++++ .../internal/descriptors/ObjectBuilder.java | 54 +++++++++++++++++++--- .../mappings/foundation/AbstractDirectMapping.java | 43 +++++++++++++++-- .../persistence/queries/ObjectLevelReadQuery.java | 5 +- .../eclipse/persistence/queries/ReadAllQuery.java | 4 +- .../persistence/queries/ReadObjectQuery.java | 2 +- 6 files changed, 105 insertions(+), 15 deletions(-) diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/databaseaccess/DatabaseAccessor.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/databaseaccess/DatabaseAccessor.java index ef37e18..d27d0de 100644 --- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/databaseaccess/DatabaseAccessor.java +++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/databaseaccess/DatabaseAccessor.java @@ -1076,6 +1076,18 @@ public class DatabaseAccessor extends DatasourceAccessor { // Row creation is optimized through sharing the same fields for the entire result set. return new ArrayRecord(fields, fieldsArray, values); } + public void populateRow(DatabaseField[] fieldsArray, Object[] values, ResultSet resultSet, ResultSetMetaData metaData, AbstractSession session, int startIndex, int endIndex) throws DatabaseException { + // PERF: Pass platform and optimize data flag. + DatabasePlatform platform = getPlatform(); + boolean optimizeData = platform.shouldOptimizeDataConversion(); + for (int index = startIndex; index < endIndex; index++) { + DatabaseField field = fieldsArray[index]; + // Field can be null for fetch groups. + if (field != null) { + values[index] = getObject(resultSet, field, metaData, index + 1, platform, optimizeData, session); + } + } + } /** * INTERNAL: diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java index 16d5c86..eac1124 100644 --- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java +++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java @@ -1904,19 +1904,33 @@ public class ObjectBuilder extends CoreObjectBuilder)this.accessors).get(0); + DatabaseAccessor accessor = (DatabaseAccessor)getAccessor(); boolean exceptionOccured = false; try { ResultSetMetaData metaData = resultSet.getMetaData(); List results = new ArrayList(); ObjectBuilder builder = this.descriptor.getObjectBuilder(); while (resultSet.next()) { - results.add(builder.buildObjectFromResultSet(this, this.joinedAttributeManager, resultSet, session, accessor, metaData, platform)); + results.add(builder.buildObjectFromResultSet(this, this.joinedAttributeManager, resultSet, session, accessor, metaData, platform, call.getFields(), call.getFieldsArray())); } return results; } catch (SQLException exception) { diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/queries/ReadObjectQuery.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/queries/ReadObjectQuery.java index b1fdcd6..f56b329 100644 --- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/queries/ReadObjectQuery.java +++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/queries/ReadObjectQuery.java @@ -505,7 +505,7 @@ public class ReadObjectQuery extends ObjectLevelReadQuery { return null; } ResultSetMetaData metaData = resultSet.getMetaData(); - return this.descriptor.getObjectBuilder().buildObjectFromResultSet(this, null, resultSet, session, accessor, metaData, platform); + return this.descriptor.getObjectBuilder().buildObjectFromResultSet(this, null, resultSet, session, accessor, metaData, platform, call.getFields(), call.getFieldsArray()); } catch (SQLException exception) { exceptionOccured = true; DatabaseException commException = accessor.processExceptionForCommError(session, exception, call); -- 1.7.11.msysgit.1