Example usage for org.apache.solr.handler.component ResponseBuilder setResult

List of usage examples for org.apache.solr.handler.component ResponseBuilder setResult

Introduction

In this page you can find the example usage for org.apache.solr.handler.component ResponseBuilder setResult.

Prototype

public void setResult(QueryResult result) 

Source Link

Document

Sets results from a SolrIndexSearcher.QueryResult.

Usage

From source file:lux.solr.XQueryComponent.java

License:Mozilla Public License

protected void evaluateQuery(ResponseBuilder rb, int start, int len) {
    String query = rb.getQueryString();
    SolrQueryRequest req = rb.req;/*ww w  .  j  a v  a2  s.  c  o  m*/
    SolrQueryResponse rsp = rb.rsp;
    if (StringUtils.isBlank(query)) {
        rsp.add("xpath-error", "query was blank");
        return;
    }
    SolrParams params = req.getParams();
    long timeAllowed = (long) params.getInt(CommonParams.TIME_ALLOWED, -1);
    XQueryExecutable expr;
    LuxSearcher searcher = new LuxSearcher(rb.req.getSearcher());
    DocWriter docWriter = new SolrDocWriter(this, rb.req.getCore());
    Compiler compiler = solrIndexConfig.getCompiler();
    SolrQueryContext context = new SolrQueryContext(this, req);
    if (rb.shards != null && rb.req.getParams().getBool("distrib", true)) {
        // This is a distributed request; pass in the ResponseBuilder so it will be
        // available to a subquery.
        context.setResponseBuilder(rb);
        // also capture the current set of shards
        shards = rb.shards;
        slices = rb.slices;
    }
    SolrSearchService searchService = new SolrSearchService(context, new LuxSearchQueryParser());
    Evaluator eval = new Evaluator(compiler, searcher, docWriter, searchService);
    // track which evaluator we are using in a threadlocal container
    evalHolder.set(eval);
    TransformErrorListener errorListener = eval.getErrorListener();
    try {
        URI baseURI = queryPath == null ? null : java.net.URI.create(queryPath);
        expr = compiler.compile(query, errorListener, baseURI, null);
    } catch (LuxException ex) {
        // ex.printStackTrace();
        String err = formatError(query, errorListener);
        if (StringUtils.isEmpty(err)) {
            err = ex.getMessage();
        }
        rsp.add("xpath-error", err);
        // don't close: this forces a commit()
        // evaluator.close();
        return;
    }
    // SolrIndexSearcher.QueryResult result = new
    // SolrIndexSearcher.QueryResult();
    NamedList<Object> xpathResults = new NamedList<Object>();
    long tstart = System.currentTimeMillis();
    int count = 0;
    bindRequestVariables(rb, req, expr, compiler, eval, context);
    Iterator<XdmItem> queryResults = eval.iterator(expr, context);
    String err = null;
    while (queryResults.hasNext()) {
        XdmItem xpathResult = queryResults.next();
        if (++count < start) {
            continue;
        }
        if (count == 1 && !xpathResult.isAtomicValue()) {
            net.sf.saxon.s9api.QName name = ((XdmNode) xpathResult).getNodeName();
            if (name != null && name.getNamespaceURI().equals(EXPATH_HTTP_NS)
                    && name.getLocalName().equals("response")) {
                err = handleEXPathResponse(req, rsp, xpathResults, xpathResult);
                if (queryResults.hasNext()) {
                    logger.warn(
                            "Ignoring results following http:response, which should be the sole item in its result");
                }
                break;
            }
        }
        err = safeAddResult(xpathResults, xpathResult);
        if (err != null) {
            xpathResult = null;
            break;
        }
        if ((len > 0 && xpathResults.size() >= len)
                || (timeAllowed > 0 && (System.currentTimeMillis() - tstart) > timeAllowed)) {
            break;
        }
    }
    ArrayList<TransformerException> errors = eval.getErrorListener().getErrors();
    if (!errors.isEmpty()) {
        err = formatError(query, errors, eval.getQueryStats());
        if (xpathResults.size() == 0) {
            xpathResults = null; // throw a 400 error; don't return partial
                                 // results
        }
    }
    if (err != null) {
        rsp.add("xpath-error", err);
    }
    if (rb.getResults() == null) {
        // create a dummy doc list if previous query processing didn't retrieve any docs
        // In distributed operation, there will be doc results, otherwise none.
        SolrIndexSearcher.QueryResult result = new SolrIndexSearcher.QueryResult();
        result.setDocList(new DocSlice(0, 0, null, null, eval.getQueryStats().docCount, 0));
        rb.setResult(result);
        rsp.add("response", rb.getResults().docList);
    }
    if (xpathResults != null) {
        rsp.add("xpath-results", xpathResults);
        if (logger.isDebugEnabled()) {
            logger.debug("retrieved: " + eval.getDocReader().getCacheMisses() + " docs, " + xpathResults.size()
                    + " results, " + (System.currentTimeMillis() - tstart) + "ms");
        }
    } else {
        logger.warn("xquery evaluation error: " + eval.getDocReader().getCacheMisses() + " docs, "
                + "0 results, " + (System.currentTimeMillis() - tstart) + "ms");
    }
    if (err == null && context.isCommitPending()) {
        doCommit();
    }
}