AbstractSession executionSession = getExecutionSession();
DatabasePlatform platform = dbAccessor.getPlatform();
boolean optimizeData = platform.shouldOptimizeDataConversion();
if (useSimple) {
// None of the fields are relational - the row could be reused, just clear all the values.
SimpleResultSetRecord row = new SimpleResultSetRecord(fields, fieldsArray, resultSet, metaData, dbAccessor, executionSession, platform, optimizeData);
if (this.descriptor.isDescriptorTypeAggregate()) {
// Aggregate Collection may have an unmapped primary key referencing the owner, the corresponding field will not be used when the object is populated and therefore may not be cleared.
row.setShouldKeepValues(true);
}
while (hasNext) {
Object clone = buildObject(row);
if (quickAdd) {
((Collection)clones).add(clone);
} else {
// TODO: investigate is it possible to support MappedKeyMapPolicy - this policy currently is not compatible with ResultSet optimization
cp.addInto(clone, clones, unitOfWork);
}
row.reset();
hasNext = resultSet.next();
}
} else {
boolean shouldKeepRow = this.descriptor.getObjectBuilder().shouldKeepRow();
while (hasNext) {
ResultSetRecord row = new ResultSetRecord(fields, fieldsArray, resultSet, metaData, dbAccessor, executionSession, platform, optimizeData);
Object clone = buildObject(row);
if (quickAdd) {
((Collection)clones).add(clone);
} else {
// TODO: investigate is it possible to support MappedKeyMapPolicy - this policy currently is not compatible with ResultSet optimization
cp.addInto(clone, clones, unitOfWork);
}
if (shouldKeepRow) {
if (row.hasResultSet()) {
// ResultSet has not been fully triggered - that means the cached object was used.
// Yet the row still may be cached in a value holder (see loadBatchReadAttributes and loadJoinedAttributes methods).
// Remove ResultSet to avoid attempt to trigger it (already closed) when pk or fk values (already extracted) accessed when the value holder is instantiated.
row.removeResultSet();
} else {
row.removeNonIndirectionValues();
}
}
hasNext = resultSet.next();
}
}