Search in sources :

Example 16 with SortedSetSortField

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

the class Lucene62RWSegmentInfoFormat method write.

@Override
public void write(Directory dir, SegmentInfo si, IOContext ioContext) throws IOException {
    final String fileName = IndexFileNames.segmentFileName(si.name, "", Lucene62SegmentInfoFormat.SI_EXTENSION);
    try (IndexOutput output = dir.createOutput(fileName, ioContext)) {
        // Only add the file once we've successfully created it, else IFD assert can trip:
        si.addFile(fileName);
        CodecUtil.writeIndexHeader(output, Lucene62SegmentInfoFormat.CODEC_NAME, Lucene62SegmentInfoFormat.VERSION_CURRENT, si.getId(), "");
        Version version = si.getVersion();
        if (version.major < 5) {
            throw new IllegalArgumentException("invalid major version: should be >= 5 but got: " + version.major + " segment=" + si);
        }
        // Write the Lucene version that created this segment, since 3.1
        output.writeInt(version.major);
        output.writeInt(version.minor);
        output.writeInt(version.bugfix);
        assert version.prerelease == 0;
        output.writeInt(si.maxDoc());
        output.writeByte((byte) (si.getUseCompoundFile() ? SegmentInfo.YES : SegmentInfo.NO));
        output.writeMapOfStrings(si.getDiagnostics());
        Set<String> files = si.files();
        for (String file : files) {
            if (!IndexFileNames.parseSegmentName(file).equals(si.name)) {
                throw new IllegalArgumentException("invalid files: expected segment=" + si.name + ", got=" + files);
            }
        }
        output.writeSetOfStrings(files);
        output.writeMapOfStrings(si.getAttributes());
        Sort indexSort = si.getIndexSort();
        int numSortFields = indexSort == null ? 0 : indexSort.getSort().length;
        output.writeVInt(numSortFields);
        for (int i = 0; i < numSortFields; ++i) {
            SortField sortField = indexSort.getSort()[i];
            SortField.Type sortType = sortField.getType();
            output.writeString(sortField.getField());
            int sortTypeID;
            switch(sortField.getType()) {
                case STRING:
                    sortTypeID = 0;
                    break;
                case LONG:
                    sortTypeID = 1;
                    break;
                case INT:
                    sortTypeID = 2;
                    break;
                case DOUBLE:
                    sortTypeID = 3;
                    break;
                case FLOAT:
                    sortTypeID = 4;
                    break;
                case CUSTOM:
                    if (sortField instanceof SortedSetSortField) {
                        sortTypeID = 5;
                        sortType = SortField.Type.STRING;
                    } else if (sortField instanceof SortedNumericSortField) {
                        sortTypeID = 6;
                        sortType = ((SortedNumericSortField) sortField).getNumericType();
                    } else {
                        throw new IllegalStateException("Unexpected SortedNumericSortField " + sortField);
                    }
                    break;
                default:
                    throw new IllegalStateException("Unexpected sort type: " + sortField.getType());
            }
            output.writeVInt(sortTypeID);
            if (sortTypeID == 5) {
                SortedSetSortField ssf = (SortedSetSortField) sortField;
                if (ssf.getSelector() == SortedSetSelector.Type.MIN) {
                    output.writeByte((byte) 0);
                } else if (ssf.getSelector() == SortedSetSelector.Type.MAX) {
                    output.writeByte((byte) 1);
                } else if (ssf.getSelector() == SortedSetSelector.Type.MIDDLE_MIN) {
                    output.writeByte((byte) 2);
                } else if (ssf.getSelector() == SortedSetSelector.Type.MIDDLE_MAX) {
                    output.writeByte((byte) 3);
                } else {
                    throw new IllegalStateException("Unexpected SortedSetSelector type: " + ssf.getSelector());
                }
            } else if (sortTypeID == 6) {
                SortedNumericSortField snsf = (SortedNumericSortField) sortField;
                if (snsf.getNumericType() == SortField.Type.LONG) {
                    output.writeByte((byte) 0);
                } else if (snsf.getNumericType() == SortField.Type.INT) {
                    output.writeByte((byte) 1);
                } else if (snsf.getNumericType() == SortField.Type.DOUBLE) {
                    output.writeByte((byte) 2);
                } else if (snsf.getNumericType() == SortField.Type.FLOAT) {
                    output.writeByte((byte) 3);
                } else {
                    throw new IllegalStateException("Unexpected SortedNumericSelector type: " + snsf.getNumericType());
                }
                if (snsf.getSelector() == SortedNumericSelector.Type.MIN) {
                    output.writeByte((byte) 0);
                } else if (snsf.getSelector() == SortedNumericSelector.Type.MAX) {
                    output.writeByte((byte) 1);
                } else {
                    throw new IllegalStateException("Unexpected sorted numeric selector type: " + snsf.getSelector());
                }
            }
            output.writeByte((byte) (sortField.getReverse() ? 0 : 1));
            // write missing value 
            Object missingValue = sortField.getMissingValue();
            if (missingValue == null) {
                output.writeByte((byte) 0);
            } else {
                switch(sortType) {
                    case STRING:
                        if (missingValue == SortField.STRING_LAST) {
                            output.writeByte((byte) 1);
                        } else if (missingValue == SortField.STRING_FIRST) {
                            output.writeByte((byte) 2);
                        } else {
                            throw new AssertionError("unrecognized missing value for STRING field \"" + sortField.getField() + "\": " + missingValue);
                        }
                        break;
                    case LONG:
                        output.writeByte((byte) 1);
                        output.writeLong(((Long) missingValue).longValue());
                        break;
                    case INT:
                        output.writeByte((byte) 1);
                        output.writeInt(((Integer) missingValue).intValue());
                        break;
                    case DOUBLE:
                        output.writeByte((byte) 1);
                        output.writeLong(Double.doubleToLongBits(((Double) missingValue).doubleValue()));
                        break;
                    case FLOAT:
                        output.writeByte((byte) 1);
                        output.writeInt(Float.floatToIntBits(((Float) missingValue).floatValue()));
                        break;
                    default:
                        throw new IllegalStateException("Unexpected sort type: " + sortField.getType());
                }
            }
        }
        CodecUtil.writeFooter(output);
    }
}
Also used : SortedSetSortField(org.apache.lucene.search.SortedSetSortField) IndexOutput(org.apache.lucene.store.IndexOutput) SortedSetSortField(org.apache.lucene.search.SortedSetSortField) SortField(org.apache.lucene.search.SortField) SortedNumericSortField(org.apache.lucene.search.SortedNumericSortField) SortedNumericSortField(org.apache.lucene.search.SortedNumericSortField) Version(org.apache.lucene.util.Version) Sort(org.apache.lucene.search.Sort)

