Skip to content

Commit 1acc85d

Browse files
committed
[optimize] We only need a single instance of FindOptimizable
1 parent 1e82c44 commit 1acc85d

File tree

1 file changed

+21
-9
lines changed

1 file changed

+21
-9
lines changed

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

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public class Optimizer extends DefaultExpressionVisitor {
6363

6464
private List<QueryRewriter> rewriters;
6565

66+
private final FindOptimizable findOptimizable = new FindOptimizable();
67+
6668
public Optimizer(XQueryContext context) {
6769
this.context = context;
6870
final DBBroker broker = context.getBroker();
@@ -100,11 +102,13 @@ public void visitLocationStep(final LocationStep locationStep) {
100102
// try to find a predicate containing an expression which is an instance
101103
// of Optimizable.
102104
for (final Predicate pred : preds) {
103-
final FindOptimizable find = new FindOptimizable();
104-
pred.accept(find);
105-
@Nullable final Optimizable[] list = find.getOptimizables();
105+
pred.accept(findOptimizable);
106+
@Nullable final Optimizable[] list = findOptimizable.getOptimizables();
106107
if (canOptimize(list)) {
107108
optimize = true;
109+
}
110+
findOptimizable.reset();
111+
if (optimize) {
108112
break;
109113
}
110114
}
@@ -208,19 +212,23 @@ public void visitFilteredExpr(FilteredExpression filtered) {
208212
}
209213
}
210214

211-
private boolean hasOptimizable(List<Predicate> preds) {
215+
private boolean hasOptimizable(final List<Predicate> preds) {
212216
// walk through the predicates attached to the current location step.
213217
// try to find a predicate containing an expression which is an instance
214218
// of Optimizable.
219+
boolean optimizable = false;
215220
for (final Predicate pred : preds) {
216-
final FindOptimizable find = new FindOptimizable();
217-
pred.accept(find);
218-
@Nullable final Optimizable[] list = find.getOptimizables();
221+
pred.accept(findOptimizable);
222+
@Nullable final Optimizable[] list = findOptimizable.getOptimizables();
219223
if (canOptimize(list)) {
220-
return true;
224+
optimizable = true;
225+
}
226+
findOptimizable.reset();
227+
if (optimizable) {
228+
break;
221229
}
222230
}
223-
return false;
231+
return optimizable;
224232
}
225233

226234
public void visitAndExpr(OpAnd and) {
@@ -421,6 +429,10 @@ private void addOptimizable(final Optimizable optimizable) {
421429
}
422430
optimizables[optimizables.length - 1] = optimizable;
423431
}
432+
433+
public void reset() {
434+
this.optimizables = null;
435+
}
424436
}
425437

426438
/**

0 commit comments

Comments
 (0)