@@ -63,6 +63,8 @@ public class Optimizer extends DefaultExpressionVisitor {
63
63
64
64
private List <QueryRewriter > rewriters ;
65
65
66
+ private final FindOptimizable findOptimizable = new FindOptimizable ();
67
+
66
68
public Optimizer (XQueryContext context ) {
67
69
this .context = context ;
68
70
final DBBroker broker = context .getBroker ();
@@ -100,11 +102,13 @@ public void visitLocationStep(final LocationStep locationStep) {
100
102
// try to find a predicate containing an expression which is an instance
101
103
// of Optimizable.
102
104
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 ();
106
107
if (canOptimize (list )) {
107
108
optimize = true ;
109
+ }
110
+ findOptimizable .reset ();
111
+ if (optimize ) {
108
112
break ;
109
113
}
110
114
}
@@ -208,19 +212,23 @@ public void visitFilteredExpr(FilteredExpression filtered) {
208
212
}
209
213
}
210
214
211
- private boolean hasOptimizable (List <Predicate > preds ) {
215
+ private boolean hasOptimizable (final List <Predicate > preds ) {
212
216
// walk through the predicates attached to the current location step.
213
217
// try to find a predicate containing an expression which is an instance
214
218
// of Optimizable.
219
+ boolean optimizable = false ;
215
220
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 ();
219
223
if (canOptimize (list )) {
220
- return true ;
224
+ optimizable = true ;
225
+ }
226
+ findOptimizable .reset ();
227
+ if (optimizable ) {
228
+ break ;
221
229
}
222
230
}
223
- return false ;
231
+ return optimizable ;
224
232
}
225
233
226
234
public void visitAndExpr (OpAnd and ) {
@@ -421,6 +429,10 @@ private void addOptimizable(final Optimizable optimizable) {
421
429
}
422
430
optimizables [optimizables .length - 1 ] = optimizable ;
423
431
}
432
+
433
+ public void reset () {
434
+ this .optimizables = null ;
435
+ }
424
436
}
425
437
426
438
/**
0 commit comments