Example 17 with SortedSetSortField

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

the class SortedSetDocValuesWriter method getDocComparator.

@Override
Sorter.DocComparator getDocComparator(int maxDoc, SortField sortField) throws IOException {
    assert sortField instanceof SortedSetSortField;
    assert finalOrds == null && finalOrdCounts == null && finalSortedValues == null && finalOrdMap == null;
    int valueCount = hash.size();
    finalOrds = pending.build();
    finalOrdCounts = pendingCounts.build();
    finalSortedValues = hash.sort();
    finalOrdMap = new int[valueCount];
    for (int ord = 0; ord < valueCount; ord++) {
        finalOrdMap[finalSortedValues[ord]] = ord;
    }
    SortedSetSortField sf = (SortedSetSortField) sortField;
    final SortedSetDocValues dvs = new BufferedSortedSetDocValues(finalSortedValues, finalOrdMap, hash, finalOrds, finalOrdCounts, maxCount, docsWithField.iterator());
    return Sorter.getDocComparator(maxDoc, sf, () -> SortedSetSelector.wrap(dvs, sf.getSelector()), () -> null);
}
Also used : SortedSetSortField(org.apache.lucene.search.SortedSetSortField)

Aggregations

SortedSetSortField (org.apache.lucene.search.SortedSetSortField)17 SortField (org.apache.lucene.search.SortField)13 SortedNumericSortField (org.apache.lucene.search.SortedNumericSortField)12 Sort (org.apache.lucene.search.Sort)11 BytesRef (org.apache.lucene.util.BytesRef)7 SortedSetDocValuesField (org.apache.lucene.document.SortedSetDocValuesField)6 Document (org.apache.lucene.document.Document)5 Version (org.apache.lucene.util.Version)5 SortedSetSelector (org.apache.lucene.search.SortedSetSelector)4 Directory (org.apache.lucene.store.Directory)4 MockAnalyzer (org.apache.lucene.analysis.MockAnalyzer)3 NumericDocValuesField (org.apache.lucene.document.NumericDocValuesField)3 SortedNumericDocValuesField (org.apache.lucene.document.SortedNumericDocValuesField)3 CorruptIndexException (org.apache.lucene.index.CorruptIndexException)3 SegmentInfo (org.apache.lucene.index.SegmentInfo)3 SortedNumericSelector (org.apache.lucene.search.SortedNumericSelector)3 ChecksumIndexInput (org.apache.lucene.store.ChecksumIndexInput)3 IndexOutput (org.apache.lucene.store.IndexOutput)3 HashMap (java.util.HashMap)2 BytesRefBuilder (org.apache.lucene.util.BytesRefBuilder)2