diff --git a/exist-core/src/main/java/org/exist/xquery/functions/fn/FnModule.java b/exist-core/src/main/java/org/exist/xquery/functions/fn/FnModule.java index a3b172e449..3706597492 100644 --- a/exist-core/src/main/java/org/exist/xquery/functions/fn/FnModule.java +++ b/exist-core/src/main/java/org/exist/xquery/functions/fn/FnModule.java @@ -210,7 +210,7 @@ public class FnModule extends AbstractInternalModule { new FunctionDef(FunRemove.signature, FunRemove.class), new FunctionDef(FunReplace.FS_REPLACE[0], FunReplace.class), new FunctionDef(FunReplace.FS_REPLACE[1], FunReplace.class), - new FunctionDef(FunReverse.signature, FunReverse.class), + new FunctionDef(FunReverse.FS_REVERSE, FunReverse.class), new FunctionDef(FunResolveURI.signatures[0], FunResolveURI.class), new FunctionDef(FunResolveURI.signatures[1], FunResolveURI.class), new FunctionDef(FunRoot.signatures[0], FunRoot.class), diff --git a/exist-core/src/main/java/org/exist/xquery/functions/fn/FunReverse.java b/exist-core/src/main/java/org/exist/xquery/functions/fn/FunReverse.java index d504465374..180e898585 100644 --- a/exist-core/src/main/java/org/exist/xquery/functions/fn/FunReverse.java +++ b/exist-core/src/main/java/org/exist/xquery/functions/fn/FunReverse.java @@ -45,95 +45,49 @@ */ package org.exist.xquery.functions.fn; -import org.exist.dom.QName; -import org.exist.xquery.*; -import org.exist.xquery.value.FunctionParameterSequenceType; -import org.exist.xquery.value.FunctionReturnSequenceType; -import org.exist.xquery.value.Item; +import org.exist.xquery.BasicFunction; +import org.exist.xquery.FunctionSignature; +import org.exist.xquery.XPathException; +import org.exist.xquery.XQueryContext; import org.exist.xquery.value.Sequence; -import org.exist.xquery.value.SequenceIterator; -import org.exist.xquery.value.SequenceType; -import org.exist.xquery.value.Type; import org.exist.xquery.value.ValueSequence; +import org.exist.xquery.value.Type; + +import static org.exist.xquery.FunctionDSL.optManyParam; +import static org.exist.xquery.FunctionDSL.returnsOptMany; +import static org.exist.xquery.functions.fn.FnModule.functionSignature; /** * Implements the fn:reverse function. * * @author Piotr Kaminski + * @author Adam Retter */ -public class FunReverse extends Function { +public class FunReverse extends BasicFunction { - public final static FunctionSignature signature = - new FunctionSignature( - new QName("reverse", FnModule.NAMESPACE_URI), - "Reverses the order of items in a sequence. If the argument is an empty" + - "sequence, the empty sequence is returned.", - new SequenceType[] {new FunctionParameterSequenceType("arg", Type.ITEM, Cardinality.ZERO_OR_MORE, "The sequence to reverse")}, - new FunctionReturnSequenceType(Type.ITEM, Cardinality.ZERO_OR_MORE, "the reverse order sequence")); + public static final FunctionSignature FS_REVERSE = functionSignature( + "reverse", + "Reverses the order of items in a sequence. If the argument is an empty sequence, the empty sequence is returned.", + returnsOptMany(Type.ITEM, "The reverse order sequence"), + optManyParam("arg", Type.ITEM, "The sequence to reverse") + ); - public FunReverse(XQueryContext context) { - super(context, signature); - } - - public void analyze(final AnalyzeContextInfo contextInfo) throws XPathException { - inPredicate = (contextInfo.getFlags() & IN_PREDICATE) > 0; - contextId = contextInfo.getContextId(); - contextInfo.setParent(this); - - final SequenceType[] argumentTypes = getSignature().getArgumentTypes(); - for (int i = 0; i < getArgumentCount(); i++) { - final Expression arg = getArgument(i); - - // call analyze for each argument - final AnalyzeContextInfo argContextInfo = new AnalyzeContextInfo(contextInfo); - arg.analyze(argContextInfo); - if (i == 0) { - contextInfo.setStaticReturnType(argContextInfo.getStaticReturnType()); - } - - if (!argumentsChecked) { - // statically check the argument - SequenceType argType = null; - if (argumentTypes != null && i < argumentTypes.length) { - argType = argumentTypes[i]; - } - checkArgument(arg, argType, argContextInfo, i + 1); - } - } - argumentsChecked = true; + public FunReverse(final XQueryContext context, final FunctionSignature signature) { + super(context, signature); } - public Sequence eval(Sequence contextSequence, Item contextItem) throws XPathException { - if (context.getProfiler().isEnabled()) { - context.getProfiler().start(this); - context.getProfiler().message(this, Profiler.DEPENDENCIES, "DEPENDENCIES", Dependency.getDependenciesName(this.getDependencies())); - if (contextSequence != null) - {context.getProfiler().message(this, Profiler.START_SEQUENCES, "CONTEXT SEQUENCE", contextSequence);} - if (contextItem != null) - {context.getProfiler().message(this, Profiler.START_SEQUENCES, "CONTEXT ITEM", contextItem.toSequence());} - } - - Sequence result; - final Sequence seq = getArguments(contextSequence, contextItem)[0]; - if (seq.isEmpty()) - {result = Sequence.EMPTY_SEQUENCE;} - else { - final Sequence tmp = new ValueSequence(); - Item item; - for(final SequenceIterator i = seq.iterate(); i.hasNext(); ) { - item = i.nextItem(); - tmp.add(item); - } - result = new ValueSequence(); - for (int i = seq.getItemCount() - 1; i >= 0; i--) { - result.add(tmp.itemAt(i)); - } + @Override + public Sequence eval(final Sequence[] args, final Sequence contextSequence) throws XPathException { + final Sequence seq = args[0]; + final Sequence result; + if (seq.isEmpty()) { + result = Sequence.EMPTY_SEQUENCE; + } else { + result = new ValueSequence(); + for (int i = seq.getItemCount() - 1; i >= 0; i--) { + result.add(seq.itemAt(i)); + } } - - if (context.getProfiler().isEnabled()) - {context.getProfiler().end(this, "", result);} - return result; - } - + } }