Skip to content

Commit 9e3e65c

Browse files
committed
[optimize] Most predicates are not optimizable or only have a single optimizable expression
1 parent 42a32e2 commit 9e3e65c

File tree

1 file changed

+23
-18
lines changed

1 file changed

+23
-18
lines changed

exist-core/src/main/java/org/exist/xquery/Optimizer.java

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ public void visitLocationStep(final LocationStep locationStep) {
101101
final FindOptimizable find = new FindOptimizable();
102102
for (final Predicate pred : preds) {
103103
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)) {
106106
optimize = true;
107107
break;
108108
}
@@ -217,8 +217,8 @@ private boolean hasOptimizable(final List<Predicate> preds) {
217217
final FindOptimizable find = new FindOptimizable();
218218
for (final Predicate pred : preds) {
219219
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)) {
222222
return true;
223223
}
224224
find.reset();
@@ -345,7 +345,11 @@ public void visitVariableReference(final VariableReference ref) {
345345
}
346346
}
347347

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+
349353
for (final Optimizable optimizable : list) {
350354
final int axis = optimizable.getOptimizeAxis();
351355
if (!(axis == Constants.CHILD_AXIS || axis == Constants.DESCENDANT_AXIS ||
@@ -383,9 +387,9 @@ private Expression simplifyPath(final Expression expression) {
383387
* Try to find an expression object implementing interface Optimizable.
384388
*/
385389
public static class FindOptimizable extends BasicExpressionVisitor {
386-
private List<Optimizable> optimizables = null;
390+
private @Nullable Optimizable[] optimizables = null;
387391

388-
public @Nullable List<Optimizable> getOptimizables() {
392+
public @Nullable Optimizable[] getOptimizables() {
389393
return optimizables;
390394
}
391395

@@ -399,10 +403,7 @@ public void visitPathExpr(final PathExpr expression) {
399403

400404
@Override
401405
public void visitGeneralComparison(final GeneralComparison comparison) {
402-
if (optimizables == null) {
403-
optimizables = new ArrayList<>(4);
404-
}
405-
optimizables.add(comparison);
406+
addOptimizable(comparison);
406407
}
407408

408409
@Override
@@ -413,22 +414,26 @@ public void visitPredicate(final Predicate predicate) {
413414
@Override
414415
public void visitBuiltinFunction(final Function function) {
415416
if (function instanceof final Optimizable optimizable) {
416-
if (optimizables == null) {
417-
optimizables = new ArrayList<>(4);
418-
}
419-
optimizables.add(optimizable);
417+
addOptimizable(optimizable);
420418
}
421419
}
422420

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+
423430
/**
424431
* Reset this visitor for reuse.
425432
*
426433
* Clears the known {@link #optimizables}.
427434
*/
428435
public void reset() {
429-
if (optimizables != null) {
430-
optimizables.clear();
431-
}
436+
optimizables = null;
432437
}
433438
}
434439

0 commit comments

Comments
 (0)