package lux.functions; import lux.functions.SearchBase.SearchCall; import lux.index.FieldRole; import net.sf.saxon.expr.Container; import net.sf.saxon.expr.Expression; import net.sf.saxon.expr.Literal; import net.sf.saxon.expr.StaticContext; import net.sf.saxon.functions.IntegratedFunctionCall; import net.sf.saxon.functions.IntegratedFunctionLibrary; import net.sf.saxon.lib.ExtensionFunctionCall; import net.sf.saxon.om.StructuredQName; import net.sf.saxon.s9api.Processor; import net.sf.saxon.trans.XPathException; /** * Extension of Saxon's function library wraps ExtensionFunctionCall in LuxFunctionCall, enabling * Lux to override some of the function's properties. */ public class LuxFunctionLibrary extends IntegratedFunctionLibrary { @Override public Expression bind(StructuredQName functionName, int arity, Expression[] staticArgs, StaticContext env, Container container) throws XPathException { IntegratedFunctionCall ifc = (IntegratedFunctionCall) super.bind(functionName, arity, staticArgs, env, container); if (ifc == null) { return null; } ExtensionFunctionCall f = ifc.getFunction(); // Is the search sorting results in document order: ie do we have a single sort criterion "lux:docid"? if (f instanceof SearchCall && staticArgs.length > 1 && staticArgs[1] instanceof Literal && ((Literal)staticArgs[1]).getValue().getStringValue().equals(FieldRole.LUX_DOCID)) { LuxFunctionCall fc = new LuxFunctionCall(f); fc.setFunctionName(functionName); fc.setArguments(staticArgs); return fc; } return ifc; } public static void registerFunctions (Processor processor) { processor.registerExtensionFunction(new Search()); processor.registerExtensionFunction(new Count()); processor.registerExtensionFunction(new Exists()); processor.registerExtensionFunction(new FieldTerms()); processor.registerExtensionFunction(new Key()); processor.registerExtensionFunction(new Transform()); processor.registerExtensionFunction(new Eval()); processor.registerExtensionFunction(new InsertDocument()); processor.registerExtensionFunction(new DeleteDocument()); processor.registerExtensionFunction(new Commit()); processor.registerExtensionFunction(new Highlight()); } } /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */