Search in sources :

Example 6 with InPlaceMergeSorter

use of org.apache.lucene.util.InPlaceMergeSorter in project lucene-solr by apache.

the class UnifiedHighlighter method copyAndSortDocIdsWithIndex.

private void copyAndSortDocIdsWithIndex(int[] docIdsIn, final int[] docIds, final int[] docInIndexes) {
    System.arraycopy(docIdsIn, 0, docIds, 0, docIdsIn.length);
    for (int i = 0; i < docInIndexes.length; i++) {
        docInIndexes[i] = i;
    }
    new InPlaceMergeSorter() {

        @Override
        protected void swap(int i, int j) {
            int tmp = docIds[i];
            docIds[i] = docIds[j];
            docIds[j] = tmp;
            tmp = docInIndexes[i];
            docInIndexes[i] = docInIndexes[j];
            docInIndexes[j] = tmp;
        }

        @Override
        protected int compare(int i, int j) {
            return Integer.compare(docIds[i], docIds[j]);
        }
    }.sort(0, docIds.length);
}
Also used : InPlaceMergeSorter(org.apache.lucene.util.InPlaceMergeSorter)

Example 7 with InPlaceMergeSorter

use of org.apache.lucene.util.InPlaceMergeSorter in project lucene-solr by apache.

the class QueryComponent method doFieldSortValues.

protected void doFieldSortValues(ResponseBuilder rb, SolrIndexSearcher searcher) throws IOException {
    SolrQueryRequest req = rb.req;
    SolrQueryResponse rsp = rb.rsp;
    // The query cache doesn't currently store sort field values, and SolrIndexSearcher doesn't
    // currently have an option to return sort field values.  Because of this, we
    // take the documents given and re-derive the sort values.
    //
    // TODO: See SOLR-5595
    boolean fsv = req.getParams().getBool(ResponseBuilder.FIELD_SORT_VALUES, false);
    if (fsv) {
        // order is important for the sort fields
        NamedList<Object[]> sortVals = new NamedList<>();
        IndexReaderContext topReaderContext = searcher.getTopReaderContext();
        List<LeafReaderContext> leaves = topReaderContext.leaves();
        LeafReaderContext currentLeaf = null;
        if (leaves.size() == 1) {
            // if there is a single segment, use that subReader and avoid looking up each time
            currentLeaf = leaves.get(0);
            leaves = null;
        }
        DocList docList = rb.getResults().docList;
        // sort ids from lowest to highest so we can access them in order
        int nDocs = docList.size();
        final long[] sortedIds = new long[nDocs];
        // doc scores, parallel to sortedIds
        final float[] scores = new float[nDocs];
        DocList docs = rb.getResults().docList;
        DocIterator it = docs.iterator();
        for (int i = 0; i < nDocs; i++) {
            sortedIds[i] = (((long) it.nextDoc()) << 32) | i;
            scores[i] = docs.hasScores() ? it.score() : Float.NaN;
        }
        // sort ids and scores together
        new InPlaceMergeSorter() {

            @Override
            protected void swap(int i, int j) {
                long tmpId = sortedIds[i];
                float tmpScore = scores[i];
                sortedIds[i] = sortedIds[j];
                scores[i] = scores[j];
                sortedIds[j] = tmpId;
                scores[j] = tmpScore;
            }

            @Override
            protected int compare(int i, int j) {
                return Long.compare(sortedIds[i], sortedIds[j]);
            }
        }.sort(0, sortedIds.length);
        SortSpec sortSpec = rb.getSortSpec();
        Sort sort = searcher.weightSort(sortSpec.getSort());
        SortField[] sortFields = sort == null ? new SortField[] { SortField.FIELD_SCORE } : sort.getSort();
        List<SchemaField> schemaFields = sortSpec.getSchemaFields();
        for (int fld = 0; fld < schemaFields.size(); fld++) {
            SchemaField schemaField = schemaFields.get(fld);
            FieldType ft = null == schemaField ? null : schemaField.getType();
            SortField sortField = sortFields[fld];
            SortField.Type type = sortField.getType();
            // :TODO: would be simpler to always serialize every position of SortField[]
            if (type == SortField.Type.SCORE || type == SortField.Type.DOC)
                continue;
            FieldComparator<?> comparator = sortField.getComparator(1, 0);
            LeafFieldComparator leafComparator = null;
            Object[] vals = new Object[nDocs];
            int lastIdx = -1;
            int idx = 0;
            for (int i = 0; i < sortedIds.length; ++i) {
                long idAndPos = sortedIds[i];
                float score = scores[i];
                int doc = (int) (idAndPos >>> 32);
                int position = (int) idAndPos;
                if (leaves != null) {
                    idx = ReaderUtil.subIndex(doc, leaves);
                    currentLeaf = leaves.get(idx);
                    if (idx != lastIdx) {
                        // we switched segments.  invalidate leafComparator.
                        lastIdx = idx;
                        leafComparator = null;
                    }
                }
                if (leafComparator == null) {
                    leafComparator = comparator.getLeafComparator(currentLeaf);
                }
                // adjust for what segment this is in
                doc -= currentLeaf.docBase;
                leafComparator.setScorer(new FakeScorer(doc, score));
                leafComparator.copy(0, doc);
                Object val = comparator.value(0);
                if (null != ft)
                    val = ft.marshalSortValue(val);
                vals[position] = val;
            }
            sortVals.add(sortField.getField(), vals);
        }
        rsp.add("sort_values", sortVals);
    }
}
Also used : DocIterator(org.apache.solr.search.DocIterator) SortField(org.apache.lucene.search.SortField) LeafFieldComparator(org.apache.lucene.search.LeafFieldComparator) LeafReaderContext(org.apache.lucene.index.LeafReaderContext) Sort(org.apache.lucene.search.Sort) SolrQueryResponse(org.apache.solr.response.SolrQueryResponse) NamedList(org.apache.solr.common.util.NamedList) InPlaceMergeSorter(org.apache.lucene.util.InPlaceMergeSorter) IndexReaderContext(org.apache.lucene.index.IndexReaderContext) FieldType(org.apache.solr.schema.FieldType) SchemaField(org.apache.solr.schema.SchemaField) SolrQueryRequest(org.apache.solr.request.SolrQueryRequest) DocList(org.apache.solr.search.DocList) SortSpec(org.apache.solr.search.SortSpec)

