Search in sources :

Example 1 with FacetDebugInfo

use of org.apache.solr.search.facet.FacetDebugInfo in project lucene-solr by apache.

the class DebugComponent method process.

@SuppressWarnings("unchecked")
@Override
public void process(ResponseBuilder rb) throws IOException {
    if (rb.isDebug()) {
        DocList results = null;
        //some internal grouping requests won't have results value set
        if (rb.getResults() != null) {
            results = rb.getResults().docList;
        }
        NamedList stdinfo = SolrPluginUtils.doStandardDebug(rb.req, rb.getQueryString(), rb.wrap(rb.getQuery()), results, rb.isDebugQuery(), rb.isDebugResults());
        NamedList info = rb.getDebugInfo();
        if (info == null) {
            rb.setDebugInfo(stdinfo);
            info = stdinfo;
        } else {
            info.addAll(stdinfo);
        }
        FacetDebugInfo fdebug = (FacetDebugInfo) (rb.req.getContext().get("FacetDebugInfo"));
        if (fdebug != null) {
            info.add("facet-trace", fdebug.getFacetDebugInfo());
        }
        fdebug = (FacetDebugInfo) (rb.req.getContext().get("FacetDebugInfo-nonJson"));
        if (fdebug != null) {
            info.add("facet-debug", fdebug.getFacetDebugInfo());
        }
        if (rb.req.getJSON() != null) {
            info.add(JSON, rb.req.getJSON());
        }
        if (rb.isDebugQuery() && rb.getQparser() != null) {
            rb.getQparser().addDebugInfo(rb.getDebugInfo());
        }
        if (null != rb.getDebugInfo()) {
            if (rb.isDebugQuery() && null != rb.getFilters()) {
                info.add("filter_queries", rb.req.getParams().getParams(FQ));
                List<String> fqs = new ArrayList<>(rb.getFilters().size());
                for (Query fq : rb.getFilters()) {
                    fqs.add(QueryParsing.toString(fq, rb.req.getSchema()));
                }
                info.add("parsed_filter_queries", fqs);
            }
            // Add this directly here?
            rb.rsp.add("debug", rb.getDebugInfo());
        }
    }
}
Also used : FacetDebugInfo(org.apache.solr.search.facet.FacetDebugInfo) Query(org.apache.lucene.search.Query) NamedList(org.apache.solr.common.util.NamedList) ArrayList(java.util.ArrayList) DocList(org.apache.solr.search.DocList)

Example 2 with FacetDebugInfo

use of org.apache.solr.search.facet.FacetDebugInfo in project lucene-solr by apache.

the class SimpleFacets method getFacetFieldCounts.

/**
   * Returns a list of value constraints and the associated facet counts 
   * for each facet field specified in the params.
   *
   * @see FacetParams#FACET_FIELD
   * @see #getFieldMissingCount
   * @see #getFacetTermEnumCounts
   */
