@@ -102,8 +102,8 @@ public void visitLocationStep(final LocationStep locationStep) {
102
102
for (final Predicate pred : preds ) {
103
103
final FindOptimizable find = new FindOptimizable ();
104
104
pred .accept (find );
105
- final List < Optimizable > list = find .getOptimizables ();
106
- if (list . size () > 0 && canOptimize (list )) {
105
+ @ Nullable final Optimizable [] list = find .getOptimizables ();
106
+ if (canOptimize (list )) {
107
107
optimize = true ;
108
108
break ;
109
109
}
@@ -215,8 +215,8 @@ private boolean hasOptimizable(List<Predicate> preds) {
215
215
for (final Predicate pred : preds ) {
216
216
final FindOptimizable find = new FindOptimizable ();
217
217
pred .accept (find );
218
- final List < Optimizable > list = find .getOptimizables ();
219
- if (list . size () > 0 && canOptimize (list )) {
218
+ @ Nullable final Optimizable [] list = find .getOptimizables ();
219
+ if (canOptimize (list )) {
220
220
return true ;
221
221
}
222
222
}
@@ -337,7 +337,11 @@ public void visitVariableReference(final VariableReference ref) {
337
337
}
338
338
}
339
339
340
- private boolean canOptimize (List <Optimizable > list ) {
340
+ private boolean canOptimize (@ Nullable final Optimizable [] list ) {
341
+ if (list == null || list .length == 0 ) {
342
+ return false ;
343
+ }
344
+
341
345
for (final Optimizable optimizable : list ) {
342
346
final int axis = optimizable .getOptimizeAxis ();
343
347
if (!(axis == Constants .CHILD_AXIS || axis == Constants .DESCENDANT_AXIS ||
@@ -378,31 +382,44 @@ private Expression simplifyPath(Expression expression) {
378
382
*/
379
383
public static class FindOptimizable extends BasicExpressionVisitor {
380
384
381
- List < Optimizable > optimizables = new ArrayList <>() ;
385
+ private @ Nullable Optimizable [] optimizables = null ;
382
386
383
- public List < Optimizable > getOptimizables () {
387
+ public @ Nullable Optimizable [] getOptimizables () {
384
388
return optimizables ;
385
389
}
386
390
387
- public void visitPathExpr (PathExpr expression ) {
391
+ @ Override
392
+ public void visitPathExpr (final PathExpr expression ) {
388
393
for (int i = 0 ; i < expression .getLength (); i ++) {
389
394
final Expression next = expression .getExpression (i );
390
395
next .accept (this );
391
396
}
392
397
}
393
398
394
- public void visitGeneralComparison (GeneralComparison comparison ) {
395
- optimizables .add (comparison );
399
+ @ Override
400
+ public void visitGeneralComparison (final GeneralComparison comparison ) {
401
+ addOptimizable (comparison );
396
402
}
397
403
398
- public void visitPredicate (Predicate predicate ) {
404
+ @ Override
405
+ public void visitPredicate (final Predicate predicate ) {
399
406
predicate .getExpression (0 ).accept (this );
400
407
}
401
408
402
- public void visitBuiltinFunction (Function function ) {
409
+ @ Override
410
+ public void visitBuiltinFunction (final Function function ) {
403
411
if (function instanceof Optimizable ) {
404
- optimizables .add ((Optimizable ) function );
412
+ addOptimizable ((Optimizable ) function );
413
+ }
414
+ }
415
+
416
+ private void addOptimizable (final Optimizable optimizable ) {
417
+ if (optimizables == null ) {
418
+ optimizables = new Optimizable [1 ];
419
+ } else {
420
+ optimizables = Arrays .copyOf (optimizables , optimizables .length + 1 );
405
421
}
422
+ optimizables [optimizables .length - 1 ] = optimizable ;
406
423
}
407
424
}
408
425
0 commit comments