void fillBucket(SimpleOrderedMap<Object> bucket, Query q, DocSet result) throws IOException { boolean needDocSet = freq.getFacetStats().size() > 0 || freq.getSubFacets().size() > 0; // TODO: always collect counts or not??? int count; if (result != null) { count = result.size(); } else if (needDocSet) { if (q == null) { result = fcontext.base; // result.incref(); // OFF-HEAP } else { result = fcontext.searcher.getDocSet(q, fcontext.base); } count = result.size(); } else { if (q == null) { count = fcontext.base.size(); } else { count = fcontext.searcher.numDocs(q, fcontext.base); } } try { processStats(bucket, result, count); processSubs(bucket, q, result); } finally { if (result != null) { // result.decref(); // OFF-HEAP result = null; } } }
protected void processStats(SimpleOrderedMap<Object> bucket, DocSet docs, int docCount) throws IOException { if (docCount == 0 && !freq.processEmpty || freq.getFacetStats().size() == 0) { bucket.add("count", docCount); return; } createAccs(docCount, 1); int collected = collect(docs, 0); countAcc.incrementCount(0, collected); assert collected == docCount; addStats(bucket, 0); }
// TODO: put the FacetRequest on the parser object? public void parseSubs(Object o) throws SyntaxError { if (o == null) return; if (o instanceof Map) { Map<String, Object> m = (Map<String, Object>) o; for (Map.Entry<String, Object> entry : m.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); if ("processEmpty".equals(key)) { facet.processEmpty = getBoolean(m, "processEmpty", false); continue; } // "my_prices" : { "range" : { "field":... // key="my_prices", value={"range":.. Object parsedValue = parseFacetOrStat(key, value); // TODO: have parseFacetOrStat directly add instead of return? if (parsedValue instanceof FacetRequest) { facet.addSubFacet(key, (FacetRequest) parsedValue); } else if (parsedValue instanceof AggValueSource) { facet.addStat(key, (AggValueSource) parsedValue); } else { throw err( "Unknown facet type key=" + key + " class=" + (parsedValue == null ? "null" : parsedValue.getClass().getName())); } } } else { // facet : my_field? throw err("Expected map for facet/stat"); } }
protected void createAccs(int docCount, int slotCount) throws IOException { accMap = new LinkedHashMap<>(); // allow a custom count acc to be used if (countAcc == null) { countAcc = new CountSlotArrAcc(fcontext, slotCount); countAcc.key = "count"; } for (Map.Entry<String, AggValueSource> entry : freq.getFacetStats().entrySet()) { SlotAcc acc = entry.getValue().createSlotAcc(fcontext, docCount, slotCount); acc.key = entry.getKey(); accMap.put(acc.key, acc); } accs = new SlotAcc[accMap.size()]; int i = 0; for (SlotAcc acc : accMap.values()) { accs[i++] = acc; } }
void processSubs(SimpleOrderedMap<Object> response, Query filter, DocSet domain) throws IOException { // TODO: what if a zero bucket has a sub-facet with an exclusion that would yield results? // should we check for domain-altering exclusions, or even ask the sub-facet for // it's domain and then only skip it if it's 0? if (domain == null || domain.size() == 0 && !freq.processEmpty) { return; } for (Map.Entry<String, FacetRequest> sub : freq.getSubFacets().entrySet()) { // make a new context for each sub-facet since they can change the domain FacetContext subContext = fcontext.sub(filter, domain); FacetProcessor subProcessor = sub.getValue().createFacetProcessor(subContext); if (fcontext.getDebugInfo() != null) { // if fcontext.debugInfo != null, it means rb.debug() == true FacetDebugInfo fdebug = new FacetDebugInfo(); subContext.setDebugInfo(fdebug); fcontext.getDebugInfo().addChild(fdebug); fdebug.setReqDescription(sub.getValue().getFacetDescription()); fdebug.setProcessor(subProcessor.getClass().getSimpleName()); if (subContext.filter != null) fdebug.setFilter(subContext.filter.toString()); final RTimer timer = new RTimer(); subProcessor.process(); long timeElapsed = (long) timer.getTime(); fdebug.setElapse(timeElapsed); fdebug.putInfoItem("domainSize", (long) subContext.base.size()); } else { subProcessor.process(); } response.add(sub.getKey(), subProcessor.getResponse()); } }
private FacetRequest.Domain getDomain() { if (facet.domain == null) { facet.domain = new FacetRequest.Domain(); } return facet.domain; }