@Override protected void doSetNextReader(LeafReaderContext context) throws IOException { if (segmentFacetCounts != null) { segmentResults.add(createSegmentResult()); } groupFieldTermsIndex = DocValues.getSorted(context.reader(), groupField); facetFieldTermsIndex = DocValues.getSorted(context.reader(), facetField); // 1+ to allow for the -1 "not set": segmentFacetCounts = new int[facetFieldTermsIndex.getValueCount() + 1]; segmentTotalCount = 0; segmentGroupedFacetHits.clear(); for (GroupedFacetHit groupedFacetHit : groupedFacetHits) { int facetOrd = groupedFacetHit.facetValue == null ? -1 : facetFieldTermsIndex.lookupTerm(groupedFacetHit.facetValue); if (groupedFacetHit.facetValue != null && facetOrd < 0) { continue; } int groupOrd = groupedFacetHit.groupValue == null ? -1 : groupFieldTermsIndex.lookupTerm(groupedFacetHit.groupValue); if (groupedFacetHit.groupValue != null && groupOrd < 0) { continue; } int segmentGroupedFacetsIndex = groupOrd * (facetFieldTermsIndex.getValueCount() + 1) + facetOrd; segmentGroupedFacetHits.put(segmentGroupedFacetsIndex); } if (facetPrefix != null) { startFacetOrd = facetFieldTermsIndex.lookupTerm(facetPrefix); if (startFacetOrd < 0) { // Points to the ord one higher than facetPrefix startFacetOrd = -startFacetOrd - 1; } BytesRefBuilder facetEndPrefix = new BytesRefBuilder(); facetEndPrefix.append(facetPrefix); facetEndPrefix.append(UnicodeUtil.BIG_TERM); endFacetOrd = facetFieldTermsIndex.lookupTerm(facetEndPrefix.get()); assert endFacetOrd < 0; endFacetOrd = -endFacetOrd - 1; // Points to the ord one higher than facetEndPrefix } else { startFacetOrd = -1; endFacetOrd = facetFieldTermsIndex.getValueCount(); } }
@Override public Explanation explain(LeafReaderContext context, int doc) throws IOException { SortedDocValues values = DocValues.getSorted(context.reader(), joinField); if (values != null) { int segmentOrd = values.getOrd(doc); if (segmentOrd != -1) { BytesRef joinValue = values.lookupOrd(segmentOrd); return Explanation.match( queryNorm, "Score based on join value " + joinValue.utf8ToString()); } } return Explanation.noMatch("Not a match"); }
@Override public Scorer scorer(LeafReaderContext context) throws IOException { SortedDocValues values = DocValues.getSorted(context.reader(), joinField); if (values == null) { return null; } Scorer approximationScorer = approximationWeight.scorer(context); if (approximationScorer == null) { return null; } else if (globalOrds != null) { return new OrdinalMapScorer( this, collector, values, approximationScorer, globalOrds.getGlobalOrds(context.ord)); } else { return new SegmentOrdinalScorer(this, collector, values, approximationScorer); } }
@Override protected void doSetNextReader(LeafReaderContext context) throws IOException { index = DocValues.getSorted(context.reader(), groupField); // Clear ordSet and fill it with previous encountered groups that can occur in the current // segment. ordSet.clear(); for (BytesRef countedGroup : groups) { if (countedGroup == null) { ordSet.put(-1); } else { int ord = index.lookupTerm(countedGroup); if (ord >= 0) { ordSet.put(ord); } } } }
@Override public Explanation explain(LeafReaderContext context, int doc) throws IOException { SortedDocValues values = DocValues.getSorted(context.reader(), joinField); if (values != null) { int segmentOrd = values.getOrd(doc); if (segmentOrd != -1) { final float score; if (globalOrds != null) { long globalOrd = globalOrds.getGlobalOrds(context.ord).get(segmentOrd); score = collector.score((int) globalOrd); } else { score = collector.score(segmentOrd); } BytesRef joinValue = values.lookupOrd(segmentOrd); return Explanation.match(score, "Score based on join value " + joinValue.utf8ToString()); } } return Explanation.noMatch("Not a match"); }
@Override public Scorer scorer(LeafReaderContext context, Bits acceptDocs) throws IOException { SortedDocValues values = DocValues.getSorted(context.reader(), joinField); if (values == null) { return null; } Scorer approximationScorer = approximationWeight.scorer(context, acceptDocs); if (approximationScorer == null) { return null; } if (globalOrds != null) { return new OrdinalMapScorer( this, queryNorm, foundOrds, values, approximationScorer, globalOrds.getGlobalOrds(context.ord)); } { return new SegmentOrdinalScorer(this, queryNorm, foundOrds, values, approximationScorer); } }
public DelegatingCollector getFilterCollector(IndexSearcher indexSearcher) { try { SolrIndexSearcher searcher = (SolrIndexSearcher) indexSearcher; SortedDocValues docValues = null; FunctionQuery funcQuery = null; docValues = DocValues.getSorted(searcher.getLeafReader(), this.field); FieldType fieldType = null; if (this.max != null) { if (this.max.indexOf("(") == -1) { fieldType = searcher.getSchema().getField(this.max).getType(); } else { LocalSolrQueryRequest request = null; try { SolrParams params = new ModifiableSolrParams(); request = new LocalSolrQueryRequest(searcher.getCore(), params); FunctionQParser functionQParser = new FunctionQParser(this.max, null, null, request); funcQuery = (FunctionQuery) functionQParser.parse(); } catch (Exception e) { throw new IOException(e); } finally { request.close(); } } } if (this.min != null) { if (this.min.indexOf("(") == -1) { fieldType = searcher.getSchema().getField(this.min).getType(); } else { LocalSolrQueryRequest request = null; try { SolrParams params = new ModifiableSolrParams(); request = new LocalSolrQueryRequest(searcher.getCore(), params); FunctionQParser functionQParser = new FunctionQParser(this.min, null, null, request); funcQuery = (FunctionQuery) functionQParser.parse(); } catch (Exception e) { throw new IOException(e); } finally { request.close(); } } } int maxDoc = searcher.maxDoc(); int leafCount = searcher.getTopReaderContext().leaves().size(); // Deal with boosted docs. // We have to deal with it here rather then the constructor because // because the QueryElevationComponent runs after the Queries are constructed. IntIntOpenHashMap boostDocs = null; Map context = null; SolrRequestInfo info = SolrRequestInfo.getRequestInfo(); if (info != null) { context = info.getReq().getContext(); } if (this.boosted == null && context != null) { this.boosted = (Map<BytesRef, Integer>) context.get(QueryElevationComponent.BOOSTED_PRIORITY); } boostDocs = getBoostDocs(searcher, this.boosted, context); if (this.min != null || this.max != null) { return new CollapsingFieldValueCollector( maxDoc, leafCount, docValues, this.nullPolicy, max != null ? this.max : this.min, max != null, this.needsScores, fieldType, boostDocs, funcQuery, searcher); } else { return new CollapsingScoreCollector( maxDoc, leafCount, docValues, this.nullPolicy, boostDocs); } } catch (Exception e) { throw new RuntimeException(e); } }
@Override protected void doSetNextReader(LeafReaderContext context) throws IOException { if (segmentFacetCounts != null) { segmentResults.add(createSegmentResult()); } groupFieldTermsIndex = DocValues.getSorted(context.reader(), groupField); facetFieldDocTermOrds = DocValues.getSortedSet(context.reader(), facetField); facetFieldNumTerms = (int) facetFieldDocTermOrds.getValueCount(); if (facetFieldNumTerms == 0) { facetOrdTermsEnum = null; } else { facetOrdTermsEnum = facetFieldDocTermOrds.termsEnum(); } // [facetFieldNumTerms() + 1] for all possible facet values and docs not containing facet // field segmentFacetCounts = new int[facetFieldNumTerms + 1]; segmentTotalCount = 0; segmentGroupedFacetHits.clear(); for (GroupedFacetHit groupedFacetHit : groupedFacetHits) { int groupOrd = groupedFacetHit.groupValue == null ? -1 : groupFieldTermsIndex.lookupTerm(groupedFacetHit.groupValue); if (groupedFacetHit.groupValue != null && groupOrd < 0) { continue; } int facetOrd; if (groupedFacetHit.facetValue != null) { if (facetOrdTermsEnum == null || !facetOrdTermsEnum.seekExact(groupedFacetHit.facetValue)) { continue; } facetOrd = (int) facetOrdTermsEnum.ord(); } else { facetOrd = facetFieldNumTerms; } // (facetFieldDocTermOrds.numTerms() + 1) for all possible facet values and docs not // containing facet field int segmentGroupedFacetsIndex = groupOrd * (facetFieldNumTerms + 1) + facetOrd; segmentGroupedFacetHits.put(segmentGroupedFacetsIndex); } if (facetPrefix != null) { TermsEnum.SeekStatus seekStatus; if (facetOrdTermsEnum != null) { seekStatus = facetOrdTermsEnum.seekCeil(facetPrefix); } else { seekStatus = TermsEnum.SeekStatus.END; } if (seekStatus != TermsEnum.SeekStatus.END) { startFacetOrd = (int) facetOrdTermsEnum.ord(); } else { startFacetOrd = 0; endFacetOrd = 0; return; } BytesRefBuilder facetEndPrefix = new BytesRefBuilder(); facetEndPrefix.append(facetPrefix); facetEndPrefix.append(UnicodeUtil.BIG_TERM); seekStatus = facetOrdTermsEnum.seekCeil(facetEndPrefix.get()); if (seekStatus != TermsEnum.SeekStatus.END) { endFacetOrd = (int) facetOrdTermsEnum.ord(); } else { endFacetOrd = facetFieldNumTerms; // Don't include null... } } else { startFacetOrd = 0; endFacetOrd = facetFieldNumTerms + 1; } }