@SuppressWarnings("unchecked")
public NamedList<Object> getFacetFieldCounts() throws IOException, SyntaxError {
    NamedList<Object> res = new SimpleOrderedMap<>();
    String[] facetFs = global.getParams(FacetParams.FACET_FIELD);
    if (null == facetFs) {
        return res;
    }
    // Passing a negative number for FACET_THREADS implies an unlimited number of threads is acceptable.
    // Also, a subtlety of directExecutor is that no matter how many times you "submit" a job, it's really
    // just a method call in that it's run by the calling thread.
    int maxThreads = req.getParams().getInt(FacetParams.FACET_THREADS, 0);
    Executor executor = maxThreads == 0 ? directExecutor : facetExecutor;
    final Semaphore semaphore = new Semaphore((maxThreads <= 0) ? Integer.MAX_VALUE : maxThreads);
    List<Future<NamedList>> futures = new ArrayList<>(facetFs.length);
    if (fdebugParent != null) {
        fdebugParent.putInfoItem("maxThreads", maxThreads);
    }
    try {
        //Loop over fields; submit to executor, keeping the future
        for (String f : facetFs) {
            if (fdebugParent != null) {
                fdebug = new FacetDebugInfo();
                fdebugParent.addChild(fdebug);
            }
            final ParsedParams parsed = parseParams(FacetParams.FACET_FIELD, f);
            final SolrParams localParams = parsed.localParams;
            final String termList = localParams == null ? null : localParams.get(CommonParams.TERMS);
            final String key = parsed.key;
            final String facetValue = parsed.facetValue;
            Callable<NamedList> callable = () -> {
                try {
                    NamedList<Object> result = new SimpleOrderedMap<>();
                    if (termList != null) {
                        List<String> terms = StrUtils.splitSmart(termList, ",", true);
                        result.add(key, getListedTermCounts(facetValue, parsed, terms));
                    } else {
                        result.add(key, getTermCounts(facetValue, parsed));
                    }
                    return result;
                } catch (SolrException se) {
                    throw se;
                } catch (Exception e) {
                    throw new SolrException(ErrorCode.SERVER_ERROR, "Exception during facet.field: " + facetValue, e);
                } finally {
                    semaphore.release();
                }
            };
            RunnableFuture<NamedList> runnableFuture = new FutureTask<>(callable);
            //may block and/or interrupt
            semaphore.acquire();
            //releases semaphore when done
            executor.execute(runnableFuture);
            futures.add(runnableFuture);
        }
        //Loop over futures to get the values. The order is the same as facetFs but shouldn't matter.
        for (Future<NamedList> future : futures) {
            res.addAll(future.get());
        }
        assert semaphore.availablePermits() >= maxThreads;
    } catch (InterruptedException e) {
        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error while processing facet fields: InterruptedException", e);
    } catch (ExecutionException ee) {
        //unwrap
        Throwable e = ee.getCause();
        if (e instanceof RuntimeException) {
            throw (RuntimeException) e;
        }
        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error while processing facet fields: " + e.toString(), e);
    }
    return res;
}
Also used : ArrayList(java.util.ArrayList) Semaphore(java.util.concurrent.Semaphore) SimpleOrderedMap(org.apache.solr.common.util.SimpleOrderedMap) FacetDebugInfo(org.apache.solr.search.facet.FacetDebugInfo) Executor(java.util.concurrent.Executor) FutureTask(java.util.concurrent.FutureTask) List(java.util.List) ArrayList(java.util.ArrayList) NamedList(org.apache.solr.common.util.NamedList) ExecutionException(java.util.concurrent.ExecutionException) SolrException(org.apache.solr.common.SolrException) NamedList(org.apache.solr.common.util.NamedList) SolrException(org.apache.solr.common.SolrException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) Future(java.util.concurrent.Future) RunnableFuture(java.util.concurrent.RunnableFuture) RequiredSolrParams(org.apache.solr.common.params.RequiredSolrParams) SolrParams(org.apache.solr.common.params.SolrParams)

Example 3 with FacetDebugInfo

use of org.apache.solr.search.facet.FacetDebugInfo in project lucene-solr by apache.

the class FacetComponent method getFacetCounts.

/**
   * Looks at various Params to determining if any simple Facet Constraint count
   * computations are desired.
   *
   * @see SimpleFacets#getFacetQueryCounts
   * @see SimpleFacets#getFacetFieldCounts
   * @see RangeFacetProcessor#getFacetRangeCounts
   * @see RangeFacetProcessor#getFacetIntervalCounts
   * @see FacetParams#FACET
   * @return a NamedList of Facet Count info or null
   */
