Skip to content

Commit ec00524

Browse files
authored
Merge pull request #5083 from evolvedbinary/6.x.x/bugfix/optimize-inside-pragma
[6.x.x] Optimise Path Expressions that are visited by the BasicExpressionVisitor
2 parents 4a94b68 + 3616f14 commit ec00524

File tree

4 files changed

+178
-99
lines changed

4 files changed

+178
-99
lines changed

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,13 @@ public void resetState(final boolean postOptimization) {
9393

9494
@Override
9595
public String toString() {
96-
return "(# " + name + ' ' + contents + "#)";
96+
final StringBuilder builder = new StringBuilder();
97+
builder.append("(# ");
98+
builder.append(name);
99+
if (contents != null && !contents.isEmpty()) {
100+
builder.append(' ').append(contents);
101+
}
102+
builder.append("#)");
103+
return builder.toString();
97104
}
98105
}

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

Lines changed: 61 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,18 @@
2828
* Basic implementation of the {@link ExpressionVisitor} interface.
2929
* This implementation will traverse a PathExpr object if it wraps
3030
* around a single other expression. All other methods are empty.
31-
*
32-
* @author wolf
3331
*
32+
* @author wolf
3433
*/
3534
public class BasicExpressionVisitor implements ExpressionVisitor {
3635

3736
@Override
38-
public void visit(Expression expression) {
37+
public void visit(final Expression expression) {
3938
processWrappers(expression);
4039
}
4140

4241
@Override
43-
public void visitCastExpr(CastExpression expression) {
42+
public void visitCastExpr(final CastExpression expression) {
4443
//Nothing to do
4544
}
4645

@@ -50,190 +49,193 @@ public void visitCastExpr(CastExpression expression) {
5049
* expression object.
5150
*/
5251
@Override
53-
public void visitPathExpr(PathExpr expression) {
52+
public void visitPathExpr(final PathExpr expression) {
5453
if (expression.getLength() == 1) {
5554
final Expression next = expression.getExpression(0);
5655
next.accept(this);
5756
}
5857
}
5958

6059
@Override
61-
public void visitFunctionCall(FunctionCall call) {
60+
public void visitFunctionCall(final FunctionCall call) {
6261
// Nothing to do
6362
}
6463

6564
@Override
66-
public void visitGeneralComparison(GeneralComparison comparison) {
65+
public void visitGeneralComparison(final GeneralComparison comparison) {
6766
//Nothing to do
6867
}
6968

7069
@Override
71-
public void visitUnionExpr(Union union) {
70+
public void visitUnionExpr(final Union union) {
7271
//Nothing to do
7372
}
7473

7574
@Override
76-
public void visitIntersectionExpr(Intersect intersect) {
75+
public void visitIntersectionExpr(final Intersect intersect) {
7776
//Nothing to do
7877
}
7978

8079
@Override
81-
public void visitAndExpr(OpAnd and) {
80+
public void visitAndExpr(final OpAnd and) {
8281
//Nothing to do
8382
}
8483

8584
@Override
86-
public void visitOrExpr(OpOr or) {
85+
public void visitOrExpr(final OpOr or) {
8786
//Nothing to do
8887
}
8988

9089
@Override
91-
public void visitLocationStep(LocationStep locationStep) {
90+
public void visitLocationStep(final LocationStep locationStep) {
9291
//Nothing to do
9392
}
9493

9594
@Override
96-
public void visitFilteredExpr(FilteredExpression filtered) {
95+
public void visitFilteredExpr(final FilteredExpression filtered) {
9796
//Nothing to do
9897
}
9998

10099
@Override
101-
public void visitPredicate(Predicate predicate) {
100+
public void visitPredicate(final Predicate predicate) {
102101
//Nothing to do
103102
}
104103

105104
@Override
106-
public void visitVariableReference(VariableReference ref) {
105+
public void visitVariableReference(final VariableReference ref) {
107106
//Nothing to do
108107
}
109108

110109
@Override
111-
public void visitVariableDeclaration(VariableDeclaration decl) {
112-
// Nothing to do
110+
public void visitVariableDeclaration(final VariableDeclaration decl) {
111+
// Nothing to do
113112
}
114-
115-
protected void processWrappers(Expression expr) {
113+
114+
protected void processWrappers(final Expression expr) {
116115
if (expr instanceof Atomize ||
117116
expr instanceof DynamicCardinalityCheck ||
118117
expr instanceof DynamicNameCheck ||
119118
expr instanceof DynamicTypeCheck ||
120-
expr instanceof UntypedValueCheck) {
119+
expr instanceof UntypedValueCheck ||
120+
expr instanceof PathExpr) {
121121
expr.accept(this);
122122
}
123123
}
124124

125-
public static LocationStep findFirstStep(Expression expr) {
126-
if (expr instanceof LocationStep)
127-
{return (LocationStep) expr;}
125+
public static LocationStep findFirstStep(final Expression expr) {
126+
if (expr instanceof LocationStep) {
127+
return (LocationStep) expr;
128+
}
128129
final FirstStepVisitor visitor = new FirstStepVisitor();
129130
expr.accept(visitor);
130131
return visitor.firstStep;
131132
}
132133

133-
public static List<LocationStep> findLocationSteps(Expression expr) {
134+
public static List<LocationStep> findLocationSteps(final Expression expr) {
134135
final List<LocationStep> steps = new ArrayList<>(5);
135136
if (expr instanceof LocationStep) {
136-
steps.add((LocationStep)expr);
137+
steps.add((LocationStep) expr);
137138
return steps;
138139
}
139140
expr.accept(
140-
new BasicExpressionVisitor() {
141-
@Override
142-
public void visitPathExpr(PathExpr expression) {
143-
for (int i = 0; i < expression.getLength(); i++) {
144-
final Expression next = expression.getExpression(i);
145-
next.accept(this);
146-
if (steps.size() - 1 != i) {
147-
steps.add(null);
141+
new BasicExpressionVisitor() {
142+
@Override
143+
public void visitPathExpr(final PathExpr expression) {
144+
for (int i = 0; i < expression.getLength(); i++) {
145+
final Expression next = expression.getExpression(i);
146+
next.accept(this);
147+
if (steps.size() - 1 != i) {
148+
steps.add(null);
149+
}
148150
}
149151
}
152+
153+
@Override
154+
public void visitLocationStep(final LocationStep locationStep) {
155+
steps.add(locationStep);
156+
}
150157
}
151-
@Override
152-
public void visitLocationStep(LocationStep locationStep) {
153-
steps.add(locationStep);
154-
}
155-
}
156158
);
157159
return steps;
158160
}
159161

160-
public static VariableReference findVariableRef(Expression expr) {
162+
public static VariableReference findVariableRef(final Expression expr) {
161163
final VariableRefVisitor visitor = new VariableRefVisitor();
162164
expr.accept(visitor);
163165
return visitor.ref;
164166
}
165167

166168
@Override
167-
public void visitForExpression(ForExpr forExpr) {
169+
public void visitForExpression(final ForExpr forExpr) {
168170
//Nothing to do
169171
}
170172

171173
@Override
172-
public void visitLetExpression(LetExpr letExpr) {
174+
public void visitLetExpression(final LetExpr letExpr) {
173175
//Nothing to do
174176
}
175177

176178
@Override
177-
public void visitOrderByClause(OrderByClause orderBy) {
179+
public void visitOrderByClause(final OrderByClause orderBy) {
178180
// Nothing to do
179181
}
180182

181183
@Override
182-
public void visitGroupByClause(GroupByClause groupBy) {
184+
public void visitGroupByClause(final GroupByClause groupBy) {
183185
// Nothing to do
184186
}
185187

186188
@Override
187-
public void visitWhereClause(WhereClause where) {
189+
public void visitWhereClause(final WhereClause where) {
188190
// Nothing to do
189191
}
190192

191193
@Override
192-
public void visitBuiltinFunction(Function function) {
194+
public void visitBuiltinFunction(final Function function) {
193195
//Nothing to do
194196
}
195197

196198
@Override
197-
public void visitUserFunction(UserDefinedFunction function) {
199+
public void visitUserFunction(final UserDefinedFunction function) {
198200
//Nothing to do
199201
}
200202

201203
@Override
202-
public void visitConditional(ConditionalExpression conditional) {
204+
public void visitConditional(final ConditionalExpression conditional) {
203205
//Nothing to do
204206
}
205207

206208
@Override
207-
public void visitTryCatch(TryCatchExpression conditional) {
209+
public void visitTryCatch(final TryCatchExpression conditional) {
208210
//Nothing to do
209211
}
210212

211213
@Override
212-
public void visitDocumentConstructor(DocumentConstructor constructor) {
213-
// Nothing to do
214+
public void visitDocumentConstructor(final DocumentConstructor constructor) {
215+
// Nothing to do
214216
}
215-
216-
public void visitElementConstructor(ElementConstructor constructor) {
217+
218+
public void visitElementConstructor(final ElementConstructor constructor) {
217219
//Nothing to do
218220
}
219221

220222
@Override
221-
public void visitTextConstructor(DynamicTextConstructor constructor) {
223+
public void visitTextConstructor(final DynamicTextConstructor constructor) {
222224
//Nothing to do
223225
}
224226

225227
@Override
226-
public void visitAttribConstructor(AttributeConstructor constructor) {
228+
public void visitAttribConstructor(final AttributeConstructor constructor) {
227229
//Nothing to do
228230
}
229231

230232
@Override
231-
public void visitAttribConstructor(DynamicAttributeConstructor constructor) {
233+
public void visitAttribConstructor(final DynamicAttributeConstructor constructor) {
232234
//Nothing to do
233235
}
234236

235237
@Override
236-
public void visitSimpleMapOperator(OpSimpleMap simpleMap) {
238+
public void visitSimpleMapOperator(final OpSimpleMap simpleMap) {
237239
// Nothing to do
238240
}
239241

@@ -246,7 +248,7 @@ public LocationStep getFirstStep() {
246248
}
247249

248250
@Override
249-
public void visitLocationStep(LocationStep locationStep) {
251+
public void visitLocationStep(final LocationStep locationStep) {
250252
firstStep = locationStep;
251253
}
252254
}
@@ -256,12 +258,12 @@ public static class VariableRefVisitor extends BasicExpressionVisitor {
256258
private VariableReference ref = null;
257259

258260
@Override
259-
public void visitVariableReference(VariableReference ref) {
261+
public void visitVariableReference(final VariableReference ref) {
260262
this.ref = ref;
261263
}
262264

263265
@Override
264-
public void visitPathExpr(PathExpr expression) {
266+
public void visitPathExpr(final PathExpr expression) {
265267
for (int i = 0; i < expression.getLength(); i++) {
266268
final Expression next = expression.getExpression(i);
267269
next.accept(this);

0 commit comments

Comments
 (0)