Skip to content

Commit 89efa7c

Browse files
committed
[optimize] Most Extension Expressions have only one pragma
1 parent 8e323e4 commit 89efa7c

File tree

1 file changed

+40
-19
lines changed

1 file changed

+40
-19
lines changed

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

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,20 @@
2626
import org.exist.xquery.value.Item;
2727
import org.exist.xquery.value.Sequence;
2828

29-
import java.util.ArrayList;
30-
import java.util.List;
29+
import javax.annotation.Nullable;
30+
import java.util.Arrays;
3131

3232
/**
3333
* Implements an XQuery extension expression. An extension expression starts with
34-
* a list of pragmas, followed by an expression enclosed in curly braces. For evaluation
35-
* details check {{@link #eval(Sequence, Item)}.
34+
* a one or more pragmas, followed by an expression enclosed in curly braces. For evaluation
35+
* details check {@link #eval(Sequence, Item)}.
3636
*
3737
* @author wolf
3838
*/
3939
public class ExtensionExpression extends AbstractExpression {
4040

41+
@Nullable private Pragma[] pragmas = null;
4142
private Expression innerExpression;
42-
private final List<Pragma> pragmas = new ArrayList<>(3);
4343

4444
public ExtensionExpression(final XQueryContext context) {
4545
super(context);
@@ -50,7 +50,12 @@ public void setExpression(final Expression inner) {
5050
}
5151

5252
public void addPragma(final Pragma pragma) {
53-
pragmas.add(pragma);
53+
if (pragmas == null) {
54+
pragmas = new Pragma[1];
55+
} else {
56+
pragmas = Arrays.copyOf(pragmas, pragmas.length + 1);
57+
}
58+
pragmas[pragmas.length - 1] = pragma;
5459
}
5560

5661
/**
@@ -64,12 +69,14 @@ public void addPragma(final Pragma pragma) {
6469
@Override
6570
public Sequence eval(final Sequence contextSequence, final Item contextItem) throws XPathException {
6671
callBefore(contextSequence);
67-
Sequence result = null;
68-
for (final Pragma pragma : pragmas) {
69-
final Sequence temp = pragma.eval(contextSequence, contextItem);
70-
if (temp != null) {
71-
result = temp;
72-
break;
72+
@Nullable Sequence result = null;
73+
if (pragmas != null) {
74+
for (final Pragma pragma : pragmas) {
75+
final Sequence temp = pragma.eval(contextSequence, contextItem);
76+
if (temp != null) {
77+
result = temp;
78+
break;
79+
}
7380
}
7481
}
7582
if (result == null) {
@@ -80,12 +87,20 @@ public Sequence eval(final Sequence contextSequence, final Item contextItem) thr
8087
}
8188

8289
private void callAfter() throws XPathException {
90+
if (pragmas == null) {
91+
return;
92+
}
93+
8394
for (final Pragma pragma : pragmas) {
8495
pragma.after(context, innerExpression);
8596
}
8697
}
8798

8899
private void callBefore(final Sequence contextSequence) throws XPathException {
100+
if (pragmas == null) {
101+
return;
102+
}
103+
89104
for (final Pragma pragma : pragmas) {
90105
pragma.before(context, innerExpression, contextSequence);
91106
}
@@ -99,17 +114,21 @@ public int returnsType() {
99114
@Override
100115
public void analyze(final AnalyzeContextInfo contextInfo) throws XPathException {
101116
final AnalyzeContextInfo newContext = new AnalyzeContextInfo(contextInfo);
102-
for (final Pragma pragma : pragmas) {
103-
pragma.analyze(newContext);
117+
if (pragmas != null) {
118+
for (final Pragma pragma : pragmas) {
119+
pragma.analyze(newContext);
120+
}
104121
}
105122
innerExpression.analyze(newContext);
106123
}
107124

108125
@Override
109126
public void dump(final ExpressionDumper dumper) {
110-
for (final Pragma pragma : pragmas) {
111-
pragma.dump(dumper);
112-
dumper.nl();
127+
if (pragmas != null) {
128+
for (final Pragma pragma : pragmas) {
129+
pragma.dump(dumper);
130+
dumper.nl();
131+
}
113132
}
114133
dumper.display('{');
115134
dumper.startIndent();
@@ -148,8 +167,10 @@ public int getPrimaryAxis() {
148167
public void resetState(final boolean postOptimization) {
149168
super.resetState(postOptimization);
150169
innerExpression.resetState(postOptimization);
151-
for (final Pragma pragma : pragmas) {
152-
pragma.resetState(postOptimization);
170+
if (pragmas != null) {
171+
for (final Pragma pragma : pragmas) {
172+
pragma.resetState(postOptimization);
173+
}
153174
}
154175
}
155176

0 commit comments

Comments
 (0)