package lux.functions; import lux.Evaluator; import lux.xpath.FunCall; import net.sf.saxon.expr.XPathContext; import net.sf.saxon.lib.ExtensionFunctionCall; import net.sf.saxon.lib.ExtensionFunctionDefinition; import net.sf.saxon.om.Item; import net.sf.saxon.om.Sequence; import net.sf.saxon.om.StructuredQName; import net.sf.saxon.trans.XPathException; import net.sf.saxon.value.SequenceType; import org.apache.lucene.search.Query; import org.slf4j.LoggerFactory; /** * <code>function lux:contains($query as item()) as xs:boolean</code> * <p>Executes a Lucene search query and returns true if the query matches the context item. * Queries are parsed as for lux:search().</p> */ public class Contains extends ExtensionFunctionDefinition { @Override public StructuredQName getFunctionQName() { return new StructuredQName("lux", FunCall.LUX_NAMESPACE, "contains"); } @Override public SequenceType[] getArgumentTypes() { return new SequenceType[] { SequenceType.SINGLE_ITEM, // query: as element node or string }; } @Override public int getMaximumNumberOfArguments() { return 1; } @Override public SequenceType getResultType(SequenceType[] arg0) { return SequenceType.SINGLE_BOOLEAN; } @Override public ExtensionFunctionCall makeCallExpression() { return new ContainsCall (); } public class ContainsCall extends NamespaceAwareFunctionCall { @Override public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException { Item queryArg = arguments[0].head(); // TODO: refactor to NAFC? Evaluator eval = SearchBase.getEvaluator(context); Query query = parseQuery(queryArg, eval); LoggerFactory.getLogger(SearchBase.class).debug("executing query: {}", query); // TODO: implement by (1) enhancing PathOptimizer to incorporate our query with the // context query, and (2) traversing our context item using XmlHighlighter with an enhanced // HighlightFormatter that can terminate early and cause a result to be returned indicating // a match was found throw new XPathException ("lux:contains is not implemented"); } } }