All Downloads are FREE. Search and download functionalities are using the official Maven repository.

lux.functions.Count Maven / Gradle / Ivy

There is a newer version: 1.1.0
Show newest version
package lux.functions;

import java.io.IOException;

import lux.Evaluator;
import lux.solr.CloudSearchIterator;
import lux.xpath.FunCall;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.tree.iter.SingletonIterator;
import net.sf.saxon.tree.iter.UnfailingIterator;
import net.sf.saxon.value.Int64Value;
import net.sf.saxon.value.SequenceType;

import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;

/**
 * function lux:count($query as item()) as xs:integer
 * 

* This function counts the number of results of a search. It is faster and uses less memory * than calling fn:count() on the search results themselves because it does not need to load * the result documents in memory. See {@link Search} for an explanation of the supported * $query formats. *

*/ public class Count extends SearchBase { public Count() { } @Override public StructuredQName getFunctionQName() { return new StructuredQName("lux", FunCall.LUX_NAMESPACE, "count"); } @Override public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) { return SequenceType.SINGLE_INTEGER; } @Override public boolean trustResultType () { return true; } @Override public UnfailingIterator iterate (Query query, Evaluator saxon, String sortCriteria, int start) throws XPathException { int count = 0; long t = System.currentTimeMillis(); try { DocIdSetIterator counter = saxon.getSearcher().search(query); while (counter.nextDoc() != Scorer.NO_MORE_DOCS) { ++count; } } catch (IOException e) { throw new XPathException (e); } saxon.getQueryStats().totalTime = System.currentTimeMillis() - t; saxon.getQueryStats().docCount += count; return SingletonIterator.makeIterator(new Int64Value(count)); } @Override protected UnfailingIterator iterateDistributed(String query, QueryParser queryParser, Evaluator eval, String sortCriteria, int start) throws XPathException { try { long count = new CloudSearchIterator (eval, query, queryParser, sortCriteria, start).count(); return SingletonIterator.makeIterator(new Int64Value(count)); } catch (Exception e) { throw new XPathException (e); } } } /* 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/. */




© 2015 - 2024 Weber Informatics LLC | Privacy Policy