26
26
import org .exist .xquery .value .Item ;
27
27
import org .exist .xquery .value .Sequence ;
28
28
29
- import java . util . ArrayList ;
30
- import java .util .List ;
29
+ import javax . annotation . Nullable ;
30
+ import java .util .Arrays ;
31
31
32
32
/**
33
33
* 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)}.
36
36
*
37
37
* @author wolf
38
38
*/
39
39
public class ExtensionExpression extends AbstractExpression {
40
40
41
+ @ Nullable private Pragma [] pragmas = null ;
41
42
private Expression innerExpression ;
42
- private final List <Pragma > pragmas = new ArrayList <>(3 );
43
43
44
44
public ExtensionExpression (final XQueryContext context ) {
45
45
super (context );
@@ -50,7 +50,12 @@ public void setExpression(final Expression inner) {
50
50
}
51
51
52
52
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 ;
54
59
}
55
60
56
61
/**
@@ -64,12 +69,14 @@ public void addPragma(final Pragma pragma) {
64
69
@ Override
65
70
public Sequence eval (final Sequence contextSequence , final Item contextItem ) throws XPathException {
66
71
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
+ }
73
80
}
74
81
}
75
82
if (result == null ) {
@@ -80,12 +87,20 @@ public Sequence eval(final Sequence contextSequence, final Item contextItem) thr
80
87
}
81
88
82
89
private void callAfter () throws XPathException {
90
+ if (pragmas == null ) {
91
+ return ;
92
+ }
93
+
83
94
for (final Pragma pragma : pragmas ) {
84
95
pragma .after (context , innerExpression );
85
96
}
86
97
}
87
98
88
99
private void callBefore (final Sequence contextSequence ) throws XPathException {
100
+ if (pragmas == null ) {
101
+ return ;
102
+ }
103
+
89
104
for (final Pragma pragma : pragmas ) {
90
105
pragma .before (context , innerExpression , contextSequence );
91
106
}
@@ -99,17 +114,21 @@ public int returnsType() {
99
114
@ Override
100
115
public void analyze (final AnalyzeContextInfo contextInfo ) throws XPathException {
101
116
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
+ }
104
121
}
105
122
innerExpression .analyze (newContext );
106
123
}
107
124
108
125
@ Override
109
126
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
+ }
113
132
}
114
133
dumper .display ('{' );
115
134
dumper .startIndent ();
@@ -148,8 +167,10 @@ public int getPrimaryAxis() {
148
167
public void resetState (final boolean postOptimization ) {
149
168
super .resetState (postOptimization );
150
169
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
+ }
153
174
}
154
175
}
155
176
0 commit comments