@@ -101,8 +101,8 @@ public void visitLocationStep(final LocationStep locationStep) {
101
101
final FindOptimizable find = new FindOptimizable ();
102
102
for (final Predicate pred : preds ) {
103
103
pred .accept (find );
104
- @ Nullable final List < Optimizable > list = find .getOptimizables ();
105
- if (list != null && canOptimize (list )) {
104
+ @ Nullable final Optimizable [] list = find .getOptimizables ();
105
+ if (canOptimize (list )) {
106
106
optimize = true ;
107
107
break ;
108
108
}
@@ -217,8 +217,8 @@ private boolean hasOptimizable(final List<Predicate> preds) {
217
217
final FindOptimizable find = new FindOptimizable ();
218
218
for (final Predicate pred : preds ) {
219
219
pred .accept (find );
220
- @ Nullable final List < Optimizable > list = find .getOptimizables ();
221
- if (list != null && canOptimize (list )) {
220
+ @ Nullable final Optimizable [] list = find .getOptimizables ();
221
+ if (canOptimize (list )) {
222
222
return true ;
223
223
}
224
224
find .reset ();
@@ -345,7 +345,11 @@ public void visitVariableReference(final VariableReference ref) {
345
345
}
346
346
}
347
347
348
- private boolean canOptimize (final List <Optimizable > list ) {
348
+ private boolean canOptimize (@ Nullable final Optimizable [] list ) {
349
+ if (list == null || list .length == 0 ) {
350
+ return false ;
351
+ }
352
+
349
353
for (final Optimizable optimizable : list ) {
350
354
final int axis = optimizable .getOptimizeAxis ();
351
355
if (!(axis == Constants .CHILD_AXIS || axis == Constants .DESCENDANT_AXIS ||
@@ -383,9 +387,9 @@ private Expression simplifyPath(final Expression expression) {
383
387
* Try to find an expression object implementing interface Optimizable.
384
388
*/
385
389
public static class FindOptimizable extends BasicExpressionVisitor {
386
- private List < Optimizable > optimizables = null ;
390
+ private @ Nullable Optimizable [] optimizables = null ;
387
391
388
- public @ Nullable List < Optimizable > getOptimizables () {
392
+ public @ Nullable Optimizable [] getOptimizables () {
389
393
return optimizables ;
390
394
}
391
395
@@ -399,10 +403,7 @@ public void visitPathExpr(final PathExpr expression) {
399
403
400
404
@ Override
401
405
public void visitGeneralComparison (final GeneralComparison comparison ) {
402
- if (optimizables == null ) {
403
- optimizables = new ArrayList <>(4 );
404
- }
405
- optimizables .add (comparison );
406
+ addOptimizable (comparison );
406
407
}
407
408
408
409
@ Override
@@ -413,22 +414,26 @@ public void visitPredicate(final Predicate predicate) {
413
414
@ Override
414
415
public void visitBuiltinFunction (final Function function ) {
415
416
if (function instanceof final Optimizable optimizable ) {
416
- if (optimizables == null ) {
417
- optimizables = new ArrayList <>(4 );
418
- }
419
- optimizables .add (optimizable );
417
+ addOptimizable (optimizable );
420
418
}
421
419
}
422
420
421
+ private void addOptimizable (final Optimizable optimizable ) {
422
+ if (optimizables == null ) {
423
+ optimizables = new Optimizable [1 ];
424
+ } else {
425
+ optimizables = Arrays .copyOf (optimizables , optimizables .length + 1 );
426
+ }
427
+ optimizables [optimizables .length - 1 ] = optimizable ;
428
+ }
429
+
423
430
/**
424
431
* Reset this visitor for reuse.
425
432
*
426
433
* Clears the known {@link #optimizables}.
427
434
*/
428
435
public void reset () {
429
- if (optimizables != null ) {
430
- optimizables .clear ();
431
- }
436
+ optimizables = null ;
432
437
}
433
438
}
434
439
0 commit comments