public static NamedList<Object> getFacetCounts(SimpleFacets simpleFacets, FacetDebugInfo fdebug) {
    // if someone called this method, benefit of the doubt: assume true
    if (!simpleFacets.getGlobalParams().getBool(FacetParams.FACET, true))
        return null;
    RangeFacetProcessor rangeFacetProcessor = new RangeFacetProcessor(simpleFacets.getRequest(), simpleFacets.getDocsOrig(), simpleFacets.getGlobalParams(), simpleFacets.getResponseBuilder());
    NamedList<Object> counts = new SimpleOrderedMap<>();
    try {
        counts.add(FACET_QUERY_KEY, simpleFacets.getFacetQueryCounts());
        if (fdebug != null) {
            FacetDebugInfo fd = new FacetDebugInfo();
            fd.putInfoItem("action", "field facet");
            fd.setProcessor(simpleFacets.getClass().getSimpleName());
            fdebug.addChild(fd);
            simpleFacets.setFacetDebugInfo(fd);
            final RTimer timer = new RTimer();
            counts.add(FACET_FIELD_KEY, simpleFacets.getFacetFieldCounts());
            long timeElapsed = (long) timer.getTime();
            fd.setElapse(timeElapsed);
        } else {
            counts.add(FACET_FIELD_KEY, simpleFacets.getFacetFieldCounts());
        }
        counts.add(FACET_RANGES_KEY, rangeFacetProcessor.getFacetRangeCounts());
        counts.add(FACET_INTERVALS_KEY, simpleFacets.getFacetIntervalCounts());
        counts.add(SpatialHeatmapFacets.RESPONSE_KEY, simpleFacets.getHeatmapCounts());
    } catch (IOException e) {
        throw new SolrException(ErrorCode.SERVER_ERROR, e);
    } catch (SyntaxError e) {
        throw new SolrException(ErrorCode.BAD_REQUEST, e);
    }
    return counts;
}
Also used : FacetDebugInfo(org.apache.solr.search.facet.FacetDebugInfo) SyntaxError(org.apache.solr.search.SyntaxError) IOException(java.io.IOException) SimpleOrderedMap(org.apache.solr.common.util.SimpleOrderedMap) RTimer(org.apache.solr.util.RTimer) SolrException(org.apache.solr.common.SolrException)

Example 4 with FacetDebugInfo

use of org.apache.solr.search.facet.FacetDebugInfo in project lucene-solr by apache.

the class FacetComponent method process.

/**
   * Actually run the query
   */
@Override
public void process(ResponseBuilder rb) throws IOException {
    if (rb.doFacets) {
        SolrParams params = rb.req.getParams();
        SimpleFacets f = newSimpleFacets(rb.req, rb.getResults().docSet, params, rb);
        RTimer timer = null;
        FacetDebugInfo fdebug = null;
        if (rb.isDebug()) {
            fdebug = new FacetDebugInfo();
            rb.req.getContext().put("FacetDebugInfo-nonJson", fdebug);
            timer = new RTimer();
        }
        NamedList<Object> counts = FacetComponent.getFacetCounts(f, fdebug);
        String[] pivots = params.getParams(FacetParams.FACET_PIVOT);
        if (!ArrayUtils.isEmpty(pivots)) {
            PivotFacetProcessor pivotProcessor = new PivotFacetProcessor(rb.req, rb.getResults().docSet, params, rb);
            SimpleOrderedMap<List<NamedList<Object>>> v = pivotProcessor.process(pivots);
            if (v != null) {
                counts.add(PIVOT_KEY, v);
            }
        }
        if (fdebug != null) {
            long timeElapsed = (long) timer.getTime();
            fdebug.setElapse(timeElapsed);
        }
        rb.rsp.add("facet_counts", counts);
    }
}
Also used : FacetDebugInfo(org.apache.solr.search.facet.FacetDebugInfo) SimpleFacets(org.apache.solr.request.SimpleFacets) SolrParams(org.apache.solr.common.params.SolrParams) ModifiableSolrParams(org.apache.solr.common.params.ModifiableSolrParams) ArrayList(java.util.ArrayList) NamedList(org.apache.solr.common.util.NamedList) List(java.util.List) RTimer(org.apache.solr.util.RTimer)

Aggregations

FacetDebugInfo (org.apache.solr.search.facet.FacetDebugInfo)4 ArrayList (java.util.ArrayList)3 NamedList (org.apache.solr.common.util.NamedList)3 IOException (java.io.IOException)2 List (java.util.List)2 SolrException (org.apache.solr.common.SolrException)2 SolrParams (org.apache.solr.common.params.SolrParams)2 SimpleOrderedMap (org.apache.solr.common.util.SimpleOrderedMap)2 RTimer (org.apache.solr.util.RTimer)2 ExecutionException (java.util.concurrent.ExecutionException)1 Executor (java.util.concurrent.Executor)1 Future (java.util.concurrent.Future)1 FutureTask (java.util.concurrent.FutureTask)1 RunnableFuture (java.util.concurrent.RunnableFuture)1 Semaphore (java.util.concurrent.Semaphore)1 Query (org.apache.lucene.search.Query)1 ModifiableSolrParams (org.apache.solr.common.params.ModifiableSolrParams)1 RequiredSolrParams (org.apache.solr.common.params.RequiredSolrParams)1 SimpleFacets (org.apache.solr.request.SimpleFacets)1 DocList (org.apache.solr.search.DocList)1