Example 8 with InPlaceMergeSorter

use of org.apache.lucene.util.InPlaceMergeSorter in project lucene-solr by apache.

the class BinaryDocValuesFieldUpdates method iterator.

@Override
public Iterator iterator() {
    final PagedMutable docs = this.docs;
    final PagedGrowableWriter offsets = this.offsets;
    final PagedGrowableWriter lengths = this.lengths;
    final BytesRef values = this.values.get();
    new InPlaceMergeSorter() {

        @Override
        protected void swap(int i, int j) {
            long tmpDoc = docs.get(j);
            docs.set(j, docs.get(i));
            docs.set(i, tmpDoc);
            long tmpOffset = offsets.get(j);
            offsets.set(j, offsets.get(i));
            offsets.set(i, tmpOffset);
            long tmpLength = lengths.get(j);
            lengths.set(j, lengths.get(i));
            lengths.set(i, tmpLength);
        }

        @Override
        protected int compare(int i, int j) {
            int x = (int) docs.get(i);
            int y = (int) docs.get(j);
            return (x < y) ? -1 : ((x == y) ? 0 : 1);
        }
    }.sort(0, size);
    return new Iterator(size, offsets, lengths, docs, values);
}
Also used : PagedMutable(org.apache.lucene.util.packed.PagedMutable) InPlaceMergeSorter(org.apache.lucene.util.InPlaceMergeSorter) DocIdSetIterator(org.apache.lucene.search.DocIdSetIterator) PagedGrowableWriter(org.apache.lucene.util.packed.PagedGrowableWriter) BytesRef(org.apache.lucene.util.BytesRef)

Aggregations

InPlaceMergeSorter (org.apache.lucene.util.InPlaceMergeSorter)8 BytesRef (org.apache.lucene.util.BytesRef)3 DocIdSetIterator (org.apache.lucene.search.DocIdSetIterator)2 PagedGrowableWriter (org.apache.lucene.util.packed.PagedGrowableWriter)2 PagedMutable (org.apache.lucene.util.packed.PagedMutable)2 IndexReaderContext (org.apache.lucene.index.IndexReaderContext)1 LeafReaderContext (org.apache.lucene.index.LeafReaderContext)1 TermContext (org.apache.lucene.index.TermContext)1 LeafFieldComparator (org.apache.lucene.search.LeafFieldComparator)1 Sort (org.apache.lucene.search.Sort)1 SortField (org.apache.lucene.search.SortField)1 NamedList (org.apache.solr.common.util.NamedList)1 SolrQueryRequest (org.apache.solr.request.SolrQueryRequest)1 SolrQueryResponse (org.apache.solr.response.SolrQueryResponse)1 FieldType (org.apache.solr.schema.FieldType)1 SchemaField (org.apache.solr.schema.SchemaField)1 DocIterator (org.apache.solr.search.DocIterator)1 DocList (org.apache.solr.search.DocList)1 SortSpec (org.apache.solr.search.SortSpec)1