@@ -39,7 +39,7 @@ public class StandardRowReader<T> implements RowReader<T> {
39
39
private final Initializer <InitializerData >[] sortedForResolveInstance ;
40
40
private final InitializerData [] sortedForResolveInstanceData ;
41
41
private final boolean hasCollectionInitializers ;
42
- private final RowTransformer <T > rowTransformer ;
42
+ private final @ Nullable RowTransformer <T > rowTransformer ;
43
43
private final Class <T > domainResultJavaType ;
44
44
45
45
private final ComponentType componentType ;
@@ -78,7 +78,11 @@ public StandardRowReader(
78
78
this .sortedForResolveInstance = (Initializer <InitializerData >[]) sortedForResolveInitializers ;
79
79
this .sortedForResolveInstanceData = new InitializerData [sortedForResolveInstance .length ];
80
80
this .hasCollectionInitializers = hasCollectionInitializers ;
81
- this .rowTransformer = rowTransformer ;
81
+ this .rowTransformer = rowTransformer == RowTransformerArrayImpl .INSTANCE && resultAssemblers .length != 1
82
+ || rowTransformer == RowTransformerStandardImpl .INSTANCE
83
+ || rowTransformer == RowTransformerSingularReturnImpl .INSTANCE && resultAssemblers .length == 1
84
+ ? null
85
+ : rowTransformer ;
82
86
this .domainResultJavaType = domainResultJavaType ;
83
87
if ( domainResultJavaType == null
84
88
|| domainResultJavaType == Object [].class
@@ -136,117 +140,90 @@ public boolean hasCollectionInitializers() {
136
140
public T readRow (RowProcessingState rowProcessingState ) {
137
141
coordinateInitializers ( rowProcessingState );
138
142
143
+ final T result ;
144
+ if ( componentType != ComponentType .OBJECT ) {
145
+ result = readPrimitiveRow ( rowProcessingState );
146
+ }
147
+ else {
148
+ if ( resultAssemblers .length == 1 && rowTransformer == null ) {
149
+ //noinspection unchecked
150
+ result = (T ) resultAssemblers [0 ].assemble ( rowProcessingState );
151
+ }
152
+ else {
153
+ final Object [] resultRow = (Object []) Array .newInstance ( resultElementClass , resultAssemblers .length );
154
+ for ( int i = 0 ; i < resultAssemblers .length ; i ++ ) {
155
+ resultRow [i ] = resultAssemblers [i ].assemble ( rowProcessingState );
156
+ }
157
+ //noinspection unchecked
158
+ result = rowTransformer == null
159
+ ? (T ) resultRow
160
+ : rowTransformer .transformRow ( resultRow );
161
+ }
162
+ }
163
+
164
+ finishUpRow ();
165
+ return result ;
166
+ }
167
+
168
+ private T readPrimitiveRow (RowProcessingState rowProcessingState ) {
139
169
// The following is ugly, but unfortunately necessary to not hurt performance.
140
170
// This implementation was micro-benchmarked and discussed with Francesco Nigro,
141
171
// who hinted that using this style instead of the reflective Array.getLength(), Array.set()
142
172
// is easier for the JVM to optimize
143
173
switch ( componentType ) {
144
174
case BOOLEAN :
145
175
final boolean [] resultBooleanRow = new boolean [resultAssemblers .length ];
146
-
147
176
for ( int i = 0 ; i < resultAssemblers .length ; i ++ ) {
148
- final DomainResultAssembler assembler = resultAssemblers [i ];
149
- resultBooleanRow [i ] = (boolean ) assembler .assemble ( rowProcessingState );
177
+ resultBooleanRow [i ] = (boolean ) resultAssemblers [i ].assemble ( rowProcessingState );
150
178
}
151
-
152
- afterRow ( rowProcessingState );
153
-
154
179
return (T ) resultBooleanRow ;
155
180
case BYTE :
156
181
final byte [] resultByteRow = new byte [resultAssemblers .length ];
157
-
158
182
for ( int i = 0 ; i < resultAssemblers .length ; i ++ ) {
159
- final DomainResultAssembler assembler = resultAssemblers [i ];
160
- resultByteRow [i ] = (byte ) assembler .assemble ( rowProcessingState );
183
+ resultByteRow [i ] = (byte ) resultAssemblers [i ].assemble ( rowProcessingState );
161
184
}
162
-
163
- afterRow ( rowProcessingState );
164
-
165
185
return (T ) resultByteRow ;
166
186
case CHAR :
167
187
final char [] resultCharRow = new char [resultAssemblers .length ];
168
-
169
188
for ( int i = 0 ; i < resultAssemblers .length ; i ++ ) {
170
- final DomainResultAssembler assembler = resultAssemblers [i ];
171
- resultCharRow [i ] = (char ) assembler .assemble ( rowProcessingState );
189
+ resultCharRow [i ] = (char ) resultAssemblers [i ].assemble ( rowProcessingState );
172
190
}
173
-
174
- afterRow ( rowProcessingState );
175
-
176
191
return (T ) resultCharRow ;
177
192
case SHORT :
178
193
final short [] resultShortRow = new short [resultAssemblers .length ];
179
-
180
194
for ( int i = 0 ; i < resultAssemblers .length ; i ++ ) {
181
- final DomainResultAssembler assembler = resultAssemblers [i ];
182
- resultShortRow [i ] = (short ) assembler .assemble ( rowProcessingState );
195
+ resultShortRow [i ] = (short ) resultAssemblers [i ].assemble ( rowProcessingState );
183
196
}
184
-
185
- afterRow ( rowProcessingState );
186
-
187
197
return (T ) resultShortRow ;
188
198
case INT :
189
199
final int [] resultIntRow = new int [resultAssemblers .length ];
190
-
191
200
for ( int i = 0 ; i < resultAssemblers .length ; i ++ ) {
192
- final DomainResultAssembler assembler = resultAssemblers [i ];
193
- resultIntRow [i ] = (int ) assembler .assemble ( rowProcessingState );
201
+ resultIntRow [i ] = (int ) resultAssemblers [i ].assemble ( rowProcessingState );
194
202
}
195
-
196
- afterRow ( rowProcessingState );
197
-
198
203
return (T ) resultIntRow ;
199
204
case LONG :
200
205
final long [] resultLongRow = new long [resultAssemblers .length ];
201
-
202
206
for ( int i = 0 ; i < resultAssemblers .length ; i ++ ) {
203
- final DomainResultAssembler assembler = resultAssemblers [i ];
204
- resultLongRow [i ] = (long ) assembler .assemble ( rowProcessingState );
207
+ resultLongRow [i ] = (long ) resultAssemblers [i ].assemble ( rowProcessingState );
205
208
}
206
-
207
- afterRow ( rowProcessingState );
208
-
209
209
return (T ) resultLongRow ;
210
210
case FLOAT :
211
211
final float [] resultFloatRow = new float [resultAssemblers .length ];
212
-
213
212
for ( int i = 0 ; i < resultAssemblers .length ; i ++ ) {
214
- final DomainResultAssembler assembler = resultAssemblers [i ];
215
- resultFloatRow [i ] = (float ) assembler .assemble ( rowProcessingState );
213
+ resultFloatRow [i ] = (float ) resultAssemblers [i ].assemble ( rowProcessingState );
216
214
}
217
-
218
- afterRow ( rowProcessingState );
219
-
220
215
return (T ) resultFloatRow ;
221
216
case DOUBLE :
222
217
final double [] resultDoubleRow = new double [resultAssemblers .length ];
223
-
224
218
for ( int i = 0 ; i < resultAssemblers .length ; i ++ ) {
225
- final DomainResultAssembler assembler = resultAssemblers [i ];
226
- resultDoubleRow [i ] = (double ) assembler .assemble ( rowProcessingState );
219
+ resultDoubleRow [i ] = (double ) resultAssemblers [i ].assemble ( rowProcessingState );
227
220
}
228
-
229
- afterRow ( rowProcessingState );
230
-
231
221
return (T ) resultDoubleRow ;
232
222
default :
233
- final Object [] resultRow = (Object []) Array .newInstance ( resultElementClass , resultAssemblers .length );
234
-
235
- for ( int i = 0 ; i < resultAssemblers .length ; i ++ ) {
236
- final DomainResultAssembler assembler = resultAssemblers [i ];
237
- resultRow [i ] = assembler .assemble ( rowProcessingState );
238
- }
239
-
240
- afterRow ( rowProcessingState );
241
-
242
- return rowTransformer .transformRow ( resultRow );
223
+ throw new AssertionError ( "Object should be handled specially" );
243
224
}
244
225
}
245
226
246
- private void afterRow (RowProcessingState rowProcessingState ) {
247
- finishUpRow ();
248
- }
249
-
250
227
private void finishUpRow () {
251
228
for ( InitializerData data : initializersData ) {
252
229
data .setState ( Initializer .State .UNINITIALIZED );
0 commit comments