Skip to content

Commit 1e82c44

Browse files
committed
[optimize] Most predicates are not optimizable or only have a single optimizable expression
1 parent 126deac commit 1e82c44

File tree

1 file changed

+30
-13
lines changed

1 file changed

+30
-13
lines changed

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

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ public void visitLocationStep(final LocationStep locationStep) {
102102
for (final Predicate pred : preds) {
103103
final FindOptimizable find = new FindOptimizable();
104104
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)) {
107107
optimize = true;
108108
break;
109109
}
@@ -215,8 +215,8 @@ private boolean hasOptimizable(List<Predicate> preds) {
215215
for (final Predicate pred : preds) {
216216
final FindOptimizable find = new FindOptimizable();
217217
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)) {
220220
return true;
221221
}
222222
}
@@ -337,7 +337,11 @@ public void visitVariableReference(final VariableReference ref) {
337337
}
338338
}
339339

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+
341345
for (final Optimizable optimizable : list) {
342346
final int axis = optimizable.getOptimizeAxis();
343347
if (!(axis == Constants.CHILD_AXIS || axis == Constants.DESCENDANT_AXIS ||
@@ -378,31 +382,44 @@ private Expression simplifyPath(Expression expression) {
378382
*/
379383
public static class FindOptimizable extends BasicExpressionVisitor {
380384

381-
List<Optimizable> optimizables = new ArrayList<>();
385+
private @Nullable Optimizable[] optimizables = null;
382386

383-
public List<Optimizable> getOptimizables() {
387+
public @Nullable Optimizable[] getOptimizables() {
384388
return optimizables;
385389
}
386390

387-
public void visitPathExpr(PathExpr expression) {
391+
@Override
392+
public void visitPathExpr(final PathExpr expression) {
388393
for (int i = 0; i < expression.getLength(); i++) {
389394
final Expression next = expression.getExpression(i);
390395
next.accept(this);
391396
}
392397
}
393398

394-
public void visitGeneralComparison(GeneralComparison comparison) {
395-
optimizables.add(comparison);
399+
@Override
400+
public void visitGeneralComparison(final GeneralComparison comparison) {
401+
addOptimizable(comparison);
396402
}
397403

398-
public void visitPredicate(Predicate predicate) {
404+
@Override
405+
public void visitPredicate(final Predicate predicate) {
399406
predicate.getExpression(0).accept(this);
400407
}
401408

402-
public void visitBuiltinFunction(Function function) {
409+
@Override
410+
public void visitBuiltinFunction(final Function function) {
403411
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);
405421
}
422+
optimizables[optimizables.length - 1] = optimizable;
406423
}
407424
}
408425

0 commit comments

Comments
 (0)