Skip to content

Commit 5a1c5e9

Browse files
authored
Merge pull request #90 from evolvedbinary/7.x.x/feature/optimize-fn-reverse
[7.x.x] Optimize fn:reverse by removing unnecessary work
2 parents 3d3b72c + 23cbf62 commit 5a1c5e9

File tree

2 files changed

+32
-78
lines changed

2 files changed

+32
-78
lines changed

exist-core/src/main/java/org/exist/xquery/functions/fn/FnModule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ public class FnModule extends AbstractInternalModule {
210210
new FunctionDef(FunRemove.signature, FunRemove.class),
211211
new FunctionDef(FunReplace.FS_REPLACE[0], FunReplace.class),
212212
new FunctionDef(FunReplace.FS_REPLACE[1], FunReplace.class),
213-
new FunctionDef(FunReverse.signature, FunReverse.class),
213+
new FunctionDef(FunReverse.FS_REVERSE, FunReverse.class),
214214
new FunctionDef(FunResolveURI.signatures[0], FunResolveURI.class),
215215
new FunctionDef(FunResolveURI.signatures[1], FunResolveURI.class),
216216
new FunctionDef(FunRoot.signatures[0], FunRoot.class),

exist-core/src/main/java/org/exist/xquery/functions/fn/FunReverse.java

Lines changed: 31 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -45,95 +45,49 @@
4545
*/
4646
package org.exist.xquery.functions.fn;
4747

48-
import org.exist.dom.QName;
49-
import org.exist.xquery.*;
50-
import org.exist.xquery.value.FunctionParameterSequenceType;
51-
import org.exist.xquery.value.FunctionReturnSequenceType;
52-
import org.exist.xquery.value.Item;
48+
import org.exist.xquery.BasicFunction;
49+
import org.exist.xquery.FunctionSignature;
50+
import org.exist.xquery.XPathException;
51+
import org.exist.xquery.XQueryContext;
5352
import org.exist.xquery.value.Sequence;
54-
import org.exist.xquery.value.SequenceIterator;
55-
import org.exist.xquery.value.SequenceType;
56-
import org.exist.xquery.value.Type;
5753
import org.exist.xquery.value.ValueSequence;
54+
import org.exist.xquery.value.Type;
55+
56+
import static org.exist.xquery.FunctionDSL.optManyParam;
57+
import static org.exist.xquery.FunctionDSL.returnsOptMany;
58+
import static org.exist.xquery.functions.fn.FnModule.functionSignature;
5859

5960
/**
6061
* Implements the fn:reverse function.
6162
*
6263
* @author <a href="mailto:[email protected]">Piotr Kaminski</a>
64+
* @author <a href="mailto:[email protected]">Adam Retter</a>
6365
*/
64-
public class FunReverse extends Function {
66+
public class FunReverse extends BasicFunction {
6567

66-
public final static FunctionSignature signature =
67-
new FunctionSignature(
68-
new QName("reverse", FnModule.NAMESPACE_URI),
69-
"Reverses the order of items in a sequence. If the argument is an empty" +
70-
"sequence, the empty sequence is returned.",
71-
new SequenceType[] {new FunctionParameterSequenceType("arg", Type.ITEM, Cardinality.ZERO_OR_MORE, "The sequence to reverse")},
72-
new FunctionReturnSequenceType(Type.ITEM, Cardinality.ZERO_OR_MORE, "the reverse order sequence"));
68+
public static final FunctionSignature FS_REVERSE = functionSignature(
69+
"reverse",
70+
"Reverses the order of items in a sequence. If the argument is an empty sequence, the empty sequence is returned.",
71+
returnsOptMany(Type.ITEM, "The reverse order sequence"),
72+
optManyParam("arg", Type.ITEM, "The sequence to reverse")
73+
);
7374

74-
public FunReverse(XQueryContext context) {
75-
super(context, signature);
76-
}
77-
78-
public void analyze(final AnalyzeContextInfo contextInfo) throws XPathException {
79-
inPredicate = (contextInfo.getFlags() & IN_PREDICATE) > 0;
80-
contextId = contextInfo.getContextId();
81-
contextInfo.setParent(this);
82-
83-
final SequenceType[] argumentTypes = getSignature().getArgumentTypes();
84-
for (int i = 0; i < getArgumentCount(); i++) {
85-
final Expression arg = getArgument(i);
86-
87-
// call analyze for each argument
88-
final AnalyzeContextInfo argContextInfo = new AnalyzeContextInfo(contextInfo);
89-
arg.analyze(argContextInfo);
90-
if (i == 0) {
91-
contextInfo.setStaticReturnType(argContextInfo.getStaticReturnType());
92-
}
93-
94-
if (!argumentsChecked) {
95-
// statically check the argument
96-
SequenceType argType = null;
97-
if (argumentTypes != null && i < argumentTypes.length) {
98-
argType = argumentTypes[i];
99-
}
100-
checkArgument(arg, argType, argContextInfo, i + 1);
101-
}
102-
}
103-
argumentsChecked = true;
75+
public FunReverse(final XQueryContext context, final FunctionSignature signature) {
76+
super(context, signature);
10477
}
10578

106-
public Sequence eval(Sequence contextSequence, Item contextItem) throws XPathException {
107-
if (context.getProfiler().isEnabled()) {
108-
context.getProfiler().start(this);
109-
context.getProfiler().message(this, Profiler.DEPENDENCIES, "DEPENDENCIES", Dependency.getDependenciesName(this.getDependencies()));
110-
if (contextSequence != null)
111-
{context.getProfiler().message(this, Profiler.START_SEQUENCES, "CONTEXT SEQUENCE", contextSequence);}
112-
if (contextItem != null)
113-
{context.getProfiler().message(this, Profiler.START_SEQUENCES, "CONTEXT ITEM", contextItem.toSequence());}
114-
}
115-
116-
Sequence result;
117-
final Sequence seq = getArguments(contextSequence, contextItem)[0];
118-
if (seq.isEmpty())
119-
{result = Sequence.EMPTY_SEQUENCE;}
120-
else {
121-
final Sequence tmp = new ValueSequence();
122-
Item item;
123-
for(final SequenceIterator i = seq.iterate(); i.hasNext(); ) {
124-
item = i.nextItem();
125-
tmp.add(item);
126-
}
127-
result = new ValueSequence();
128-
for (int i = seq.getItemCount() - 1; i >= 0; i--) {
129-
result.add(tmp.itemAt(i));
130-
}
79+
@Override
80+
public Sequence eval(final Sequence[] args, final Sequence contextSequence) throws XPathException {
81+
final Sequence seq = args[0];
82+
final Sequence result;
83+
if (seq.isEmpty()) {
84+
result = Sequence.EMPTY_SEQUENCE;
85+
} else {
86+
result = new ValueSequence();
87+
for (int i = seq.getItemCount() - 1; i >= 0; i--) {
88+
result.add(seq.itemAt(i));
89+
}
13190
}
132-
133-
if (context.getProfiler().isEnabled())
134-
{context.getProfiler().end(this, "", result);}
135-
13691
return result;
137-
}
138-
92+
}
13993
}

0 commit comments

Comments
 (0)