From 3b6d741016acc4a2f25a816fc56ba7486759968b Mon Sep 17 00:00:00 2001 From: Anshum Gupta Date: Fri, 30 Jun 2017 10:40:27 -0700 Subject: [PATCH 1/7] Solr 7.0 release, bumping up version to 8 on master --- lucene/CHANGES.txt | 3 +++ .../java/org/apache/lucene/util/Version.java | 15 +++++++++++---- lucene/version.properties | 2 +- solr/CHANGES.txt | 17 +++++++++++++++++ .../example-DIH/solr/atom/conf/solrconfig.xml | 2 +- .../example-DIH/solr/db/conf/solrconfig.xml | 2 +- .../example-DIH/solr/mail/conf/solrconfig.xml | 2 +- .../example-DIH/solr/solr/conf/solrconfig.xml | 2 +- .../example-DIH/solr/tika/conf/solrconfig.xml | 2 +- solr/example/files/conf/solrconfig.xml | 2 +- .../configsets/_default/conf/solrconfig.xml | 2 +- .../conf/solrconfig.xml | 2 +- 12 files changed, 40 insertions(+), 13 deletions(-) diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 909b6ce4fff2..a0a6815ccef1 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -3,6 +3,9 @@ Lucene Change Log For more information on past and future Lucene versions, please see: http://s.apache.org/luceneversions +======================= Lucene 8.0.0 ======================= +(No Changes) + ======================= Lucene 7.0.0 ======================= New Features diff --git a/lucene/core/src/java/org/apache/lucene/util/Version.java b/lucene/core/src/java/org/apache/lucene/util/Version.java index 94dcc8b04d45..0b10d95312f6 100644 --- a/lucene/core/src/java/org/apache/lucene/util/Version.java +++ b/lucene/core/src/java/org/apache/lucene/util/Version.java @@ -124,12 +124,19 @@ public final class Version { /** * Match settings and bugs in Lucene's 7.0.0 release. - *

- * Use this to get the latest & greatest settings, bug - * fixes, etc, for Lucene. + * @deprecated (8.0.0) Use latest */ + @Deprecated public static final Version LUCENE_7_0_0 = new Version(7, 0, 0); + /** + * Match settings and bugs in Lucene's 8.0.0 release. + *

+ * Use this to get the latest & greatest settings, bug + * fixes, etc, for Lucene. + */ + public static final Version LUCENE_8_0_0 = new Version(8, 0, 0); + // To add a new version: // * Only add above this comment // * If the new version is the newest, change LATEST below and deprecate the previous LATEST @@ -149,7 +156,7 @@ public final class Version { * some defaults may have changed and may break functionality * in your application. */ - public static final Version LATEST = LUCENE_7_0_0; + public static final Version LATEST = LUCENE_8_0_0; /** * Constant for backwards compatibility. diff --git a/lucene/version.properties b/lucene/version.properties index 55730a2e85df..98380f4e739e 100644 --- a/lucene/version.properties +++ b/lucene/version.properties @@ -2,7 +2,7 @@ # RELEASE MANAGER must change this file after creating a release and # enter new base version (format "x.y.z", no prefix/appendix): -version.base=7.0.0 +version.base=8.0.0 # Other version property defaults, don't change: version.suffix=SNAPSHOT diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 0d2226f3b81e..2bb599ab99fa 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -16,6 +16,23 @@ In this release, there is an example Solr server including a bundled servlet container in the directory named "example". See the Quick Start guide at http://lucene.apache.org/solr/quickstart.html +================== 8.0.0 ================== + +Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release. + +Versions of Major Components +--------------------- +Apache Tika 1.13 +Carrot2 3.15.0 +Velocity 1.7 and Velocity Tools 2.0 +Apache UIMA 2.3.1 +Apache ZooKeeper 3.4.10 +Jetty 9.3.14.v20161028 + + +(No Changes) + + ================== 7.0.0 ================== Upgrading from Solr 6.x diff --git a/solr/example/example-DIH/solr/atom/conf/solrconfig.xml b/solr/example/example-DIH/solr/atom/conf/solrconfig.xml index 22005ddcaba7..2b44ca6f8e00 100644 --- a/solr/example/example-DIH/solr/atom/conf/solrconfig.xml +++ b/solr/example/example-DIH/solr/atom/conf/solrconfig.xml @@ -36,7 +36,7 @@ that you fully re-index after changing this setting as it can affect both how text is indexed and queried. --> - 7.0.0 + 8.0.0 diff --git a/solr/example/example-DIH/solr/db/conf/solrconfig.xml b/solr/example/example-DIH/solr/db/conf/solrconfig.xml index c03529e81e97..aaef5b895f26 100644 --- a/solr/example/example-DIH/solr/db/conf/solrconfig.xml +++ b/solr/example/example-DIH/solr/db/conf/solrconfig.xml @@ -35,7 +35,7 @@ that you fully re-index after changing this setting as it can affect both how text is indexed and queried. --> - 7.0.0 + 8.0.0 - 7.0.0 + 8.0.0 - 7.0.0 + 8.0.0 - 7.0.0 + 8.0.0 diff --git a/solr/example/files/conf/solrconfig.xml b/solr/example/files/conf/solrconfig.xml index 71fdd478cb38..a2de3e43d407 100644 --- a/solr/example/files/conf/solrconfig.xml +++ b/solr/example/files/conf/solrconfig.xml @@ -35,7 +35,7 @@ that you fully re-index after changing this setting as it can affect both how text is indexed and queried. --> - 7.0.0 + 8.0.0 - 7.0.0 + 8.0.0 - 7.0.0 + 8.0.0 - - - - - -Lucene 5.0 file format. - - diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/Lucene53NormsFormat.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/Lucene53NormsFormat.java deleted file mode 100644 index 1f7928f2b29a..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/Lucene53NormsFormat.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene53; - - -import java.io.IOException; - -import org.apache.lucene.codecs.CodecUtil; -import org.apache.lucene.codecs.NormsConsumer; -import org.apache.lucene.codecs.NormsFormat; -import org.apache.lucene.codecs.NormsProducer; -import org.apache.lucene.index.SegmentReadState; -import org.apache.lucene.index.SegmentWriteState; -import org.apache.lucene.store.DataOutput; - -/** - * Lucene 5.3 Score normalization format. - *

- * Encodes normalization values by encoding each value with the minimum - * number of bytes needed to represent the range (which can be zero). - *

- * Files: - *

    - *
  1. .nvd: Norms data
  2. - *
  3. .nvm: Norms metadata
  4. - *
- *
    - *
  1. - *

    The Norms metadata or .nvm file.

    - *

    For each norms field, this stores metadata, such as the offset into the - * Norms data (.nvd)

    - *

    Norms metadata (.dvm) --> Header,<Entry>NumFields,Footer

    - *
      - *
    • Header --> {@link CodecUtil#writeIndexHeader IndexHeader}
    • - *
    • Entry --> FieldNumber,BytesPerValue, Address
    • - *
    • FieldNumber --> {@link DataOutput#writeVInt vInt}
    • - *
    • BytesPerValue --> {@link DataOutput#writeByte byte}
    • - *
    • Offset --> {@link DataOutput#writeLong Int64}
    • - *
    • Footer --> {@link CodecUtil#writeFooter CodecFooter}
    • - *
    - *

    FieldNumber of -1 indicates the end of metadata.

    - *

    Offset is the pointer to the start of the data in the norms data (.nvd), or the singleton value - * when BytesPerValue = 0

    - *
  2. - *

    The Norms data or .nvd file.

    - *

    For each Norms field, this stores the actual per-document data (the heavy-lifting)

    - *

    Norms data (.nvd) --> Header,< Data >NumFields,Footer

    - *
      - *
    • Header --> {@link CodecUtil#writeIndexHeader IndexHeader}
    • - *
    • Data --> {@link DataOutput#writeByte(byte) byte}MaxDoc * BytesPerValue
    • - *
    • Footer --> {@link CodecUtil#writeFooter CodecFooter}
    • - *
    - *
- * @lucene.experimental - */ -public class Lucene53NormsFormat extends NormsFormat { - - /** Sole Constructor */ - public Lucene53NormsFormat() {} - - @Override - public NormsConsumer normsConsumer(SegmentWriteState state) throws IOException { - throw new UnsupportedOperationException("This format can only be used for reading"); - } - - @Override - public NormsProducer normsProducer(SegmentReadState state) throws IOException { - return new Lucene53NormsProducer(state, DATA_CODEC, DATA_EXTENSION, METADATA_CODEC, METADATA_EXTENSION); - } - - static final String DATA_CODEC = "Lucene53NormsData"; - static final String DATA_EXTENSION = "nvd"; - static final String METADATA_CODEC = "Lucene53NormsMetadata"; - static final String METADATA_EXTENSION = "nvm"; - static final int VERSION_START = 0; - static final int VERSION_CURRENT = VERSION_START; -} diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/Lucene53NormsProducer.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/Lucene53NormsProducer.java deleted file mode 100644 index 718fcd651b91..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/Lucene53NormsProducer.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene53; - - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import org.apache.lucene.codecs.CodecUtil; -import org.apache.lucene.codecs.NormsProducer; -import org.apache.lucene.index.CorruptIndexException; -import org.apache.lucene.index.FieldInfo; -import org.apache.lucene.index.FieldInfos; -import org.apache.lucene.index.IndexFileNames; -import org.apache.lucene.index.NumericDocValues; -import org.apache.lucene.index.SegmentReadState; -import org.apache.lucene.store.ChecksumIndexInput; -import org.apache.lucene.store.IndexInput; -import org.apache.lucene.store.RandomAccessInput; -import org.apache.lucene.util.IOUtils; - -import static org.apache.lucene.codecs.lucene53.Lucene53NormsFormat.VERSION_CURRENT; -import static org.apache.lucene.codecs.lucene53.Lucene53NormsFormat.VERSION_START; - -/** - * Reader for {@link Lucene53NormsFormat} - */ -class Lucene53NormsProducer extends NormsProducer { - // metadata maps (just file pointers and minimal stuff) - private final Map norms = new HashMap<>(); - private final IndexInput data; - private final int maxDoc; - - Lucene53NormsProducer(SegmentReadState state, String dataCodec, String dataExtension, String metaCodec, String metaExtension) throws IOException { - maxDoc = state.segmentInfo.maxDoc(); - String metaName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, metaExtension); - int version = -1; - - // read in the entries from the metadata file. - try (ChecksumIndexInput in = state.directory.openChecksumInput(metaName, state.context)) { - Throwable priorE = null; - try { - version = CodecUtil.checkIndexHeader(in, metaCodec, VERSION_START, VERSION_CURRENT, state.segmentInfo.getId(), state.segmentSuffix); - readFields(in, state.fieldInfos); - } catch (Throwable exception) { - priorE = exception; - } finally { - CodecUtil.checkFooter(in, priorE); - } - } - - String dataName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, dataExtension); - data = state.directory.openInput(dataName, state.context); - boolean success = false; - try { - final int version2 = CodecUtil.checkIndexHeader(data, dataCodec, VERSION_START, VERSION_CURRENT, state.segmentInfo.getId(), state.segmentSuffix); - if (version != version2) { - throw new CorruptIndexException("Format versions mismatch: meta=" + version + ",data=" + version2, data); - } - - // NOTE: data file is too costly to verify checksum against all the bytes on open, - // but for now we at least verify proper structure of the checksum footer: which looks - // for FOOTER_MAGIC + algorithmID. This is cheap and can detect some forms of corruption - // such as file truncation. - CodecUtil.retrieveChecksum(data); - - success = true; - } finally { - if (!success) { - IOUtils.closeWhileHandlingException(this.data); - } - } - } - - private void readFields(IndexInput meta, FieldInfos infos) throws IOException { - int fieldNumber = meta.readVInt(); - while (fieldNumber != -1) { - FieldInfo info = infos.fieldInfo(fieldNumber); - if (info == null) { - throw new CorruptIndexException("Invalid field number: " + fieldNumber, meta); - } else if (!info.hasNorms()) { - throw new CorruptIndexException("Invalid field: " + info.name, meta); - } - NormsEntry entry = new NormsEntry(); - entry.bytesPerValue = meta.readByte(); - switch (entry.bytesPerValue) { - case 0: case 1: case 2: case 4: case 8: - break; - default: - throw new CorruptIndexException("Invalid bytesPerValue: " + entry.bytesPerValue + ", field: " + info.name, meta); - } - entry.offset = meta.readLong(); - norms.put(info.number, entry); - fieldNumber = meta.readVInt(); - } - } - - @Override - public NumericDocValues getNorms(FieldInfo field) throws IOException { - final NormsEntry entry = norms.get(field.number); - - if (entry.bytesPerValue == 0) { - final long value = entry.offset; - return new NormsIterator(maxDoc) { - @Override - public long longValue() { - return value; - } - }; - } else { - RandomAccessInput slice; - synchronized (data) { - switch (entry.bytesPerValue) { - case 1: - slice = data.randomAccessSlice(entry.offset, maxDoc); - return new NormsIterator(maxDoc) { - @Override - public long longValue() throws IOException { - return slice.readByte(docID); - } - }; - case 2: - slice = data.randomAccessSlice(entry.offset, maxDoc * 2L); - return new NormsIterator(maxDoc) { - @Override - public long longValue() throws IOException { - return slice.readShort(((long)docID) << 1L); - } - }; - case 4: - slice = data.randomAccessSlice(entry.offset, maxDoc * 4L); - return new NormsIterator(maxDoc) { - @Override - public long longValue() throws IOException { - return slice.readInt(((long)docID) << 2L); - } - }; - case 8: - slice = data.randomAccessSlice(entry.offset, maxDoc * 8L); - return new NormsIterator(maxDoc) { - @Override - public long longValue() throws IOException { - return slice.readLong(((long)docID) << 3L); - } - }; - default: - throw new AssertionError(); - } - } - } - } - - @Override - public void close() throws IOException { - data.close(); - } - - @Override - public long ramBytesUsed() { - return 64L * norms.size(); // good enough - } - - @Override - public void checkIntegrity() throws IOException { - CodecUtil.checksumEntireFile(data); - } - - static class NormsEntry { - byte bytesPerValue; - long offset; - } - - @Override - public String toString() { - return getClass().getSimpleName() + "(fields=" + norms.size() + ")"; - } - - private static abstract class NormsIterator extends NumericDocValues { - private final int maxDoc; - protected int docID = -1; - - public NormsIterator(int maxDoc) { - this.maxDoc = maxDoc; - } - - @Override - public int docID() { - return docID; - } - - @Override - public int nextDoc() { - docID++; - if (docID == maxDoc) { - docID = NO_MORE_DOCS; - } - return docID; - } - - @Override - public int advance(int target) { - docID = target; - if (docID >= maxDoc) { - docID = NO_MORE_DOCS; - } - return docID; - } - - @Override - public boolean advanceExact(int target) throws IOException { - docID = target; - return true; - } - - @Override - public long cost() { - // TODO - return 0; - } - } -} diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/package-info.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/package-info.java deleted file mode 100644 index 93fefb8448a4..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene53/package-info.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Components from the Lucene 5.3 index format - * See {@link org.apache.lucene.codecs.lucene53} for an overview - * of the index format. - */ -package org.apache.lucene.codecs.lucene53; diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesConsumer.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesConsumer.java deleted file mode 100644 index 217cd4318fde..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesConsumer.java +++ /dev/null @@ -1,797 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene54; - - -import java.io.Closeable; // javadocs -import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; -import java.util.stream.StreamSupport; - -import org.apache.lucene.codecs.CodecUtil; -import org.apache.lucene.codecs.DocValuesConsumer; -import org.apache.lucene.codecs.DocValuesProducer; -import org.apache.lucene.codecs.LegacyDocValuesIterables; -import org.apache.lucene.index.FieldInfo; -import org.apache.lucene.index.IndexFileNames; -import org.apache.lucene.index.SegmentWriteState; -import org.apache.lucene.store.IndexOutput; -import org.apache.lucene.store.RAMOutputStream; -import org.apache.lucene.util.BytesRef; -import org.apache.lucene.util.BytesRefBuilder; -import org.apache.lucene.util.IOUtils; -import org.apache.lucene.util.LongsRef; -import org.apache.lucene.util.MathUtil; -import org.apache.lucene.util.PagedBytes.PagedBytesDataInput; -import org.apache.lucene.util.PagedBytes; -import org.apache.lucene.util.StringHelper; -import org.apache.lucene.util.packed.DirectMonotonicWriter; -import org.apache.lucene.util.packed.DirectWriter; -import org.apache.lucene.util.packed.MonotonicBlockPackedWriter; -import org.apache.lucene.util.packed.PackedInts; - -import static org.apache.lucene.codecs.lucene54.Lucene54DocValuesFormat.*; - -/** writer for {@link Lucene54DocValuesFormat} */ -final class Lucene54DocValuesConsumer extends DocValuesConsumer implements Closeable { - - enum NumberType { - /** Dense ordinals */ - ORDINAL, - /** Random long values */ - VALUE; - } - - IndexOutput data, meta; - final int maxDoc; - - /** expert: Creates a new writer */ - public Lucene54DocValuesConsumer(SegmentWriteState state, String dataCodec, String dataExtension, String metaCodec, String metaExtension) throws IOException { - boolean success = false; - try { - String dataName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, dataExtension); - data = state.directory.createOutput(dataName, state.context); - CodecUtil.writeIndexHeader(data, dataCodec, Lucene54DocValuesFormat.VERSION_CURRENT, state.segmentInfo.getId(), state.segmentSuffix); - String metaName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, metaExtension); - meta = state.directory.createOutput(metaName, state.context); - CodecUtil.writeIndexHeader(meta, metaCodec, Lucene54DocValuesFormat.VERSION_CURRENT, state.segmentInfo.getId(), state.segmentSuffix); - maxDoc = state.segmentInfo.maxDoc(); - success = true; - } finally { - if (!success) { - IOUtils.closeWhileHandlingException(this); - } - } - } - - @Override - public void addNumericField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException { - addNumericField(field, LegacyDocValuesIterables.numericIterable(field, valuesProducer, maxDoc), NumberType.VALUE); - } - - void addNumericField(FieldInfo field, Iterable values, NumberType numberType) throws IOException { - long count = 0; - long minValue = Long.MAX_VALUE; - long maxValue = Long.MIN_VALUE; - long gcd = 0; - long missingCount = 0; - long zeroCount = 0; - // TODO: more efficient? - HashSet uniqueValues = null; - long missingOrdCount = 0; - if (numberType == NumberType.VALUE) { - uniqueValues = new HashSet<>(); - - for (Number nv : values) { - final long v; - if (nv == null) { - v = 0; - missingCount++; - zeroCount++; - } else { - v = nv.longValue(); - if (v == 0) { - zeroCount++; - } - } - - if (gcd != 1) { - if (v < Long.MIN_VALUE / 2 || v > Long.MAX_VALUE / 2) { - // in that case v - minValue might overflow and make the GCD computation return - // wrong results. Since these extreme values are unlikely, we just discard - // GCD computation for them - gcd = 1; - } else if (count != 0) { // minValue needs to be set first - gcd = MathUtil.gcd(gcd, v - minValue); - } - } - - minValue = Math.min(minValue, v); - maxValue = Math.max(maxValue, v); - - if (uniqueValues != null) { - if (uniqueValues.add(v)) { - if (uniqueValues.size() > 256) { - uniqueValues = null; - } - } - } - - ++count; - } - } else { - for (Number nv : values) { - long v = nv.longValue(); - if (v == -1L) { - missingOrdCount++; - } - minValue = Math.min(minValue, v); - maxValue = Math.max(maxValue, v); - ++count; - } - } - - final long delta = maxValue - minValue; - final int deltaBitsRequired = DirectWriter.unsignedBitsRequired(delta); - final int tableBitsRequired = uniqueValues == null - ? Integer.MAX_VALUE - : DirectWriter.bitsRequired(uniqueValues.size() - 1); - - final boolean sparse; // 1% of docs or less have a value - switch (numberType) { - case VALUE: - sparse = (double) missingCount / count >= 0.99; - break; - case ORDINAL: - sparse = (double) missingOrdCount / count >= 0.99; - break; - default: - throw new AssertionError(); - } - - final int format; - if (uniqueValues != null - && count <= Integer.MAX_VALUE - && (uniqueValues.size() == 1 - || (uniqueValues.size() == 2 && missingCount > 0 && zeroCount == missingCount))) { - // either one unique value C or two unique values: "missing" and C - format = CONST_COMPRESSED; - } else if (sparse && count >= 1024) { - // require at least 1024 docs to avoid flipping back and forth when doing NRT search - format = SPARSE_COMPRESSED; - } else if (uniqueValues != null && tableBitsRequired < deltaBitsRequired) { - format = TABLE_COMPRESSED; - } else if (gcd != 0 && gcd != 1) { - final long gcdDelta = (maxValue - minValue) / gcd; - final long gcdBitsRequired = DirectWriter.unsignedBitsRequired(gcdDelta); - format = gcdBitsRequired < deltaBitsRequired ? GCD_COMPRESSED : DELTA_COMPRESSED; - } else { - format = DELTA_COMPRESSED; - } - meta.writeVInt(field.number); - meta.writeByte(Lucene54DocValuesFormat.NUMERIC); - meta.writeVInt(format); - if (format == SPARSE_COMPRESSED) { - meta.writeLong(data.getFilePointer()); - final long numDocsWithValue; - switch (numberType) { - case VALUE: - numDocsWithValue = count - missingCount; - break; - case ORDINAL: - numDocsWithValue = count - missingOrdCount; - break; - default: - throw new AssertionError(); - } - final long maxDoc = writeSparseMissingBitset(values, numberType, numDocsWithValue); - assert maxDoc == count; - } else if (missingCount == 0) { - meta.writeLong(ALL_LIVE); - } else if (missingCount == count) { - meta.writeLong(ALL_MISSING); - } else { - meta.writeLong(data.getFilePointer()); - writeMissingBitset(values); - } - meta.writeLong(data.getFilePointer()); - meta.writeVLong(count); - - switch (format) { - case CONST_COMPRESSED: - // write the constant (nonzero value in the n=2 case, singleton value otherwise) - meta.writeLong(minValue < 0 ? Collections.min(uniqueValues) : Collections.max(uniqueValues)); - break; - case GCD_COMPRESSED: - meta.writeLong(minValue); - meta.writeLong(gcd); - final long maxDelta = (maxValue - minValue) / gcd; - final int bits = DirectWriter.unsignedBitsRequired(maxDelta); - meta.writeVInt(bits); - final DirectWriter quotientWriter = DirectWriter.getInstance(data, count, bits); - for (Number nv : values) { - long value = nv == null ? 0 : nv.longValue(); - quotientWriter.add((value - minValue) / gcd); - } - quotientWriter.finish(); - break; - case DELTA_COMPRESSED: - final long minDelta = delta < 0 ? 0 : minValue; - meta.writeLong(minDelta); - meta.writeVInt(deltaBitsRequired); - final DirectWriter writer = DirectWriter.getInstance(data, count, deltaBitsRequired); - for (Number nv : values) { - long v = nv == null ? 0 : nv.longValue(); - writer.add(v - minDelta); - } - writer.finish(); - break; - case TABLE_COMPRESSED: - final Long[] decode = uniqueValues.toArray(new Long[uniqueValues.size()]); - Arrays.sort(decode); - final HashMap encode = new HashMap<>(); - meta.writeVInt(decode.length); - for (int i = 0; i < decode.length; i++) { - meta.writeLong(decode[i]); - encode.put(decode[i], i); - } - meta.writeVInt(tableBitsRequired); - final DirectWriter ordsWriter = DirectWriter.getInstance(data, count, tableBitsRequired); - for (Number nv : values) { - ordsWriter.add(encode.get(nv == null ? 0 : nv.longValue())); - } - ordsWriter.finish(); - break; - case SPARSE_COMPRESSED: - final Iterable filteredMissingValues; - switch (numberType) { - case VALUE: - meta.writeByte((byte) 0); - filteredMissingValues = new Iterable() { - @Override - public Iterator iterator() { - return StreamSupport - .stream(values.spliterator(), false) - .filter(value -> value != null) - .iterator(); - } - }; - break; - case ORDINAL: - meta.writeByte((byte) 1); - filteredMissingValues = new Iterable() { - @Override - public Iterator iterator() { - return StreamSupport - .stream(values.spliterator(), false) - .filter(value -> value.longValue() != -1L) - .iterator(); - } - }; - break; - default: - throw new AssertionError(); - } - // Write non-missing values as a numeric field - addNumericField(field, filteredMissingValues, numberType); - break; - default: - throw new AssertionError(); - } - meta.writeLong(data.getFilePointer()); - } - - // TODO: in some cases representing missing with minValue-1 wouldn't take up additional space and so on, - // but this is very simple, and algorithms only check this for values of 0 anyway (doesnt slow down normal decode) - void writeMissingBitset(Iterable values) throws IOException { - byte bits = 0; - int count = 0; - for (Object v : values) { - if (count == 8) { - data.writeByte(bits); - count = 0; - bits = 0; - } - if (v != null) { - bits |= 1 << (count & 7); - } - count++; - } - if (count > 0) { - data.writeByte(bits); - } - } - - long writeSparseMissingBitset(Iterable values, NumberType numberType, long numDocsWithValue) throws IOException { - meta.writeVLong(numDocsWithValue); - - // Write doc IDs that have a value - meta.writeVInt(DIRECT_MONOTONIC_BLOCK_SHIFT); - final DirectMonotonicWriter docIdsWriter = DirectMonotonicWriter.getInstance(meta, data, numDocsWithValue, DIRECT_MONOTONIC_BLOCK_SHIFT); - long docID = 0; - for (Number nv : values) { - switch (numberType) { - case VALUE: - if (nv != null) { - docIdsWriter.add(docID); - } - break; - case ORDINAL: - if (nv.longValue() != -1L) { - docIdsWriter.add(docID); - } - break; - default: - throw new AssertionError(); - } - docID++; - } - docIdsWriter.finish(); - return docID; - } - - @Override - public void addBinaryField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException { - addBinaryField(field, LegacyDocValuesIterables.binaryIterable(field, valuesProducer, maxDoc)); - } - - private void addBinaryField(FieldInfo field, Iterable values) throws IOException { - // write the byte[] data - meta.writeVInt(field.number); - meta.writeByte(Lucene54DocValuesFormat.BINARY); - int minLength = Integer.MAX_VALUE; - int maxLength = Integer.MIN_VALUE; - final long startFP = data.getFilePointer(); - long count = 0; - long missingCount = 0; - for(BytesRef v : values) { - final int length; - if (v == null) { - length = 0; - missingCount++; - } else { - length = v.length; - } - minLength = Math.min(minLength, length); - maxLength = Math.max(maxLength, length); - if (v != null) { - data.writeBytes(v.bytes, v.offset, v.length); - } - count++; - } - meta.writeVInt(minLength == maxLength ? BINARY_FIXED_UNCOMPRESSED : BINARY_VARIABLE_UNCOMPRESSED); - if (missingCount == 0) { - meta.writeLong(ALL_LIVE); - } else if (missingCount == count) { - meta.writeLong(ALL_MISSING); - } else { - meta.writeLong(data.getFilePointer()); - writeMissingBitset(values); - } - meta.writeVInt(minLength); - meta.writeVInt(maxLength); - meta.writeVLong(count); - meta.writeLong(startFP); - - // if minLength == maxLength, it's a fixed-length byte[], we are done (the addresses are implicit) - // otherwise, we need to record the length fields... - if (minLength != maxLength) { - meta.writeLong(data.getFilePointer()); - meta.writeVInt(DIRECT_MONOTONIC_BLOCK_SHIFT); - - final DirectMonotonicWriter writer = DirectMonotonicWriter.getInstance(meta, data, count + 1, DIRECT_MONOTONIC_BLOCK_SHIFT); - long addr = 0; - writer.add(addr); - for (BytesRef v : values) { - if (v != null) { - addr += v.length; - } - writer.add(addr); - } - writer.finish(); - meta.writeLong(data.getFilePointer()); - } - } - - /** expert: writes a value dictionary for a sorted/sortedset field */ - private void addTermsDict(FieldInfo field, final Iterable values) throws IOException { - // first check if it's a "fixed-length" terms dict, and compressibility if so - int minLength = Integer.MAX_VALUE; - int maxLength = Integer.MIN_VALUE; - long numValues = 0; - BytesRefBuilder previousValue = new BytesRefBuilder(); - long prefixSum = 0; // only valid for fixed-width data, as we have a choice there - for (BytesRef v : values) { - minLength = Math.min(minLength, v.length); - maxLength = Math.max(maxLength, v.length); - if (minLength == maxLength) { - int termPosition = (int) (numValues & INTERVAL_MASK); - if (termPosition == 0) { - // first term in block, save it away to compare against the last term later - previousValue.copyBytes(v); - } else if (termPosition == INTERVAL_COUNT - 1) { - // last term in block, accumulate shared prefix against first term - prefixSum += StringHelper.bytesDifference(previousValue.get(), v); - } - } - numValues++; - } - // for fixed width data, look at the avg(shared prefix) before deciding how to encode: - // prefix compression "costs" worst case 2 bytes per term because we must store suffix lengths. - // so if we share at least 3 bytes on average, always compress. - if (minLength == maxLength && prefixSum <= 3*(numValues >> INTERVAL_SHIFT)) { - // no index needed: not very compressible, direct addressing by mult - addBinaryField(field, values); - } else if (numValues < REVERSE_INTERVAL_COUNT) { - // low cardinality: waste a few KB of ram, but can't really use fancy index etc - addBinaryField(field, values); - } else { - assert numValues > 0; // we don't have to handle the empty case - // header - meta.writeVInt(field.number); - meta.writeByte(Lucene54DocValuesFormat.BINARY); - meta.writeVInt(BINARY_PREFIX_COMPRESSED); - meta.writeLong(-1L); - // now write the bytes: sharing prefixes within a block - final long startFP = data.getFilePointer(); - // currently, we have to store the delta from expected for every 1/nth term - // we could avoid this, but it's not much and less overall RAM than the previous approach! - RAMOutputStream addressBuffer = new RAMOutputStream(); - MonotonicBlockPackedWriter termAddresses = new MonotonicBlockPackedWriter(addressBuffer, MONOTONIC_BLOCK_SIZE); - // buffers up 16 terms - RAMOutputStream bytesBuffer = new RAMOutputStream(); - // buffers up block header - RAMOutputStream headerBuffer = new RAMOutputStream(); - BytesRefBuilder lastTerm = new BytesRefBuilder(); - lastTerm.grow(maxLength); - long count = 0; - int suffixDeltas[] = new int[INTERVAL_COUNT]; - for (BytesRef v : values) { - int termPosition = (int) (count & INTERVAL_MASK); - if (termPosition == 0) { - termAddresses.add(data.getFilePointer() - startFP); - // abs-encode first term - headerBuffer.writeVInt(v.length); - headerBuffer.writeBytes(v.bytes, v.offset, v.length); - lastTerm.copyBytes(v); - } else { - // prefix-code: we only share at most 255 characters, to encode the length as a single - // byte and have random access. Larger terms just get less compression. - int sharedPrefix = Math.min(255, StringHelper.bytesDifference(lastTerm.get(), v)); - bytesBuffer.writeByte((byte) sharedPrefix); - bytesBuffer.writeBytes(v.bytes, v.offset + sharedPrefix, v.length - sharedPrefix); - // we can encode one smaller, because terms are unique. - suffixDeltas[termPosition] = v.length - sharedPrefix - 1; - } - - count++; - // flush block - if ((count & INTERVAL_MASK) == 0) { - flushTermsDictBlock(headerBuffer, bytesBuffer, suffixDeltas); - } - } - // flush trailing crap - int leftover = (int) (count & INTERVAL_MASK); - if (leftover > 0) { - Arrays.fill(suffixDeltas, leftover, suffixDeltas.length, 0); - flushTermsDictBlock(headerBuffer, bytesBuffer, suffixDeltas); - } - final long indexStartFP = data.getFilePointer(); - // write addresses of indexed terms - termAddresses.finish(); - addressBuffer.writeTo(data); - addressBuffer = null; - termAddresses = null; - meta.writeVInt(minLength); - meta.writeVInt(maxLength); - meta.writeVLong(count); - meta.writeLong(startFP); - meta.writeLong(indexStartFP); - meta.writeVInt(PackedInts.VERSION_CURRENT); - meta.writeVInt(MONOTONIC_BLOCK_SIZE); - addReverseTermIndex(field, values, maxLength); - } - } - // writes term dictionary "block" - // first term is absolute encoded as vint length + bytes. - // lengths of subsequent N terms are encoded as either N bytes or N shorts. - // in the double-byte case, the first byte is indicated with -1. - // subsequent terms are encoded as byte suffixLength + bytes. - private void flushTermsDictBlock(RAMOutputStream headerBuffer, RAMOutputStream bytesBuffer, int suffixDeltas[]) throws IOException { - boolean twoByte = false; - for (int i = 1; i < suffixDeltas.length; i++) { - if (suffixDeltas[i] > 254) { - twoByte = true; - } - } - if (twoByte) { - headerBuffer.writeByte((byte)255); - for (int i = 1; i < suffixDeltas.length; i++) { - headerBuffer.writeShort((short) suffixDeltas[i]); - } - } else { - for (int i = 1; i < suffixDeltas.length; i++) { - headerBuffer.writeByte((byte) suffixDeltas[i]); - } - } - headerBuffer.writeTo(data); - headerBuffer.reset(); - bytesBuffer.writeTo(data); - bytesBuffer.reset(); - } - - // writes reverse term index: used for binary searching a term into a range of 64 blocks - // for every 64 blocks (1024 terms) we store a term, trimming any suffix unnecessary for comparison - // terms are written as a contiguous byte[], but never spanning 2^15 byte boundaries. - private void addReverseTermIndex(FieldInfo field, final Iterable values, int maxLength) throws IOException { - long count = 0; - BytesRefBuilder priorTerm = new BytesRefBuilder(); - priorTerm.grow(maxLength); - BytesRef indexTerm = new BytesRef(); - long startFP = data.getFilePointer(); - PagedBytes pagedBytes = new PagedBytes(15); - MonotonicBlockPackedWriter addresses = new MonotonicBlockPackedWriter(data, MONOTONIC_BLOCK_SIZE); - - for (BytesRef b : values) { - int termPosition = (int) (count & REVERSE_INTERVAL_MASK); - if (termPosition == 0) { - int len = StringHelper.sortKeyLength(priorTerm.get(), b); - indexTerm.bytes = b.bytes; - indexTerm.offset = b.offset; - indexTerm.length = len; - addresses.add(pagedBytes.copyUsingLengthPrefix(indexTerm)); - } else if (termPosition == REVERSE_INTERVAL_MASK) { - priorTerm.copyBytes(b); - } - count++; - } - addresses.finish(); - long numBytes = pagedBytes.getPointer(); - pagedBytes.freeze(true); - PagedBytesDataInput in = pagedBytes.getDataInput(); - meta.writeLong(startFP); - data.writeVLong(numBytes); - data.copyBytes(in, numBytes); - } - - @Override - public void addSortedField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException { - meta.writeVInt(field.number); - meta.writeByte(Lucene54DocValuesFormat.SORTED); - addTermsDict(field, LegacyDocValuesIterables.valuesIterable(valuesProducer.getSorted(field))); - addNumericField(field, LegacyDocValuesIterables.sortedOrdIterable(valuesProducer, field, maxDoc), NumberType.ORDINAL); - } - - private void addSortedField(FieldInfo field, Iterable values, Iterable ords) throws IOException { - meta.writeVInt(field.number); - meta.writeByte(Lucene54DocValuesFormat.SORTED); - addTermsDict(field, values); - addNumericField(field, ords, NumberType.ORDINAL); - } - - @Override - public void addSortedNumericField(FieldInfo field, final DocValuesProducer valuesProducer) throws IOException { - - final Iterable docToValueCount = LegacyDocValuesIterables.sortedNumericToDocCount(valuesProducer, field, maxDoc); - final Iterable values = LegacyDocValuesIterables.sortedNumericToValues(valuesProducer, field); - - meta.writeVInt(field.number); - meta.writeByte(Lucene54DocValuesFormat.SORTED_NUMERIC); - if (isSingleValued(docToValueCount)) { - meta.writeVInt(SORTED_SINGLE_VALUED); - // The field is single-valued, we can encode it as NUMERIC - addNumericField(field, singletonView(docToValueCount, values, null), NumberType.VALUE); - } else { - final SortedSet uniqueValueSets = uniqueValueSets(docToValueCount, values); - if (uniqueValueSets != null) { - meta.writeVInt(SORTED_SET_TABLE); - - // write the set_id -> values mapping - writeDictionary(uniqueValueSets); - - // write the doc -> set_id as a numeric field - addNumericField(field, docToSetId(uniqueValueSets, docToValueCount, values), NumberType.ORDINAL); - } else { - meta.writeVInt(SORTED_WITH_ADDRESSES); - // write the stream of values as a numeric field - addNumericField(field, values, NumberType.VALUE); - // write the doc -> ord count as a absolute index to the stream - addOrdIndex(field, docToValueCount); - } - } - } - - @Override - public void addSortedSetField(FieldInfo field, DocValuesProducer valuesProducer) throws IOException { - - Iterable values = LegacyDocValuesIterables.valuesIterable(valuesProducer.getSortedSet(field)); - Iterable docToOrdCount = LegacyDocValuesIterables.sortedSetOrdCountIterable(valuesProducer, field, maxDoc); - Iterable ords = LegacyDocValuesIterables.sortedSetOrdsIterable(valuesProducer, field); - - meta.writeVInt(field.number); - meta.writeByte(Lucene54DocValuesFormat.SORTED_SET); - - if (isSingleValued(docToOrdCount)) { - meta.writeVInt(SORTED_SINGLE_VALUED); - // The field is single-valued, we can encode it as SORTED - addSortedField(field, values, singletonView(docToOrdCount, ords, -1L)); - } else { - final SortedSet uniqueValueSets = uniqueValueSets(docToOrdCount, ords); - if (uniqueValueSets != null) { - meta.writeVInt(SORTED_SET_TABLE); - - // write the set_id -> ords mapping - writeDictionary(uniqueValueSets); - - // write the ord -> byte[] as a binary field - addTermsDict(field, values); - - // write the doc -> set_id as a numeric field - addNumericField(field, docToSetId(uniqueValueSets, docToOrdCount, ords), NumberType.ORDINAL); - } else { - meta.writeVInt(SORTED_WITH_ADDRESSES); - - // write the ord -> byte[] as a binary field - addTermsDict(field, values); - - // write the stream of ords as a numeric field - // NOTE: we could return an iterator that delta-encodes these within a doc - addNumericField(field, ords, NumberType.ORDINAL); - - // write the doc -> ord count as a absolute index to the stream - addOrdIndex(field, docToOrdCount); - } - } - } - - private SortedSet uniqueValueSets(Iterable docToValueCount, Iterable values) { - Set uniqueValueSet = new HashSet<>(); - LongsRef docValues = new LongsRef(256); - - Iterator valueCountIterator = docToValueCount.iterator(); - Iterator valueIterator = values.iterator(); - int totalDictSize = 0; - while (valueCountIterator.hasNext()) { - docValues.length = valueCountIterator.next().intValue(); - if (docValues.length > 256) { - return null; - } - for (int i = 0; i < docValues.length; ++i) { - docValues.longs[i] = valueIterator.next().longValue(); - } - if (uniqueValueSet.contains(docValues)) { - continue; - } - totalDictSize += docValues.length; - if (totalDictSize > 256) { - return null; - } - uniqueValueSet.add(new LongsRef(Arrays.copyOf(docValues.longs, docValues.length), 0, docValues.length)); - } - assert valueIterator.hasNext() == false; - return new TreeSet<>(uniqueValueSet); - } - - private void writeDictionary(SortedSet uniqueValueSets) throws IOException { - int lengthSum = 0; - for (LongsRef longs : uniqueValueSets) { - lengthSum += longs.length; - } - - meta.writeInt(lengthSum); - for (LongsRef valueSet : uniqueValueSets) { - for (int i = 0; i < valueSet.length; ++i) { - meta.writeLong(valueSet.longs[valueSet.offset + i]); - } - } - - meta.writeInt(uniqueValueSets.size()); - for (LongsRef valueSet : uniqueValueSets) { - meta.writeInt(valueSet.length); - } - } - - private Iterable docToSetId(SortedSet uniqueValueSets, Iterable docToValueCount, Iterable values) { - final Map setIds = new HashMap<>(); - int i = 0; - for (LongsRef set : uniqueValueSets) { - setIds.put(set, i++); - } - assert i == uniqueValueSets.size(); - - return new Iterable() { - - @Override - public Iterator iterator() { - final Iterator valueCountIterator = docToValueCount.iterator(); - final Iterator valueIterator = values.iterator(); - final LongsRef docValues = new LongsRef(256); - return new Iterator() { - - @Override - public boolean hasNext() { - return valueCountIterator.hasNext(); - } - - @Override - public Number next() { - docValues.length = valueCountIterator.next().intValue(); - for (int i = 0; i < docValues.length; ++i) { - docValues.longs[i] = valueIterator.next().longValue(); - } - final Integer id = setIds.get(docValues); - assert id != null; - return id; - } - - }; - - } - }; - } - - // writes addressing information as MONOTONIC_COMPRESSED integer - private void addOrdIndex(FieldInfo field, Iterable values) throws IOException { - meta.writeVInt(field.number); - meta.writeByte(Lucene54DocValuesFormat.NUMERIC); - meta.writeVInt(MONOTONIC_COMPRESSED); - meta.writeLong(-1L); - meta.writeLong(data.getFilePointer()); - meta.writeVLong(maxDoc); - meta.writeVInt(DIRECT_MONOTONIC_BLOCK_SHIFT); - - final DirectMonotonicWriter writer = DirectMonotonicWriter.getInstance(meta, data, maxDoc + 1, DIRECT_MONOTONIC_BLOCK_SHIFT); - long addr = 0; - writer.add(addr); - for (Number v : values) { - addr += v.longValue(); - writer.add(addr); - } - writer.finish(); - meta.writeLong(data.getFilePointer()); - } - - @Override - public void close() throws IOException { - boolean success = false; - try { - if (meta != null) { - meta.writeVInt(-1); // write EOF marker - CodecUtil.writeFooter(meta); // write checksum - } - if (data != null) { - CodecUtil.writeFooter(data); // write checksum - } - success = true; - } finally { - if (success) { - IOUtils.close(data, meta); - } else { - IOUtils.closeWhileHandlingException(data, meta); - } - meta = data = null; - } - } -} diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesFormat.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesFormat.java deleted file mode 100644 index 91ccfe26f7f7..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesFormat.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene54; - - -import java.io.IOException; - -import org.apache.lucene.codecs.DocValuesConsumer; -import org.apache.lucene.codecs.DocValuesFormat; -import org.apache.lucene.codecs.DocValuesProducer; -import org.apache.lucene.codecs.lucene70.Lucene70DocValuesFormat; -import org.apache.lucene.index.DocValuesType; -import org.apache.lucene.index.SegmentReadState; -import org.apache.lucene.index.SegmentWriteState; -import org.apache.lucene.util.SmallFloat; -import org.apache.lucene.util.packed.DirectWriter; - -/** - * Lucene 5.4 DocValues format. - *

- * Encodes the five per-document value types (Numeric,Binary,Sorted,SortedSet,SortedNumeric) with these strategies: - *

- * {@link DocValuesType#NUMERIC NUMERIC}: - *

    - *
  • Delta-compressed: per-document integers written as deltas from the minimum value, - * compressed with bitpacking. For more information, see {@link DirectWriter}. - *
  • Table-compressed: when the number of unique values is very small (< 256), and - * when there are unused "gaps" in the range of values used (such as {@link SmallFloat}), - * a lookup table is written instead. Each per-document entry is instead the ordinal - * to this table, and those ordinals are compressed with bitpacking ({@link DirectWriter}). - *
  • GCD-compressed: when all numbers share a common divisor, such as dates, the greatest - * common denominator (GCD) is computed, and quotients are stored using Delta-compressed Numerics. - *
  • Monotonic-compressed: when all numbers are monotonically increasing offsets, they are written - * as blocks of bitpacked integers, encoding the deviation from the expected delta. - *
  • Const-compressed: when there is only one possible non-missing value, only the missing - * bitset is encoded. - *
  • Sparse-compressed: only documents with a value are stored, and lookups are performed - * using binary search. - *
- *

- * {@link DocValuesType#BINARY BINARY}: - *

    - *
  • Fixed-width Binary: one large concatenated byte[] is written, along with the fixed length. - * Each document's value can be addressed directly with multiplication ({@code docID * length}). - *
  • Variable-width Binary: one large concatenated byte[] is written, along with end addresses - * for each document. The addresses are written as Monotonic-compressed numerics. - *
  • Prefix-compressed Binary: values are written in chunks of 16, with the first value written - * completely and other values sharing prefixes. chunk addresses are written as Monotonic-compressed - * numerics. A reverse lookup index is written from a portion of every 1024th term. - *
- *

- * {@link DocValuesType#SORTED SORTED}: - *

    - *
  • Sorted: a mapping of ordinals to deduplicated terms is written as Binary, - * along with the per-document ordinals written using one of the numeric strategies above. - *
- *

- * {@link DocValuesType#SORTED_SET SORTED_SET}: - *

    - *
  • Single: if all documents have 0 or 1 value, then data are written like SORTED. - *
  • SortedSet table: when there are few unique sets of values (< 256) then each set is assigned - * an id, a lookup table is written and the mapping from document to set id is written using the - * numeric strategies above. - *
  • SortedSet: a mapping of ordinals to deduplicated terms is written as Binary, - * an ordinal list and per-document index into this list are written using the numeric strategies - * above. - *
- *

- * {@link DocValuesType#SORTED_NUMERIC SORTED_NUMERIC}: - *

    - *
  • Single: if all documents have 0 or 1 value, then data are written like NUMERIC. - *
  • SortedSet table: when there are few unique sets of values (< 256) then each set is assigned - * an id, a lookup table is written and the mapping from document to set id is written using the - * numeric strategies above. - *
  • SortedNumeric: a value list and per-document index into this list are written using the numeric - * strategies above. - *
- *

- * Files: - *

    - *
  1. .dvd: DocValues data
  2. - *
  3. .dvm: DocValues metadata
  4. - *
- * @lucene.experimental - * @deprecated Use {@link Lucene70DocValuesFormat}. - */ -@Deprecated -public final class Lucene54DocValuesFormat extends DocValuesFormat { - - /** Sole Constructor */ - public Lucene54DocValuesFormat() { - super("Lucene54"); - } - - @Override - public DocValuesConsumer fieldsConsumer(SegmentWriteState state) throws IOException { - return new Lucene54DocValuesConsumer(state, DATA_CODEC, DATA_EXTENSION, META_CODEC, META_EXTENSION); - } - - @Override - public DocValuesProducer fieldsProducer(SegmentReadState state) throws IOException { - return new Lucene54DocValuesProducer(state, DATA_CODEC, DATA_EXTENSION, META_CODEC, META_EXTENSION); - } - - static final String DATA_CODEC = "Lucene54DocValuesData"; - static final String DATA_EXTENSION = "dvd"; - static final String META_CODEC = "Lucene54DocValuesMetadata"; - static final String META_EXTENSION = "dvm"; - static final int VERSION_START = 0; - static final int VERSION_CURRENT = VERSION_START; - - // indicates docvalues type - static final byte NUMERIC = 0; - static final byte BINARY = 1; - static final byte SORTED = 2; - static final byte SORTED_SET = 3; - static final byte SORTED_NUMERIC = 4; - - // address terms in blocks of 16 terms - static final int INTERVAL_SHIFT = 4; - static final int INTERVAL_COUNT = 1 << INTERVAL_SHIFT; - static final int INTERVAL_MASK = INTERVAL_COUNT - 1; - - // build reverse index from every 1024th term - static final int REVERSE_INTERVAL_SHIFT = 10; - static final int REVERSE_INTERVAL_COUNT = 1 << REVERSE_INTERVAL_SHIFT; - static final int REVERSE_INTERVAL_MASK = REVERSE_INTERVAL_COUNT - 1; - - // for conversion from reverse index to block - static final int BLOCK_INTERVAL_SHIFT = REVERSE_INTERVAL_SHIFT - INTERVAL_SHIFT; - static final int BLOCK_INTERVAL_COUNT = 1 << BLOCK_INTERVAL_SHIFT; - static final int BLOCK_INTERVAL_MASK = BLOCK_INTERVAL_COUNT - 1; - - /** Compressed using packed blocks of ints. */ - static final int DELTA_COMPRESSED = 0; - /** Compressed by computing the GCD. */ - static final int GCD_COMPRESSED = 1; - /** Compressed by giving IDs to unique values. */ - static final int TABLE_COMPRESSED = 2; - /** Compressed with monotonically increasing values */ - static final int MONOTONIC_COMPRESSED = 3; - /** Compressed with constant value (uses only missing bitset) */ - static final int CONST_COMPRESSED = 4; - /** Compressed with sparse arrays. */ - static final int SPARSE_COMPRESSED = 5; - - /** Uncompressed binary, written directly (fixed length). */ - static final int BINARY_FIXED_UNCOMPRESSED = 0; - /** Uncompressed binary, written directly (variable length). */ - static final int BINARY_VARIABLE_UNCOMPRESSED = 1; - /** Compressed binary with shared prefixes */ - static final int BINARY_PREFIX_COMPRESSED = 2; - - /** Standard storage for sorted set values with 1 level of indirection: - * {@code docId -> address -> ord}. */ - static final int SORTED_WITH_ADDRESSES = 0; - /** Single-valued sorted set values, encoded as sorted values, so no level - * of indirection: {@code docId -> ord}. */ - static final int SORTED_SINGLE_VALUED = 1; - /** Compressed giving IDs to unique sets of values: - * {@code docId -> setId -> ords} */ - static final int SORTED_SET_TABLE = 2; - - /** placeholder for missing offset that means there are no missing values */ - static final int ALL_LIVE = -1; - /** placeholder for missing offset that means all values are missing */ - static final int ALL_MISSING = -2; - - // addressing uses 16k blocks - static final int MONOTONIC_BLOCK_SIZE = 16384; - static final int DIRECT_MONOTONIC_BLOCK_SHIFT = 16; -} diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java deleted file mode 100644 index a35f503cb983..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java +++ /dev/null @@ -1,1803 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene54; - -import java.io.Closeable; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicLong; - -import org.apache.lucene.codecs.CodecUtil; -import org.apache.lucene.codecs.DocValuesProducer; -import org.apache.lucene.codecs.lucene54.Lucene54DocValuesConsumer.NumberType; -import org.apache.lucene.index.*; -import org.apache.lucene.index.NumericDocValues; -import org.apache.lucene.store.ChecksumIndexInput; -import org.apache.lucene.store.IndexInput; -import org.apache.lucene.store.RandomAccessInput; -import org.apache.lucene.util.Accountable; -import org.apache.lucene.util.Accountables; -import org.apache.lucene.util.Bits; -import org.apache.lucene.util.BytesRef; -import org.apache.lucene.util.IOUtils; -import org.apache.lucene.util.LongValues; -import org.apache.lucene.util.PagedBytes; -import org.apache.lucene.util.RamUsageEstimator; -import org.apache.lucene.util.packed.DirectMonotonicReader; -import org.apache.lucene.util.packed.DirectReader; -import org.apache.lucene.util.packed.MonotonicBlockPackedReader; - -import static org.apache.lucene.codecs.lucene54.Lucene54DocValuesFormat.*; - -/** reader for {@link Lucene54DocValuesFormat} */ -final class Lucene54DocValuesProducer extends DocValuesProducer implements Closeable { - private final Map numerics = new HashMap<>(); - private final Map binaries = new HashMap<>(); - private final Map sortedSets = new HashMap<>(); - private final Map sortedNumerics = new HashMap<>(); - private final Map ords = new HashMap<>(); - private final Map ordIndexes = new HashMap<>(); - private final int numFields; - private final AtomicLong ramBytesUsed; - private final IndexInput data; - private final int maxDoc; - - // memory-resident structures - private final Map addressInstances = new HashMap<>(); - private final Map reverseIndexInstances = new HashMap<>(); - private final Map directAddressesMeta = new HashMap<>(); - - private final boolean merging; - - // clone for merge: when merging we don't do any instances.put()s - Lucene54DocValuesProducer(Lucene54DocValuesProducer original) throws IOException { - assert Thread.holdsLock(original); - numerics.putAll(original.numerics); - binaries.putAll(original.binaries); - sortedSets.putAll(original.sortedSets); - sortedNumerics.putAll(original.sortedNumerics); - ords.putAll(original.ords); - ordIndexes.putAll(original.ordIndexes); - numFields = original.numFields; - ramBytesUsed = new AtomicLong(original.ramBytesUsed.get()); - data = original.data.clone(); - maxDoc = original.maxDoc; - - addressInstances.putAll(original.addressInstances); - reverseIndexInstances.putAll(original.reverseIndexInstances); - merging = true; - } - - /** expert: instantiates a new reader */ - Lucene54DocValuesProducer(SegmentReadState state, String dataCodec, String dataExtension, String metaCodec, String metaExtension) throws IOException { - String metaName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, metaExtension); - this.maxDoc = state.segmentInfo.maxDoc(); - merging = false; - ramBytesUsed = new AtomicLong(RamUsageEstimator.shallowSizeOfInstance(getClass())); - - int version = -1; - int numFields = -1; - - // read in the entries from the metadata file. - try (ChecksumIndexInput in = state.directory.openChecksumInput(metaName, state.context)) { - Throwable priorE = null; - try { - version = CodecUtil.checkIndexHeader(in, metaCodec, - Lucene54DocValuesFormat.VERSION_START, - Lucene54DocValuesFormat.VERSION_CURRENT, - state.segmentInfo.getId(), - state.segmentSuffix); - numFields = readFields(in, state.fieldInfos); - } catch (Throwable exception) { - priorE = exception; - } finally { - CodecUtil.checkFooter(in, priorE); - } - } - - this.numFields = numFields; - String dataName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, dataExtension); - this.data = state.directory.openInput(dataName, state.context); - boolean success = false; - try { - final int version2 = CodecUtil.checkIndexHeader(data, dataCodec, - Lucene54DocValuesFormat.VERSION_START, - Lucene54DocValuesFormat.VERSION_CURRENT, - state.segmentInfo.getId(), - state.segmentSuffix); - if (version != version2) { - throw new CorruptIndexException("Format versions mismatch: meta=" + version + ", data=" + version2, data); - } - - // NOTE: data file is too costly to verify checksum against all the bytes on open, - // but for now we at least verify proper structure of the checksum footer: which looks - // for FOOTER_MAGIC + algorithmID. This is cheap and can detect some forms of corruption - // such as file truncation. - CodecUtil.retrieveChecksum(data); - - success = true; - } finally { - if (!success) { - IOUtils.closeWhileHandlingException(this.data); - } - } - } - - private void readSortedField(FieldInfo info, IndexInput meta) throws IOException { - // sorted = binary + numeric - if (meta.readVInt() != info.number) { - throw new CorruptIndexException("sorted entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.BINARY) { - throw new CorruptIndexException("sorted entry for field: " + info.name + " is corrupt", meta); - } - BinaryEntry b = readBinaryEntry(info, meta); - binaries.put(info.name, b); - - if (meta.readVInt() != info.number) { - throw new CorruptIndexException("sorted entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.NUMERIC) { - throw new CorruptIndexException("sorted entry for field: " + info.name + " is corrupt", meta); - } - NumericEntry n = readNumericEntry(info, meta); - ords.put(info.name, n); - } - - private void readSortedSetFieldWithAddresses(FieldInfo info, IndexInput meta) throws IOException { - // sortedset = binary + numeric (addresses) + ordIndex - if (meta.readVInt() != info.number) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.BINARY) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - BinaryEntry b = readBinaryEntry(info, meta); - binaries.put(info.name, b); - - if (meta.readVInt() != info.number) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.NUMERIC) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - NumericEntry n1 = readNumericEntry(info, meta); - ords.put(info.name, n1); - - if (meta.readVInt() != info.number) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.NUMERIC) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - NumericEntry n2 = readNumericEntry(info, meta); - ordIndexes.put(info.name, n2); - } - - private void readSortedSetFieldWithTable(FieldInfo info, IndexInput meta) throws IOException { - // sortedset table = binary + ordset table + ordset index - if (meta.readVInt() != info.number) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.BINARY) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - - BinaryEntry b = readBinaryEntry(info, meta); - binaries.put(info.name, b); - - if (meta.readVInt() != info.number) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.NUMERIC) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - NumericEntry n = readNumericEntry(info, meta); - ords.put(info.name, n); - } - - private int readFields(IndexInput meta, FieldInfos infos) throws IOException { - int numFields = 0; - int fieldNumber = meta.readVInt(); - while (fieldNumber != -1) { - numFields++; - FieldInfo info = infos.fieldInfo(fieldNumber); - if (info == null) { - // trickier to validate more: because we use multiple entries for "composite" types like sortedset, etc. - throw new CorruptIndexException("Invalid field number: " + fieldNumber, meta); - } - byte type = meta.readByte(); - if (type == Lucene54DocValuesFormat.NUMERIC) { - numerics.put(info.name, readNumericEntry(info, meta)); - } else if (type == Lucene54DocValuesFormat.BINARY) { - BinaryEntry b = readBinaryEntry(info, meta); - binaries.put(info.name, b); - } else if (type == Lucene54DocValuesFormat.SORTED) { - readSortedField(info, meta); - } else if (type == Lucene54DocValuesFormat.SORTED_SET) { - SortedSetEntry ss = readSortedSetEntry(meta); - sortedSets.put(info.name, ss); - if (ss.format == SORTED_WITH_ADDRESSES) { - readSortedSetFieldWithAddresses(info, meta); - } else if (ss.format == SORTED_SET_TABLE) { - readSortedSetFieldWithTable(info, meta); - } else if (ss.format == SORTED_SINGLE_VALUED) { - if (meta.readVInt() != fieldNumber) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.SORTED) { - throw new CorruptIndexException("sortedset entry for field: " + info.name + " is corrupt", meta); - } - readSortedField(info, meta); - } else { - throw new AssertionError(); - } - } else if (type == Lucene54DocValuesFormat.SORTED_NUMERIC) { - SortedSetEntry ss = readSortedSetEntry(meta); - sortedNumerics.put(info.name, ss); - if (ss.format == SORTED_WITH_ADDRESSES) { - if (meta.readVInt() != fieldNumber) { - throw new CorruptIndexException("sortednumeric entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.NUMERIC) { - throw new CorruptIndexException("sortednumeric entry for field: " + info.name + " is corrupt", meta); - } - numerics.put(info.name, readNumericEntry(info, meta)); - if (meta.readVInt() != fieldNumber) { - throw new CorruptIndexException("sortednumeric entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.NUMERIC) { - throw new CorruptIndexException("sortednumeric entry for field: " + info.name + " is corrupt", meta); - } - NumericEntry ordIndex = readNumericEntry(info, meta); - ordIndexes.put(info.name, ordIndex); - } else if (ss.format == SORTED_SET_TABLE) { - if (meta.readVInt() != info.number) { - throw new CorruptIndexException("sortednumeric entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.NUMERIC) { - throw new CorruptIndexException("sortednumeric entry for field: " + info.name + " is corrupt", meta); - } - NumericEntry n = readNumericEntry(info, meta); - ords.put(info.name, n); - } else if (ss.format == SORTED_SINGLE_VALUED) { - if (meta.readVInt() != fieldNumber) { - throw new CorruptIndexException("sortednumeric entry for field: " + info.name + " is corrupt", meta); - } - if (meta.readByte() != Lucene54DocValuesFormat.NUMERIC) { - throw new CorruptIndexException("sortednumeric entry for field: " + info.name + " is corrupt", meta); - } - numerics.put(info.name, readNumericEntry(info, meta)); - } else { - throw new AssertionError(); - } - } else { - throw new CorruptIndexException("invalid type: " + type, meta); - } - fieldNumber = meta.readVInt(); - } - return numFields; - } - - private NumericEntry readNumericEntry(FieldInfo info, IndexInput meta) throws IOException { - NumericEntry entry = new NumericEntry(); - entry.format = meta.readVInt(); - entry.missingOffset = meta.readLong(); - if (entry.format == SPARSE_COMPRESSED) { - // sparse bits need a bit more metadata - entry.numDocsWithValue = meta.readVLong(); - final int blockShift = meta.readVInt(); - entry.monotonicMeta = DirectMonotonicReader.loadMeta(meta, entry.numDocsWithValue, blockShift); - ramBytesUsed.addAndGet(entry.monotonicMeta.ramBytesUsed()); - directAddressesMeta.put(info.name, entry.monotonicMeta); - } - entry.offset = meta.readLong(); - entry.count = meta.readVLong(); - switch(entry.format) { - case CONST_COMPRESSED: - entry.minValue = meta.readLong(); - if (entry.count > Integer.MAX_VALUE) { - // currently just a limitation e.g. of bits interface and so on. - throw new CorruptIndexException("illegal CONST_COMPRESSED count: " + entry.count, meta); - } - break; - case GCD_COMPRESSED: - entry.minValue = meta.readLong(); - entry.gcd = meta.readLong(); - entry.bitsPerValue = meta.readVInt(); - break; - case TABLE_COMPRESSED: - final int uniqueValues = meta.readVInt(); - if (uniqueValues > 256) { - throw new CorruptIndexException("TABLE_COMPRESSED cannot have more than 256 distinct values, got=" + uniqueValues, meta); - } - entry.table = new long[uniqueValues]; - for (int i = 0; i < uniqueValues; ++i) { - entry.table[i] = meta.readLong(); - } - ramBytesUsed.addAndGet(RamUsageEstimator.sizeOf(entry.table)); - entry.bitsPerValue = meta.readVInt(); - break; - case DELTA_COMPRESSED: - entry.minValue = meta.readLong(); - entry.bitsPerValue = meta.readVInt(); - break; - case MONOTONIC_COMPRESSED: - final int blockShift = meta.readVInt(); - entry.monotonicMeta = DirectMonotonicReader.loadMeta(meta, maxDoc + 1, blockShift); - ramBytesUsed.addAndGet(entry.monotonicMeta.ramBytesUsed()); - directAddressesMeta.put(info.name, entry.monotonicMeta); - break; - case SPARSE_COMPRESSED: - final byte numberType = meta.readByte(); - switch (numberType) { - case 0: - entry.numberType = NumberType.VALUE; - break; - case 1: - entry.numberType = NumberType.ORDINAL; - break; - default: - throw new CorruptIndexException("Number type can only be 0 or 1, got=" + numberType, meta); - } - - // now read the numeric entry for non-missing values - final int fieldNumber = meta.readVInt(); - if (fieldNumber != info.number) { - throw new CorruptIndexException("Field numbers mistmatch: " + fieldNumber + " != " + info.number, meta); - } - final int dvFormat = meta.readByte(); - if (dvFormat != NUMERIC) { - throw new CorruptIndexException("Formats mistmatch: " + dvFormat + " != " + NUMERIC, meta); - } - entry.nonMissingValues = readNumericEntry(info, meta); - break; - default: - throw new CorruptIndexException("Unknown format: " + entry.format + ", input=", meta); - } - entry.endOffset = meta.readLong(); - return entry; - } - - private BinaryEntry readBinaryEntry(FieldInfo info, IndexInput meta) throws IOException { - BinaryEntry entry = new BinaryEntry(); - entry.format = meta.readVInt(); - entry.missingOffset = meta.readLong(); - entry.minLength = meta.readVInt(); - entry.maxLength = meta.readVInt(); - entry.count = meta.readVLong(); - entry.offset = meta.readLong(); - switch(entry.format) { - case BINARY_FIXED_UNCOMPRESSED: - break; - case BINARY_PREFIX_COMPRESSED: - entry.addressesOffset = meta.readLong(); - entry.packedIntsVersion = meta.readVInt(); - entry.blockSize = meta.readVInt(); - entry.reverseIndexOffset = meta.readLong(); - break; - case BINARY_VARIABLE_UNCOMPRESSED: - entry.addressesOffset = meta.readLong(); - final int blockShift = meta.readVInt(); - entry.addressesMeta = DirectMonotonicReader.loadMeta(meta, entry.count + 1, blockShift); - ramBytesUsed.addAndGet(entry.addressesMeta.ramBytesUsed()); - directAddressesMeta.put(info.name, entry.addressesMeta); - entry.addressesEndOffset = meta.readLong(); - break; - default: - throw new CorruptIndexException("Unknown format: " + entry.format, meta); - } - return entry; - } - - SortedSetEntry readSortedSetEntry(IndexInput meta) throws IOException { - SortedSetEntry entry = new SortedSetEntry(); - entry.format = meta.readVInt(); - if (entry.format == SORTED_SET_TABLE) { - final int totalTableLength = meta.readInt(); - if (totalTableLength > 256) { - throw new CorruptIndexException("SORTED_SET_TABLE cannot have more than 256 values in its dictionary, got=" + totalTableLength, meta); - } - entry.table = new long[totalTableLength]; - for (int i = 0; i < totalTableLength; ++i) { - entry.table[i] = meta.readLong(); - } - ramBytesUsed.addAndGet(RamUsageEstimator.sizeOf(entry.table)); - final int tableSize = meta.readInt(); - if (tableSize > totalTableLength + 1) { // +1 because of the empty set - throw new CorruptIndexException("SORTED_SET_TABLE cannot have more set ids than ords in its dictionary, got " + totalTableLength + " ords and " + tableSize + " sets", meta); - } - entry.tableOffsets = new int[tableSize + 1]; - for (int i = 1; i < entry.tableOffsets.length; ++i) { - entry.tableOffsets[i] = entry.tableOffsets[i - 1] + meta.readInt(); - } - ramBytesUsed.addAndGet(RamUsageEstimator.sizeOf(entry.tableOffsets)); - } else if (entry.format != SORTED_SINGLE_VALUED && entry.format != SORTED_WITH_ADDRESSES) { - throw new CorruptIndexException("Unknown format: " + entry.format, meta); - } - return entry; - } - - @Override - public NumericDocValues getNumeric(FieldInfo field) throws IOException { - NumericEntry entry = numerics.get(field.name); - Bits docsWithField; - - if (entry.format == SPARSE_COMPRESSED) { - return getSparseNumericDocValues(entry); - } else { - if (entry.missingOffset == ALL_MISSING) { - return DocValues.emptyNumeric(); - } else if (entry.missingOffset == ALL_LIVE) { - LongValues values = getNumeric(entry); - return new NumericDocValues() { - private int docID = -1; - - @Override - public int docID() { - return docID; - } - - @Override - public int nextDoc() { - docID++; - if (docID == maxDoc) { - docID = NO_MORE_DOCS; - } - return docID; - } - - @Override - public int advance(int target) { - if (target >= maxDoc) { - docID = NO_MORE_DOCS; - } else { - docID = target; - } - return docID; - } - - @Override - public boolean advanceExact(int target) throws IOException { - docID = target; - return true; - } - - @Override - public long cost() { - // TODO - return 0; - } - - @Override - public long longValue() { - return values.get(docID); - } - }; - } else { - docsWithField = getLiveBits(entry.missingOffset, maxDoc); - } - } - final LongValues values = getNumeric(entry); - return new NumericDocValues() { - - int doc = -1; - long value; - - @Override - public long longValue() throws IOException { - return value; - } - - @Override - public int docID() { - return doc; - } - - @Override - public int nextDoc() throws IOException { - return advance(doc + 1); - } - - @Override - public int advance(int target) throws IOException { - for (int doc = target; doc < maxDoc; ++doc) { - value = values.get(doc); - if (value != 0 || docsWithField.get(doc)) { - return this.doc = doc; - } - } - return doc = NO_MORE_DOCS; - } - - @Override - public boolean advanceExact(int target) throws IOException { - doc = target; - value = values.get(doc); - return value != 0 || docsWithField.get(doc); - } - - @Override - public long cost() { - return maxDoc; - } - - }; - } - - @Override - public long ramBytesUsed() { - return ramBytesUsed.get(); - } - - @Override - public synchronized Collection getChildResources() { - List resources = new ArrayList<>(); - resources.addAll(Accountables.namedAccountables("addresses field", addressInstances)); - resources.addAll(Accountables.namedAccountables("reverse index field", reverseIndexInstances)); - resources.addAll(Accountables.namedAccountables("direct addresses meta field", directAddressesMeta)); - return Collections.unmodifiableList(resources); - } - - @Override - public void checkIntegrity() throws IOException { - CodecUtil.checksumEntireFile(data); - } - - @Override - public String toString() { - return getClass().getSimpleName() + "(fields=" + numFields + ")"; - } - - LongValues getNumeric(NumericEntry entry) throws IOException { - switch (entry.format) { - case CONST_COMPRESSED: { - final long constant = entry.minValue; - final Bits live = getLiveBits(entry.missingOffset, (int)entry.count); - return new LongValues() { - @Override - public long get(long index) { - return live.get((int)index) ? constant : 0; - } - }; - } - case DELTA_COMPRESSED: { - RandomAccessInput slice = this.data.randomAccessSlice(entry.offset, entry.endOffset - entry.offset); - final long delta = entry.minValue; - final LongValues values = DirectReader.getInstance(slice, entry.bitsPerValue, 0); - return new LongValues() { - @Override - public long get(long id) { - return delta + values.get(id); - } - }; - } - case GCD_COMPRESSED: { - RandomAccessInput slice = this.data.randomAccessSlice(entry.offset, entry.endOffset - entry.offset); - final long min = entry.minValue; - final long mult = entry.gcd; - final LongValues quotientReader = DirectReader.getInstance(slice, entry.bitsPerValue, 0); - return new LongValues() { - @Override - public long get(long id) { - return min + mult * quotientReader.get(id); - } - }; - } - case TABLE_COMPRESSED: { - RandomAccessInput slice = this.data.randomAccessSlice(entry.offset, entry.endOffset - entry.offset); - final long table[] = entry.table; - final LongValues ords = DirectReader.getInstance(slice, entry.bitsPerValue, 0); - return new LongValues() { - @Override - public long get(long id) { - return table[(int) ords.get(id)]; - } - }; - } - case SPARSE_COMPRESSED: - final SparseNumericDocValues values = getSparseNumericDocValues(entry); - final long missingValue; - switch (entry.numberType) { - case ORDINAL: - missingValue = -1L; - break; - case VALUE: - missingValue = 0L; - break; - default: - throw new AssertionError(); - } - return new SparseNumericDocValuesRandomAccessWrapper(values, missingValue); - default: - throw new AssertionError(); - } - } - - static final class SparseNumericDocValues extends NumericDocValues { - - final int docIDsLength; - final LongValues docIds, values; - - int index, doc; - - SparseNumericDocValues(int docIDsLength, LongValues docIDs, LongValues values) { - this.docIDsLength = docIDsLength; - this.docIds = docIDs; - this.values = values; - reset(); - } - - void reset() { - index = -1; - doc = -1; - } - - @Override - public int docID() { - return doc; - } - - @Override - public int nextDoc() throws IOException { - if (index >= docIDsLength - 1) { - index = docIDsLength; - return doc = NO_MORE_DOCS; - } - return doc = (int) docIds.get(++index); - } - - @Override - public int advance(int target) throws IOException { - long loIndex = index; - long step = 1; - long hiIndex; - int hiDoc; - - // gallop forward by exponentially growing the interval - // in order to find an interval so that the target doc - // is in ]lo, hi]. Compared to a regular binary search, - // this optimizes the case that the caller performs many - // advance calls by small deltas - do { - hiIndex = index + step; - if (hiIndex >= docIDsLength) { - hiIndex = docIDsLength; - hiDoc = NO_MORE_DOCS; - break; - } - hiDoc = (int) docIds.get(hiIndex); - if (hiDoc >= target) { - break; - } - step <<= 1; - } while (true); - - // now binary search - while (loIndex + 1 < hiIndex) { - final long midIndex = (loIndex + 1 + hiIndex) >>> 1; - final int midDoc = (int) docIds.get(midIndex); - if (midDoc >= target) { - hiIndex = midIndex; - hiDoc = midDoc; - } else { - loIndex = midIndex; - } - } - - index = (int) hiIndex; - return doc = hiDoc; - } - - @Override - public boolean advanceExact(int target) throws IOException { - if (advance(target) == target) { - return true; - } - --index; - doc = target; - return index >= 0 && docIds.get(index) == target; - } - - @Override - public long longValue() { - assert index >= 0; - assert index < docIDsLength; - return values.get(index); - } - - @Override - public long cost() { - return docIDsLength; - } - } - - static class SparseNumericDocValuesRandomAccessWrapper extends LongValues { - - final SparseNumericDocValues values; - final long missingValue; - - SparseNumericDocValuesRandomAccessWrapper(SparseNumericDocValues values, long missingValue) { - this.values = values; - this.missingValue = missingValue; - } - - @Override - public long get(long longIndex) { - final int index = Math.toIntExact(longIndex); - int doc = values.docID(); - if (doc >= index) { - values.reset(); - } - assert values.docID() < index; - try { - doc = values.advance(index); - } catch (IOException e) { - throw new RuntimeException(e); - } - if (doc == index) { - return values.longValue(); - } else { - return missingValue; - } - } - - } - - LegacyBinaryDocValues getLegacyBinary(FieldInfo field) throws IOException { - BinaryEntry bytes = binaries.get(field.name); - switch(bytes.format) { - case BINARY_FIXED_UNCOMPRESSED: - return getFixedBinary(field, bytes); - case BINARY_VARIABLE_UNCOMPRESSED: - return getVariableBinary(field, bytes); - case BINARY_PREFIX_COMPRESSED: - return getCompressedBinary(field, bytes); - default: - throw new AssertionError(); - } - } - - @Override - public BinaryDocValues getBinary(FieldInfo field) throws IOException { - BinaryEntry be = binaries.get(field.name); - return new LegacyBinaryDocValuesWrapper(getLiveBits(be.missingOffset, maxDoc), getLegacyBinary(field)); - } - - private LegacyBinaryDocValues getFixedBinary(FieldInfo field, final BinaryEntry bytes) throws IOException { - final IndexInput data = this.data.slice("fixed-binary", bytes.offset, bytes.count * bytes.maxLength); - - final BytesRef term = new BytesRef(bytes.maxLength); - final byte[] buffer = term.bytes; - final int length = term.length = bytes.maxLength; - - return new LongBinaryDocValues() { - @Override - public BytesRef get(long id) { - try { - data.seek(id * length); - data.readBytes(buffer, 0, buffer.length); - return term; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }; - } - - private LegacyBinaryDocValues getVariableBinary(FieldInfo field, final BinaryEntry bytes) throws IOException { - final RandomAccessInput addressesData = this.data.randomAccessSlice(bytes.addressesOffset, bytes.addressesEndOffset - bytes.addressesOffset); - final LongValues addresses = DirectMonotonicReader.getInstance(bytes.addressesMeta, addressesData); - - final IndexInput data = this.data.slice("var-binary", bytes.offset, bytes.addressesOffset - bytes.offset); - final BytesRef term = new BytesRef(Math.max(0, bytes.maxLength)); - final byte buffer[] = term.bytes; - - return new LongBinaryDocValues() { - @Override - public BytesRef get(long id) { - long startAddress = addresses.get(id); - long endAddress = addresses.get(id+1); - int length = (int) (endAddress - startAddress); - try { - data.seek(startAddress); - data.readBytes(buffer, 0, length); - term.length = length; - return term; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }; - } - - /** returns an address instance for prefix-compressed binary values. */ - private synchronized MonotonicBlockPackedReader getIntervalInstance(FieldInfo field, BinaryEntry bytes) throws IOException { - MonotonicBlockPackedReader addresses = addressInstances.get(field.name); - if (addresses == null) { - data.seek(bytes.addressesOffset); - final long size = (bytes.count + INTERVAL_MASK) >>> INTERVAL_SHIFT; - addresses = MonotonicBlockPackedReader.of(data, bytes.packedIntsVersion, bytes.blockSize, size, false); - if (!merging) { - addressInstances.put(field.name, addresses); - ramBytesUsed.addAndGet(addresses.ramBytesUsed() + Integer.BYTES); - } - } - return addresses; - } - - /** returns a reverse lookup instance for prefix-compressed binary values. */ - private synchronized ReverseTermsIndex getReverseIndexInstance(FieldInfo field, BinaryEntry bytes) throws IOException { - ReverseTermsIndex index = reverseIndexInstances.get(field.name); - if (index == null) { - index = new ReverseTermsIndex(); - data.seek(bytes.reverseIndexOffset); - long size = (bytes.count + REVERSE_INTERVAL_MASK) >>> REVERSE_INTERVAL_SHIFT; - index.termAddresses = MonotonicBlockPackedReader.of(data, bytes.packedIntsVersion, bytes.blockSize, size, false); - long dataSize = data.readVLong(); - PagedBytes pagedBytes = new PagedBytes(15); - pagedBytes.copy(data, dataSize); - index.terms = pagedBytes.freeze(true); - if (!merging) { - reverseIndexInstances.put(field.name, index); - ramBytesUsed.addAndGet(index.ramBytesUsed()); - } - } - return index; - } - - private LegacyBinaryDocValues getCompressedBinary(FieldInfo field, final BinaryEntry bytes) throws IOException { - final MonotonicBlockPackedReader addresses = getIntervalInstance(field, bytes); - final ReverseTermsIndex index = getReverseIndexInstance(field, bytes); - assert addresses.size() > 0; // we don't have to handle empty case - IndexInput slice = data.slice("terms", bytes.offset, bytes.addressesOffset - bytes.offset); - return new CompressedBinaryDocValues(bytes, addresses, index, slice); - } - - @Override - public SortedDocValues getSorted(FieldInfo field) throws IOException { - final int valueCount = (int) binaries.get(field.name).count; - final LegacyBinaryDocValues binary = getLegacyBinary(field); - NumericEntry entry = ords.get(field.name); - final LongValues ordinals = getNumeric(entry); - if (entry.format == SPARSE_COMPRESSED) { - final SparseNumericDocValues sparseValues = ((SparseNumericDocValuesRandomAccessWrapper) ordinals).values; - return new SortedDocValues() { - - @Override - public int ordValue() { - return (int) sparseValues.longValue(); - } - - @Override - public BytesRef lookupOrd(int ord) { - return binary.get(ord); - } - - @Override - public int getValueCount() { - return valueCount; - } - - @Override - public int docID() { - return sparseValues.docID(); - } - - @Override - public int nextDoc() throws IOException { - return sparseValues.nextDoc(); - } - - @Override - public int advance(int target) throws IOException { - return sparseValues.advance(target); - } - - @Override - public boolean advanceExact(int target) throws IOException { - return sparseValues.advanceExact(target); - } - - @Override - public long cost() { - return sparseValues.cost(); - } - - }; - } - return new SortedDocValues() { - private int docID = -1; - private int ord; - - @Override - public int docID() { - return docID; - } - - @Override - public int nextDoc() throws IOException { - assert docID != NO_MORE_DOCS; - while (true) { - docID++; - if (docID == maxDoc) { - docID = NO_MORE_DOCS; - break; - } - ord = (int) ordinals.get(docID); - if (ord != -1) { - break; - } - } - return docID; - } - - @Override - public int advance(int target) throws IOException { - if (target >= maxDoc) { - docID = NO_MORE_DOCS; - return docID; - } else { - docID = target-1; - return nextDoc(); - } - } - - @Override - public boolean advanceExact(int target) throws IOException { - docID = target; - ord = (int) ordinals.get(target); - return ord != -1; - } - - @Override - public int ordValue() { - return ord; - } - - @Override - public long cost() { - // TODO - return 0; - } - - @Override - public BytesRef lookupOrd(int ord) { - return binary.get(ord); - } - - @Override - public int getValueCount() { - return valueCount; - } - - @Override - public int lookupTerm(BytesRef key) throws IOException { - if (binary instanceof CompressedBinaryDocValues) { - return (int) ((CompressedBinaryDocValues)binary).lookupTerm(key); - } else { - return super.lookupTerm(key); - } - } - - @Override - public TermsEnum termsEnum() throws IOException { - if (binary instanceof CompressedBinaryDocValues) { - return ((CompressedBinaryDocValues)binary).getTermsEnum(); - } else { - return super.termsEnum(); - } - } - }; - } - - /** returns an address instance for sortedset ordinal lists */ - private LongValues getOrdIndexInstance(FieldInfo field, NumericEntry entry) throws IOException { - RandomAccessInput data = this.data.randomAccessSlice(entry.offset, entry.endOffset - entry.offset); - return DirectMonotonicReader.getInstance(entry.monotonicMeta, data); - } - - @Override - public SortedNumericDocValues getSortedNumeric(FieldInfo field) throws IOException { - SortedSetEntry ss = sortedNumerics.get(field.name); - if (ss.format == SORTED_SINGLE_VALUED) { - NumericEntry numericEntry = numerics.get(field.name); - final LongValues values = getNumeric(numericEntry); - if (numericEntry.format == SPARSE_COMPRESSED) { - SparseNumericDocValues sparseValues = ((SparseNumericDocValuesRandomAccessWrapper) values).values; - return new SortedNumericDocValues() { - - @Override - public long nextValue() throws IOException { - return sparseValues.longValue(); - } - - @Override - public int docValueCount() { - return 1; - } - - @Override - public int docID() { - return sparseValues.docID(); - } - - @Override - public int nextDoc() throws IOException { - return sparseValues.nextDoc(); - } - - @Override - public int advance(int target) throws IOException { - return sparseValues.advance(target); - } - - @Override - public boolean advanceExact(int target) throws IOException { - return sparseValues.advanceExact(target); - } - - @Override - public long cost() { - return sparseValues.cost(); - } - - }; - } - final Bits docsWithField = getLiveBits(numericEntry.missingOffset, maxDoc); - return new SortedNumericDocValues() { - int docID = -1; - - @Override - public int docID() { - return docID; - } - - @Override - public int nextDoc() { - while (true) { - docID++; - if (docID == maxDoc) { - docID = NO_MORE_DOCS; - break; - } - - if (docsWithField.get(docID)) { - // TODO: use .nextSetBit here, at least!! - break; - } - } - return docID; - } - - @Override - public int advance(int target) { - if (target >= maxDoc) { - docID = NO_MORE_DOCS; - return docID; - } else { - docID = target-1; - return nextDoc(); - } - } - - @Override - public boolean advanceExact(int target) throws IOException { - docID = target; - return docsWithField.get(docID); - } - - @Override - public long cost() { - // TODO - return 0; - } - - @Override - public int docValueCount() { - return 1; - } - - @Override - public long nextValue() { - return values.get(docID); - } - }; - } else if (ss.format == SORTED_WITH_ADDRESSES) { - NumericEntry numericEntry = numerics.get(field.name); - final LongValues values = getNumeric(numericEntry); - final LongValues ordIndex = getOrdIndexInstance(field, ordIndexes.get(field.name)); - - return new SortedNumericDocValues() { - long startOffset; - long endOffset; - int docID = -1; - long upto; - - @Override - public int docID() { - return docID; - } - - @Override - public int nextDoc() { - while (true) { - docID++; - if (docID == maxDoc) { - docID = NO_MORE_DOCS; - return docID; - } - startOffset = ordIndex.get(docID); - endOffset = ordIndex.get(docID+1L); - if (endOffset > startOffset) { - break; - } - } - upto = startOffset; - return docID; - } - - @Override - public int advance(int target) { - if (target >= maxDoc) { - docID = NO_MORE_DOCS; - return docID; - } else { - docID = target-1; - return nextDoc(); - } - } - - @Override - public boolean advanceExact(int target) throws IOException { - docID = target; - startOffset = ordIndex.get(docID); - endOffset = ordIndex.get(docID+1L); - return endOffset > startOffset; - } - - @Override - public long cost() { - // TODO - return 0; - } - - @Override - public int docValueCount() { - return (int) (endOffset - startOffset); - } - - @Override - public long nextValue() { - return values.get(upto++); - } - }; - } else if (ss.format == SORTED_SET_TABLE) { - NumericEntry entry = ords.get(field.name); - final LongValues ordinals = getNumeric(entry); - - final long[] table = ss.table; - final int[] offsets = ss.tableOffsets; - return new SortedNumericDocValues() { - int startOffset; - int endOffset; - int docID = -1; - int upto; - - @Override - public int docID() { - return docID; - } - - @Override - public int nextDoc() { - while (true) { - docID++; - if (docID == maxDoc) { - docID = NO_MORE_DOCS; - return docID; - } - int ord = (int) ordinals.get(docID); - startOffset = offsets[ord]; - endOffset = offsets[ord+1]; - if (endOffset > startOffset) { - break; - } - } - upto = startOffset; - return docID; - } - - @Override - public int advance(int target) { - if (target >= maxDoc) { - docID = NO_MORE_DOCS; - return docID; - } else { - docID = target-1; - return nextDoc(); - } - } - - @Override - public boolean advanceExact(int target) throws IOException { - docID = target; - int ord = (int) ordinals.get(docID); - startOffset = offsets[ord]; - endOffset = offsets[ord+1]; - return endOffset > startOffset; - } - - @Override - public long cost() { - // TODO - return 0; - } - - @Override - public int docValueCount() { - return endOffset - startOffset; - } - - @Override - public long nextValue() { - return table[upto++]; - } - }; - } else { - throw new AssertionError(); - } - } - - @Override - public SortedSetDocValues getSortedSet(FieldInfo field) throws IOException { - SortedSetEntry ss = sortedSets.get(field.name); - switch (ss.format) { - case SORTED_SINGLE_VALUED: - return DocValues.singleton(getSorted(field)); - case SORTED_WITH_ADDRESSES: - return getSortedSetWithAddresses(field); - case SORTED_SET_TABLE: - return getSortedSetTable(field, ss); - default: - throw new AssertionError(); - } - } - - private SortedSetDocValues getSortedSetWithAddresses(FieldInfo field) throws IOException { - final long valueCount = binaries.get(field.name).count; - // we keep the byte[]s and list of ords on disk, these could be large - final LongBinaryDocValues binary = (LongBinaryDocValues) getLegacyBinary(field); - final LongValues ordinals = getNumeric(ords.get(field.name)); - // but the addresses to the ord stream are in RAM - final LongValues ordIndex = getOrdIndexInstance(field, ordIndexes.get(field.name)); - - return new LegacySortedSetDocValuesWrapper(new LegacySortedSetDocValues() { - long startOffset; - long offset; - long endOffset; - - @Override - public long nextOrd() { - if (offset == endOffset) { - return NO_MORE_ORDS; - } else { - long ord = ordinals.get(offset); - offset++; - return ord; - } - } - - @Override - public void setDocument(int docID) { - startOffset = offset = ordIndex.get(docID); - endOffset = ordIndex.get(docID+1L); - } - - @Override - public BytesRef lookupOrd(long ord) { - return binary.get(ord); - } - - @Override - public long getValueCount() { - return valueCount; - } - - @Override - public long lookupTerm(BytesRef key) { - if (binary instanceof CompressedBinaryDocValues) { - return ((CompressedBinaryDocValues)binary).lookupTerm(key); - } else { - return super.lookupTerm(key); - } - } - - @Override - public TermsEnum termsEnum() throws IOException { - if (binary instanceof CompressedBinaryDocValues) { - return ((CompressedBinaryDocValues)binary).getTermsEnum(); - } else { - return super.termsEnum(); - } - } - }, maxDoc); - } - - private SortedSetDocValues getSortedSetTable(FieldInfo field, SortedSetEntry ss) throws IOException { - final long valueCount = binaries.get(field.name).count; - final LongBinaryDocValues binary = (LongBinaryDocValues) getLegacyBinary(field); - final NumericEntry ordinalsEntry = ords.get(field.name); - final LongValues ordinals = getNumeric(ordinalsEntry); - - final long[] table = ss.table; - final int[] offsets = ss.tableOffsets; - - return new LegacySortedSetDocValuesWrapper(new LegacySortedSetDocValues() { - - int offset, startOffset, endOffset; - - @Override - public void setDocument(int docID) { - final int ord = (int) ordinals.get(docID); - offset = startOffset = offsets[ord]; - endOffset = offsets[ord + 1]; - } - - @Override - public long nextOrd() { - if (offset == endOffset) { - return NO_MORE_ORDS; - } else { - return table[offset++]; - } - } - - @Override - public BytesRef lookupOrd(long ord) { - return binary.get(ord); - } - - @Override - public long getValueCount() { - return valueCount; - } - - @Override - public long lookupTerm(BytesRef key) { - if (binary instanceof CompressedBinaryDocValues) { - return ((CompressedBinaryDocValues) binary).lookupTerm(key); - } else { - return super.lookupTerm(key); - } - } - - @Override - public TermsEnum termsEnum() throws IOException { - if (binary instanceof CompressedBinaryDocValues) { - return ((CompressedBinaryDocValues) binary).getTermsEnum(); - } else { - return super.termsEnum(); - } - } - }, maxDoc); - } - - private Bits getLiveBits(final long offset, final int count) throws IOException { - if (offset == ALL_MISSING) { - return new Bits.MatchNoBits(count); - } else if (offset == ALL_LIVE) { - return new Bits.MatchAllBits(count); - } else { - int length = (int) ((count + 7L) >>> 3); - final RandomAccessInput in = data.randomAccessSlice(offset, length); - return new Bits() { - @Override - public boolean get(int index) { - try { - return (in.readByte(index >> 3) & (1 << (index & 7))) != 0; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public int length() { - return count; - } - }; - } - } - - private SparseNumericDocValues getSparseNumericDocValues(NumericEntry entry) throws IOException { - final RandomAccessInput docIdsData = this.data.randomAccessSlice(entry.missingOffset, entry.offset - entry.missingOffset); - final LongValues docIDs = DirectMonotonicReader.getInstance(entry.monotonicMeta, docIdsData); - final LongValues values = getNumeric(entry.nonMissingValues); // cannot be sparse - return new SparseNumericDocValues(Math.toIntExact(entry.numDocsWithValue), docIDs, values); - } - - @Override - public synchronized DocValuesProducer getMergeInstance() throws IOException { - return new Lucene54DocValuesProducer(this); - } - - @Override - public void close() throws IOException { - data.close(); - } - - /** metadata entry for a numeric docvalues field */ - static class NumericEntry { - private NumericEntry() {} - /** offset to the bitset representing docsWithField, or -1 if no documents have missing values */ - long missingOffset; - /** offset to the actual numeric values */ - public long offset; - /** end offset to the actual numeric values */ - public long endOffset; - /** bits per value used to pack the numeric values */ - public int bitsPerValue; - - int format; - /** count of values written */ - public long count; - - /** monotonic meta */ - public DirectMonotonicReader.Meta monotonicMeta; - - long minValue; - long gcd; - long table[]; - - /** for sparse compression */ - long numDocsWithValue; - NumericEntry nonMissingValues; - NumberType numberType; - - } - - /** metadata entry for a binary docvalues field */ - static class BinaryEntry { - private BinaryEntry() {} - /** offset to the bitset representing docsWithField, or -1 if no documents have missing values */ - long missingOffset; - /** offset to the actual binary values */ - long offset; - - int format; - /** count of values written */ - public long count; - int minLength; - int maxLength; - /** offset to the addressing data that maps a value to its slice of the byte[] */ - public long addressesOffset, addressesEndOffset; - /** meta data for addresses */ - public DirectMonotonicReader.Meta addressesMeta; - /** offset to the reverse index */ - public long reverseIndexOffset; - /** packed ints version used to encode addressing information */ - public int packedIntsVersion; - /** packed ints blocksize */ - public int blockSize; - } - - /** metadata entry for a sorted-set docvalues field */ - static class SortedSetEntry { - private SortedSetEntry() {} - int format; - - long[] table; - int[] tableOffsets; - } - - // internally we compose complex dv (sorted/sortedset) from other ones - static abstract class LongBinaryDocValues extends LegacyBinaryDocValues { - @Override - public final BytesRef get(int docID) { - return get((long)docID); - } - - abstract BytesRef get(long id); - } - - // used for reverse lookup to a small range of blocks - static class ReverseTermsIndex implements Accountable { - public MonotonicBlockPackedReader termAddresses; - public PagedBytes.Reader terms; - - @Override - public long ramBytesUsed() { - return termAddresses.ramBytesUsed() + terms.ramBytesUsed(); - } - - @Override - public Collection getChildResources() { - List resources = new ArrayList<>(); - resources.add(Accountables.namedAccountable("term bytes", terms)); - resources.add(Accountables.namedAccountable("term addresses", termAddresses)); - return Collections.unmodifiableList(resources); - } - - @Override - public String toString() { - return getClass().getSimpleName() + "(size=" + termAddresses.size() + ")"; - } - } - - //in the compressed case, we add a few additional operations for - //more efficient reverse lookup and enumeration - static final class CompressedBinaryDocValues extends LongBinaryDocValues { - final long numValues; - final long numIndexValues; - final int maxTermLength; - final MonotonicBlockPackedReader addresses; - final IndexInput data; - final CompressedBinaryTermsEnum termsEnum; - final PagedBytes.Reader reverseTerms; - final MonotonicBlockPackedReader reverseAddresses; - final long numReverseIndexValues; - - public CompressedBinaryDocValues(BinaryEntry bytes, MonotonicBlockPackedReader addresses, ReverseTermsIndex index, IndexInput data) throws IOException { - this.maxTermLength = bytes.maxLength; - this.numValues = bytes.count; - this.addresses = addresses; - this.numIndexValues = addresses.size(); - this.data = data; - this.reverseTerms = index.terms; - this.reverseAddresses = index.termAddresses; - this.numReverseIndexValues = reverseAddresses.size(); - this.termsEnum = getTermsEnum(data); - } - - @Override - public BytesRef get(long id) { - try { - termsEnum.seekExact(id); - return termsEnum.term(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - long lookupTerm(BytesRef key) { - try { - switch (termsEnum.seekCeil(key)) { - case FOUND: return termsEnum.ord(); - case NOT_FOUND: return -termsEnum.ord()-1; - default: return -numValues-1; - } - } catch (IOException bogus) { - throw new RuntimeException(bogus); - } - } - - TermsEnum getTermsEnum() throws IOException { - return getTermsEnum(data.clone()); - } - - private CompressedBinaryTermsEnum getTermsEnum(IndexInput input) throws IOException { - return new CompressedBinaryTermsEnum(input); - } - - class CompressedBinaryTermsEnum extends TermsEnum { - private long currentOrd = -1; - // offset to the start of the current block - private long currentBlockStart; - private final IndexInput input; - // delta from currentBlockStart to start of each term - private final int offsets[] = new int[INTERVAL_COUNT]; - private final byte buffer[] = new byte[2*INTERVAL_COUNT-1]; - - private final BytesRef term = new BytesRef(maxTermLength); - private final BytesRef firstTerm = new BytesRef(maxTermLength); - private final BytesRef scratch = new BytesRef(); - - CompressedBinaryTermsEnum(IndexInput input) throws IOException { - this.input = input; - input.seek(0); - } - - private void readHeader() throws IOException { - firstTerm.length = input.readVInt(); - input.readBytes(firstTerm.bytes, 0, firstTerm.length); - input.readBytes(buffer, 0, INTERVAL_COUNT-1); - if (buffer[0] == -1) { - readShortAddresses(); - } else { - readByteAddresses(); - } - currentBlockStart = input.getFilePointer(); - } - - // read single byte addresses: each is delta - 2 - // (shared prefix byte and length > 0 are both implicit) - private void readByteAddresses() throws IOException { - int addr = 0; - for (int i = 1; i < offsets.length; i++) { - addr += 2 + (buffer[i-1] & 0xFF); - offsets[i] = addr; - } - } - - // read double byte addresses: each is delta - 2 - // (shared prefix byte and length > 0 are both implicit) - private void readShortAddresses() throws IOException { - input.readBytes(buffer, INTERVAL_COUNT-1, INTERVAL_COUNT); - int addr = 0; - for (int i = 1; i < offsets.length; i++) { - int x = i<<1; - addr += 2 + ((buffer[x-1] << 8) | (buffer[x] & 0xFF)); - offsets[i] = addr; - } - } - - // set term to the first term - private void readFirstTerm() throws IOException { - term.length = firstTerm.length; - System.arraycopy(firstTerm.bytes, firstTerm.offset, term.bytes, 0, term.length); - } - - // read term at offset, delta encoded from first term - private void readTerm(int offset) throws IOException { - int start = input.readByte() & 0xFF; - System.arraycopy(firstTerm.bytes, firstTerm.offset, term.bytes, 0, start); - int suffix = offsets[offset] - offsets[offset-1] - 1; - input.readBytes(term.bytes, start, suffix); - term.length = start + suffix; - } - - @Override - public BytesRef next() throws IOException { - currentOrd++; - if (currentOrd >= numValues) { - return null; - } else { - int offset = (int) (currentOrd & INTERVAL_MASK); - if (offset == 0) { - // switch to next block - readHeader(); - readFirstTerm(); - } else { - readTerm(offset); - } - return term; - } - } - - // binary search reverse index to find smaller - // range of blocks to search - long binarySearchIndex(BytesRef text) throws IOException { - long low = 0; - long high = numReverseIndexValues - 1; - while (low <= high) { - long mid = (low + high) >>> 1; - reverseTerms.fill(scratch, reverseAddresses.get(mid)); - int cmp = scratch.compareTo(text); - - if (cmp < 0) { - low = mid + 1; - } else if (cmp > 0) { - high = mid - 1; - } else { - return mid; - } - } - return high; - } - - // binary search against first term in block range - // to find term's block - long binarySearchBlock(BytesRef text, long low, long high) throws IOException { - while (low <= high) { - long mid = (low + high) >>> 1; - input.seek(addresses.get(mid)); - term.length = input.readVInt(); - input.readBytes(term.bytes, 0, term.length); - int cmp = term.compareTo(text); - - if (cmp < 0) { - low = mid + 1; - } else if (cmp > 0) { - high = mid - 1; - } else { - return mid; - } - } - return high; - } - - @Override - public SeekStatus seekCeil(BytesRef text) throws IOException { - // locate block: narrow to block range with index, then search blocks - final long block; - long indexPos = binarySearchIndex(text); - if (indexPos < 0) { - block = 0; - } else { - long low = indexPos << BLOCK_INTERVAL_SHIFT; - long high = Math.min(numIndexValues - 1, low + BLOCK_INTERVAL_MASK); - block = Math.max(low, binarySearchBlock(text, low, high)); - } - - // position before block, then scan to term. - input.seek(addresses.get(block)); - currentOrd = (block << INTERVAL_SHIFT) - 1; - - while (next() != null) { - int cmp = term.compareTo(text); - if (cmp == 0) { - return SeekStatus.FOUND; - } else if (cmp > 0) { - return SeekStatus.NOT_FOUND; - } - } - return SeekStatus.END; - } - - @Override - public void seekExact(long ord) throws IOException { - long block = ord >>> INTERVAL_SHIFT; - if (block != currentOrd >>> INTERVAL_SHIFT) { - // switch to different block - input.seek(addresses.get(block)); - readHeader(); - } - - currentOrd = ord; - - int offset = (int) (ord & INTERVAL_MASK); - if (offset == 0) { - readFirstTerm(); - } else { - input.seek(currentBlockStart + offsets[offset-1]); - readTerm(offset); - } - } - - @Override - public BytesRef term() throws IOException { - return term; - } - - @Override - public long ord() throws IOException { - return currentOrd; - } - - @Override - public int docFreq() throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - public long totalTermFreq() throws IOException { - return -1; - } - - @Override - public PostingsEnum postings(PostingsEnum reuse, int flags) throws IOException { - throw new UnsupportedOperationException(); - } - - } - } -} diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/package-info.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/package-info.java deleted file mode 100644 index 2c192227b424..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/package-info.java +++ /dev/null @@ -1,403 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Lucene 5.4 file format. - * - *

Apache Lucene - Index File Formats

- * - * - *

Introduction

- *
- *

This document defines the index file formats used in this version of Lucene. - * If you are using a different version of Lucene, please consult the copy of - * docs/ that was distributed with - * the version you are using.

- *

Apache Lucene is written in Java, but several efforts are underway to write - * versions of - * Lucene in other programming languages. If these versions are to remain - * compatible with Apache Lucene, then a language-independent definition of the - * Lucene index format is required. This document thus attempts to provide a - * complete and independent definition of the Apache Lucene file formats.

- *

As Lucene evolves, this document should evolve. Versions of Lucene in - * different programming languages should endeavor to agree on file formats, and - * generate new versions of this document.

- *
- * - *

Definitions

- *
- *

The fundamental concepts in Lucene are index, document, field and term.

- *

An index contains a sequence of documents.

- *
    - *
  • A document is a sequence of fields.
  • - *
  • A field is a named sequence of terms.
  • - *
  • A term is a sequence of bytes.
  • - *
- *

The same sequence of bytes in two different fields is considered a different - * term. Thus terms are represented as a pair: the string naming the field, and the - * bytes within the field.

- * - *

Inverted Indexing

- *

The index stores statistics about terms in order to make term-based search - * more efficient. Lucene's index falls into the family of indexes known as an - * inverted index. This is because it can list, for a term, the documents - * that contain it. This is the inverse of the natural relationship, in which - * documents list terms.

- * - *

Types of Fields

- *

In Lucene, fields may be stored, in which case their text is stored - * in the index literally, in a non-inverted manner. Fields that are inverted are - * called indexed. A field may be both stored and indexed.

- *

The text of a field may be tokenized into terms to be indexed, or the - * text of a field may be used literally as a term to be indexed. Most fields are - * tokenized, but sometimes it is useful for certain identifier fields to be - * indexed literally.

- *

See the {@link org.apache.lucene.document.Field Field} - * java docs for more information on Fields.

- * - *

Segments

- *

Lucene indexes may be composed of multiple sub-indexes, or segments. - * Each segment is a fully independent index, which could be searched separately. - * Indexes evolve by:

- *
    - *
  1. Creating new segments for newly added documents.
  2. - *
  3. Merging existing segments.
  4. - *
- *

Searches may involve multiple segments and/or multiple indexes, each index - * potentially composed of a set of segments.

- * - *

Document Numbers

- *

Internally, Lucene refers to documents by an integer document number. - * The first document added to an index is numbered zero, and each subsequent - * document added gets a number one greater than the previous.

- *

Note that a document's number may change, so caution should be taken when - * storing these numbers outside of Lucene. In particular, numbers may change in - * the following situations:

- *
    - *
  • - *

    The numbers stored in each segment are unique only within the segment, and - * must be converted before they can be used in a larger context. The standard - * technique is to allocate each segment a range of values, based on the range of - * numbers used in that segment. To convert a document number from a segment to an - * external value, the segment's base document number is added. To convert - * an external value back to a segment-specific value, the segment is identified - * by the range that the external value is in, and the segment's base value is - * subtracted. For example two five document segments might be combined, so that - * the first segment has a base value of zero, and the second of five. Document - * three from the second segment would have an external value of eight.

    - *
  • - *
  • - *

    When documents are deleted, gaps are created in the numbering. These are - * eventually removed as the index evolves through merging. Deleted documents are - * dropped when segments are merged. A freshly-merged segment thus has no gaps in - * its numbering.

    - *
  • - *
- *
- * - *

Index Structure Overview

- *
- *

Each segment index maintains the following:

- *
    - *
  • - * {@link org.apache.lucene.codecs.lucene62.Lucene62SegmentInfoFormat Segment info}. - * This contains metadata about a segment, such as the number of documents, - * what files it uses, - *
  • - *
  • - * {@link org.apache.lucene.codecs.lucene50.Lucene50FieldInfosFormat Field names}. - * This contains the set of field names used in the index. - *
  • - *
  • - * {@link org.apache.lucene.codecs.lucene50.Lucene50StoredFieldsFormat Stored Field values}. - * This contains, for each document, a list of attribute-value pairs, where the attributes - * are field names. These are used to store auxiliary information about the document, such as - * its title, url, or an identifier to access a database. The set of stored fields are what is - * returned for each hit when searching. This is keyed by document number. - *
  • - *
  • - * {@link org.apache.lucene.codecs.lucene50.Lucene50PostingsFormat Term dictionary}. - * A dictionary containing all of the terms used in all of the - * indexed fields of all of the documents. The dictionary also contains the number - * of documents which contain the term, and pointers to the term's frequency and - * proximity data. - *
  • - *
  • - * {@link org.apache.lucene.codecs.lucene50.Lucene50PostingsFormat Term Frequency data}. - * For each term in the dictionary, the numbers of all the - * documents that contain that term, and the frequency of the term in that - * document, unless frequencies are omitted (IndexOptions.DOCS_ONLY) - *
  • - *
  • - * {@link org.apache.lucene.codecs.lucene50.Lucene50PostingsFormat Term Proximity data}. - * For each term in the dictionary, the positions that the - * term occurs in each document. Note that this will not exist if all fields in - * all documents omit position data. - *
  • - *
  • - * {@link org.apache.lucene.codecs.lucene53.Lucene53NormsFormat Normalization factors}. - * For each field in each document, a value is stored - * that is multiplied into the score for hits on that field. - *
  • - *
  • - * {@link org.apache.lucene.codecs.lucene50.Lucene50TermVectorsFormat Term Vectors}. - * For each field in each document, the term vector (sometimes - * called document vector) may be stored. A term vector consists of term text and - * term frequency. To add Term Vectors to your index see the - * {@link org.apache.lucene.document.Field Field} constructors - *
  • - *
  • - * {@link org.apache.lucene.codecs.lucene54.Lucene54DocValuesFormat Per-document values}. - * Like stored values, these are also keyed by document - * number, but are generally intended to be loaded into main memory for fast - * access. Whereas stored values are generally intended for summary results from - * searches, per-document values are useful for things like scoring factors. - *
  • - *
  • - * {@link org.apache.lucene.codecs.lucene50.Lucene50LiveDocsFormat Live documents}. - * An optional file indicating which documents are live. - *
  • - *
- *

Details on each of these are provided in their linked pages.

- *
- * - *

File Naming

- *
- *

All files belonging to a segment have the same name with varying extensions. - * The extensions correspond to the different file formats described below. When - * using the Compound File format (default in 1.4 and greater) these files (except - * for the Segment info file, the Lock file, and Deleted documents file) are collapsed - * into a single .cfs file (see below for details)

- *

Typically, all segments in an index are stored in a single directory, - * although this is not required.

- *

As of version 2.1 (lock-less commits), file names are never re-used. - * That is, when any file is saved - * to the Directory it is given a never before used filename. This is achieved - * using a simple generations approach. For example, the first segments file is - * segments_1, then segments_2, etc. The generation is a sequential long integer - * represented in alpha-numeric (base 36) form.

- *
- * - *

Summary of File Extensions

- *
- *

The following table summarizes the names and extensions of the files in - * Lucene:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
NameExtensionBrief Description
{@link org.apache.lucene.index.SegmentInfos Segments File}segments_NStores information about a commit point
Lock Filewrite.lockThe Write lock prevents multiple IndexWriters from writing to the same - * file.
{@link org.apache.lucene.codecs.lucene62.Lucene62SegmentInfoFormat Segment Info}.siStores metadata about a segment
{@link org.apache.lucene.codecs.lucene50.Lucene50CompoundFormat Compound File}.cfs, .cfeAn optional "virtual" file consisting of all the other index files for - * systems that frequently run out of file handles.
{@link org.apache.lucene.codecs.lucene50.Lucene50FieldInfosFormat Fields}.fnmStores information about the fields
{@link org.apache.lucene.codecs.lucene50.Lucene50StoredFieldsFormat Field Index}.fdxContains pointers to field data
{@link org.apache.lucene.codecs.lucene50.Lucene50StoredFieldsFormat Field Data}.fdtThe stored fields for documents
{@link org.apache.lucene.codecs.lucene50.Lucene50PostingsFormat Term Dictionary}.timThe term dictionary, stores term info
{@link org.apache.lucene.codecs.lucene50.Lucene50PostingsFormat Term Index}.tipThe index into the Term Dictionary
{@link org.apache.lucene.codecs.lucene50.Lucene50PostingsFormat Frequencies}.docContains the list of docs which contain each term along with frequency
{@link org.apache.lucene.codecs.lucene50.Lucene50PostingsFormat Positions}.posStores position information about where a term occurs in the index
{@link org.apache.lucene.codecs.lucene50.Lucene50PostingsFormat Payloads}.payStores additional per-position metadata information such as character offsets and user payloads
{@link org.apache.lucene.codecs.lucene53.Lucene53NormsFormat Norms}.nvd, .nvmEncodes length and boost factors for docs and fields
{@link org.apache.lucene.codecs.lucene54.Lucene54DocValuesFormat Per-Document Values}.dvd, .dvmEncodes additional scoring factors or other per-document information.
{@link org.apache.lucene.codecs.lucene50.Lucene50TermVectorsFormat Term Vector Index}.tvxStores offset into the document data file
{@link org.apache.lucene.codecs.lucene50.Lucene50TermVectorsFormat Term Vector Documents}.tvdContains information about each document that has term vectors
{@link org.apache.lucene.codecs.lucene50.Lucene50TermVectorsFormat Term Vector Fields}.tvfThe field level info about term vectors
{@link org.apache.lucene.codecs.lucene50.Lucene50LiveDocsFormat Live Documents}.livInfo about what files are live
- *
- * - *

Lock File

- * The write lock, which is stored in the index directory by default, is named - * "write.lock". If the lock directory is different from the index directory then - * the write lock will be named "XXXX-write.lock" where XXXX is a unique prefix - * derived from the full path to the index directory. When this file is present, a - * writer is currently modifying the index (adding or removing documents). This - * lock file ensures that only one writer is modifying the index at a time. - * - *

History

- *

Compatibility notes are provided in this document, describing how file - * formats have changed from prior versions:

- *
    - *
  • In version 2.1, the file format was changed to allow lock-less commits (ie, - * no more commit lock). The change is fully backwards compatible: you can open a - * pre-2.1 index for searching or adding/deleting of docs. When the new segments - * file is saved (committed), it will be written in the new file format (meaning - * no specific "upgrade" process is needed). But note that once a commit has - * occurred, pre-2.1 Lucene will not be able to read the index.
  • - *
  • In version 2.3, the file format was changed to allow segments to share a - * single set of doc store (vectors & stored fields) files. This allows for - * faster indexing in certain cases. The change is fully backwards compatible (in - * the same way as the lock-less commits change in 2.1).
  • - *
  • In version 2.4, Strings are now written as true UTF-8 byte sequence, not - * Java's modified UTF-8. See - * LUCENE-510 for details.
  • - *
  • In version 2.9, an optional opaque Map<String,String> CommitUserData - * may be passed to IndexWriter's commit methods (and later retrieved), which is - * recorded in the segments_N file. See - * LUCENE-1382 for details. Also, - * diagnostics were added to each segment written recording details about why it - * was written (due to flush, merge; which OS/JRE was used; etc.). See issue - * LUCENE-1654 for details.
  • - *
  • In version 3.0, compressed fields are no longer written to the index (they - * can still be read, but on merge the new segment will write them, uncompressed). - * See issue LUCENE-1960 - * for details.
  • - *
  • In version 3.1, segments records the code version that created them. See - * LUCENE-2720 for details. - * Additionally segments track explicitly whether or not they have term vectors. - * See LUCENE-2811 - * for details.
  • - *
  • In version 3.2, numeric fields are written as natively to stored fields - * file, previously they were stored in text format only.
  • - *
  • In version 3.4, fields can omit position data while still indexing term - * frequencies.
  • - *
  • In version 4.0, the format of the inverted index became extensible via - * the {@link org.apache.lucene.codecs.Codec Codec} api. Fast per-document storage - * ({@code DocValues}) was introduced. Normalization factors need no longer be a - * single byte, they can be any {@link org.apache.lucene.index.NumericDocValues NumericDocValues}. - * Terms need not be unicode strings, they can be any byte sequence. Term offsets - * can optionally be indexed into the postings lists. Payloads can be stored in the - * term vectors.
  • - *
  • In version 4.1, the format of the postings list changed to use either - * of FOR compression or variable-byte encoding, depending upon the frequency - * of the term. Terms appearing only once were changed to inline directly into - * the term dictionary. Stored fields are compressed by default.
  • - *
  • In version 4.2, term vectors are compressed by default. DocValues has - * a new multi-valued type (SortedSet), that can be used for faceting/grouping/joining - * on multi-valued fields.
  • - *
  • In version 4.5, DocValues were extended to explicitly represent missing values.
  • - *
  • In version 4.6, FieldInfos were extended to support per-field DocValues generation, to - * allow updating NumericDocValues fields.
  • - *
  • In version 4.8, checksum footers were added to the end of each index file - * for improved data integrity. Specifically, the last 8 bytes of every index file - * contain the zlib-crc32 checksum of the file.
  • - *
  • In version 4.9, DocValues has a new multi-valued numeric type (SortedNumeric) - * that is suitable for faceting/sorting/analytics. - *
  • In version 5.4, DocValues have been improved to store more information on disk: - * addresses for binary fields and ord indexes for multi-valued fields. - *
  • - *
- * - *

Limitations

- *
- *

Lucene uses a Java int to refer to - * document numbers, and the index file format uses an Int32 - * on-disk to store document numbers. This is a limitation - * of both the index file format and the current implementation. Eventually these - * should be replaced with either UInt64 values, or - * better yet, {@link org.apache.lucene.store.DataOutput#writeVInt VInt} values which have no limit.

- *
- */ -package org.apache.lucene.codecs.lucene54; diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene50/Lucene50RWSegmentInfoFormat.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene50/Lucene50RWSegmentInfoFormat.java deleted file mode 100644 index 4bed31106dc8..000000000000 --- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene50/Lucene50RWSegmentInfoFormat.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene50; - - -import java.io.IOException; -import java.util.Map; -import java.util.Set; - -import org.apache.lucene.codecs.CodecUtil; -import org.apache.lucene.index.CorruptIndexException; -import org.apache.lucene.index.IndexFileNames; -import org.apache.lucene.index.SegmentInfo; // javadocs -import org.apache.lucene.store.ChecksumIndexInput; -import org.apache.lucene.store.Directory; -import org.apache.lucene.store.IOContext; -import org.apache.lucene.store.IndexOutput; -import org.apache.lucene.util.Version; - -/** - * Read-write version of 5.0 SegmentInfoFormat for testing - * @deprecated for test purposes only - */ -@Deprecated -public class Lucene50RWSegmentInfoFormat extends Lucene50SegmentInfoFormat { - - /** Sole constructor. */ - public Lucene50RWSegmentInfoFormat() { - } - - @Override - public SegmentInfo read(Directory dir, String segment, byte[] segmentID, IOContext context) throws IOException { - final String fileName = IndexFileNames.segmentFileName(segment, "", Lucene50SegmentInfoFormat.SI_EXTENSION); - try (ChecksumIndexInput input = dir.openChecksumInput(fileName, context)) { - Throwable priorE = null; - SegmentInfo si = null; - try { - CodecUtil.checkIndexHeader(input, Lucene50SegmentInfoFormat.CODEC_NAME, - Lucene50SegmentInfoFormat.VERSION_START, - Lucene50SegmentInfoFormat.VERSION_CURRENT, - segmentID, ""); - final Version version = Version.fromBits(input.readInt(), input.readInt(), input.readInt()); - - final int docCount = input.readInt(); - if (docCount < 0) { - throw new CorruptIndexException("invalid docCount: " + docCount, input); - } - final boolean isCompoundFile = input.readByte() == SegmentInfo.YES; - - final Map diagnostics = input.readMapOfStrings(); - final Set files = input.readSetOfStrings(); - final Map attributes = input.readMapOfStrings(); - - si = new SegmentInfo(dir, version, null, segment, docCount, isCompoundFile, null, diagnostics, segmentID, attributes, null); - si.setFiles(files); - } catch (Throwable exception) { - priorE = exception; - } finally { - CodecUtil.checkFooter(input, priorE); - } - return si; - } - } - - @Override - public void write(Directory dir, SegmentInfo si, IOContext ioContext) throws IOException { - final String fileName = IndexFileNames.segmentFileName(si.name, "", Lucene50SegmentInfoFormat.SI_EXTENSION); - - assert si.getIndexSort() == null; - - 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, - Lucene50SegmentInfoFormat.CODEC_NAME, - Lucene50SegmentInfoFormat.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 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()); - - CodecUtil.writeFooter(output); - } - } - - /** File extension used to store {@link SegmentInfo}. */ - public final static String SI_EXTENSION = "si"; - static final String CODEC_NAME = "Lucene50SegmentInfo"; - static final int VERSION_SAFE_MAPS = 1; - static final int VERSION_START = VERSION_SAFE_MAPS; - static final int VERSION_CURRENT = VERSION_SAFE_MAPS; -} diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene50/TestLucene50SegmentInfoFormat.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene50/TestLucene50SegmentInfoFormat.java deleted file mode 100644 index 0a9bf799dbaf..000000000000 --- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene50/TestLucene50SegmentInfoFormat.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene50; - -import org.apache.lucene.codecs.Codec; -import org.apache.lucene.codecs.lucene60.Lucene60RWCodec; -import org.apache.lucene.index.BaseSegmentInfoFormatTestCase; -import org.apache.lucene.util.Version; - -public class TestLucene50SegmentInfoFormat extends BaseSegmentInfoFormatTestCase { - - @Override - protected Codec getCodec() { - return new Lucene60RWCodec(); - } - - @Override - protected int getCreatedVersionMajor() { - return Version.LUCENE_6_0_0.major; - } - - @Override - protected Version[] getVersions() { - return new Version[] { Version.LUCENE_6_0_0 }; - } - - @Override - protected boolean supportsIndexSort() { - return false; - } - - @Override - protected boolean supportsMinVersion() { - return false; - } -} diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/Lucene53NormsConsumer.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/Lucene53NormsConsumer.java deleted file mode 100644 index 833500c19307..000000000000 --- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/Lucene53NormsConsumer.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene53; - - -import java.io.IOException; - -import org.apache.lucene.codecs.CodecUtil; -import org.apache.lucene.codecs.LegacyDocValuesIterables; -import org.apache.lucene.codecs.NormsConsumer; -import org.apache.lucene.codecs.NormsProducer; -import org.apache.lucene.index.FieldInfo; -import org.apache.lucene.index.IndexFileNames; -import org.apache.lucene.index.SegmentWriteState; -import org.apache.lucene.store.IndexOutput; -import org.apache.lucene.util.IOUtils; - -import static org.apache.lucene.codecs.lucene53.Lucene53NormsFormat.VERSION_CURRENT; - -/** - * Writer for {@link Lucene53NormsFormat} - */ -class Lucene53NormsConsumer extends NormsConsumer { - IndexOutput data, meta; - final int maxDoc; - - Lucene53NormsConsumer(SegmentWriteState state, String dataCodec, String dataExtension, String metaCodec, String metaExtension) throws IOException { - boolean success = false; - try { - String dataName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, dataExtension); - data = state.directory.createOutput(dataName, state.context); - CodecUtil.writeIndexHeader(data, dataCodec, VERSION_CURRENT, state.segmentInfo.getId(), state.segmentSuffix); - String metaName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, metaExtension); - meta = state.directory.createOutput(metaName, state.context); - CodecUtil.writeIndexHeader(meta, metaCodec, VERSION_CURRENT, state.segmentInfo.getId(), state.segmentSuffix); - maxDoc = state.segmentInfo.maxDoc(); - success = true; - } finally { - if (!success) { - IOUtils.closeWhileHandlingException(this); - } - } - } - - @Override - public void addNormsField(FieldInfo field, NormsProducer normsProducer) throws IOException { - addNormsField(field, LegacyDocValuesIterables.normsIterable(field, normsProducer, maxDoc)); - } - - private void addNormsField(FieldInfo field, Iterable values) throws IOException { - meta.writeVInt(field.number); - long minValue = Long.MAX_VALUE; - long maxValue = Long.MIN_VALUE; - int count = 0; - - for (Number nv : values) { - if (nv == null) { - throw new IllegalStateException("illegal norms data for field " + field.name + ", got null for value: " + count); - } - final long v = nv.longValue(); - minValue = Math.min(minValue, v); - maxValue = Math.max(maxValue, v); - count++; - } - - if (count != maxDoc) { - throw new IllegalStateException("illegal norms data for field " + field.name + ", expected count=" + maxDoc + ", got=" + count); - } - - if (minValue == maxValue) { - addConstant(minValue); - } else if (minValue >= Byte.MIN_VALUE && maxValue <= Byte.MAX_VALUE) { - addByte1(values); - } else if (minValue >= Short.MIN_VALUE && maxValue <= Short.MAX_VALUE) { - addByte2(values); - } else if (minValue >= Integer.MIN_VALUE && maxValue <= Integer.MAX_VALUE) { - addByte4(values); - } else { - addByte8(values); - } - } - - private void addConstant(long constant) throws IOException { - meta.writeByte((byte) 0); - meta.writeLong(constant); - } - - private void addByte1(Iterable values) throws IOException { - meta.writeByte((byte) 1); - meta.writeLong(data.getFilePointer()); - - for (Number value : values) { - data.writeByte(value.byteValue()); - } - } - - private void addByte2(Iterable values) throws IOException { - meta.writeByte((byte) 2); - meta.writeLong(data.getFilePointer()); - - for (Number value : values) { - data.writeShort(value.shortValue()); - } - } - - private void addByte4(Iterable values) throws IOException { - meta.writeByte((byte) 4); - meta.writeLong(data.getFilePointer()); - - for (Number value : values) { - data.writeInt(value.intValue()); - } - } - - private void addByte8(Iterable values) throws IOException { - meta.writeByte((byte) 8); - meta.writeLong(data.getFilePointer()); - - for (Number value : values) { - data.writeLong(value.longValue()); - } - } - - @Override - public void close() throws IOException { - boolean success = false; - try { - if (meta != null) { - meta.writeVInt(-1); // write EOF marker - CodecUtil.writeFooter(meta); // write checksum - } - if (data != null) { - CodecUtil.writeFooter(data); // write checksum - } - success = true; - } finally { - if (success) { - IOUtils.close(data, meta); - } else { - IOUtils.closeWhileHandlingException(data, meta); - } - meta = data = null; - } - } -} diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/Lucene53RWNormsFormat.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/Lucene53RWNormsFormat.java deleted file mode 100644 index 86a2b6a509bc..000000000000 --- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/Lucene53RWNormsFormat.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene53; - -import java.io.IOException; - -import org.apache.lucene.codecs.NormsConsumer; -import org.apache.lucene.index.SegmentWriteState; - -public class Lucene53RWNormsFormat extends Lucene53NormsFormat { - - @Override - public NormsConsumer normsConsumer(SegmentWriteState state) throws IOException { - return new Lucene53NormsConsumer(state, DATA_CODEC, DATA_EXTENSION, METADATA_CODEC, METADATA_EXTENSION); - } - -} diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/TestLucene53NormsFormat.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/TestLucene53NormsFormat.java deleted file mode 100644 index 7d37b45e56dc..000000000000 --- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene53/TestLucene53NormsFormat.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene53; - -import org.apache.lucene.codecs.Codec; -import org.apache.lucene.codecs.lucene62.Lucene62RWCodec; -import org.apache.lucene.index.BaseNormsFormatTestCase; -import org.apache.lucene.util.Version; - -/** - * Tests Lucene53NormsFormat - */ -public class TestLucene53NormsFormat extends BaseNormsFormatTestCase { - private final Codec codec = new Lucene62RWCodec(); - - @Override - protected int getCreatedVersionMajor() { - return Version.LUCENE_6_2_0.major; - } - - @Override - protected Codec getCodec() { - return codec; - } - - @Override - protected boolean codecSupportsSparsity() { - return false; - } -} \ No newline at end of file diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java deleted file mode 100644 index a761dfcec15e..000000000000 --- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java +++ /dev/null @@ -1,640 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene54; - - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; - -import org.apache.lucene.analysis.MockAnalyzer; -import org.apache.lucene.codecs.Codec; -import org.apache.lucene.codecs.DocValuesFormat; -import org.apache.lucene.codecs.PostingsFormat; -import org.apache.lucene.codecs.asserting.AssertingCodec; -import org.apache.lucene.codecs.lucene54.Lucene54DocValuesProducer.SparseNumericDocValues; -import org.apache.lucene.codecs.lucene54.Lucene54DocValuesProducer.SparseNumericDocValuesRandomAccessWrapper; -import org.apache.lucene.document.BinaryDocValuesField; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.NumericDocValuesField; -import org.apache.lucene.document.SortedDocValuesField; -import org.apache.lucene.document.SortedNumericDocValuesField; -import org.apache.lucene.document.SortedSetDocValuesField; -import org.apache.lucene.document.StoredField; -import org.apache.lucene.document.StringField; -import org.apache.lucene.index.BaseCompressingDocValuesFormatTestCase; -import org.apache.lucene.index.BinaryDocValues; -import org.apache.lucene.index.DirectoryReader; -import org.apache.lucene.index.DocValues; -import org.apache.lucene.index.IndexReader; -import org.apache.lucene.index.IndexWriter; -import org.apache.lucene.index.IndexWriterConfig; -import org.apache.lucene.index.IndexableField; -import org.apache.lucene.index.LeafReader; -import org.apache.lucene.index.LeafReaderContext; -import org.apache.lucene.index.NumericDocValues; -import org.apache.lucene.index.RandomIndexWriter; -import org.apache.lucene.index.SerialMergeScheduler; -import org.apache.lucene.index.SortedDocValues; -import org.apache.lucene.index.SortedNumericDocValues; -import org.apache.lucene.index.SortedSetDocValues; -import org.apache.lucene.index.Term; -import org.apache.lucene.index.Terms; -import org.apache.lucene.index.TermsEnum.SeekStatus; -import org.apache.lucene.search.DocIdSetIterator; -import org.apache.lucene.index.TermsEnum; -import org.apache.lucene.store.Directory; -import org.apache.lucene.store.RAMFile; -import org.apache.lucene.store.RAMInputStream; -import org.apache.lucene.store.RAMOutputStream; -import org.apache.lucene.util.BytesRef; -import org.apache.lucene.util.BytesRefBuilder; -import org.apache.lucene.util.LongValues; -import org.apache.lucene.util.TestUtil; - -/** - * Tests Lucene54DocValuesFormat - */ -public class TestLucene54DocValuesFormat extends BaseCompressingDocValuesFormatTestCase { - private final Codec codec = TestUtil.alwaysDocValuesFormat(new Lucene54DocValuesFormat()); - - @Override - protected Codec getCodec() { - return codec; - } - - // TODO: these big methods can easily blow up some of the other ram-hungry codecs... - // for now just keep them here, as we want to test this for this format. - - @Slow - public void testSortedSetVariableLengthBigVsStoredFields() throws Exception { - int numIterations = atLeast(1); - for (int i = 0; i < numIterations; i++) { - doTestSortedSetVsStoredFields(atLeast(300), 1, 32766, 16, 100); - } - } - - @Nightly - public void testSortedSetVariableLengthManyVsStoredFields() throws Exception { - int numIterations = atLeast(1); - for (int i = 0; i < numIterations; i++) { - doTestSortedSetVsStoredFields(TestUtil.nextInt(random(), 1024, 2049), 1, 500, 16, 100); - } - } - - @Slow - public void testSortedVariableLengthBigVsStoredFields() throws Exception { - int numIterations = atLeast(1); - for (int i = 0; i < numIterations; i++) { - doTestSortedVsStoredFields(atLeast(300), 1d, 1, 32766); - } - } - - @Nightly - public void testSortedVariableLengthManyVsStoredFields() throws Exception { - int numIterations = atLeast(1); - for (int i = 0; i < numIterations; i++) { - doTestSortedVsStoredFields(TestUtil.nextInt(random(), 1024, 2049), 1d, 1, 500); - } - } - - @Slow - public void testTermsEnumFixedWidth() throws Exception { - int numIterations = atLeast(1); - for (int i = 0; i < numIterations; i++) { - doTestTermsEnumRandom(TestUtil.nextInt(random(), 1025, 5121), 10, 10); - } - } - - @Slow - public void testTermsEnumVariableWidth() throws Exception { - int numIterations = atLeast(1); - for (int i = 0; i < numIterations; i++) { - doTestTermsEnumRandom(TestUtil.nextInt(random(), 1025, 5121), 1, 500); - } - } - - @Nightly - public void testTermsEnumRandomMany() throws Exception { - int numIterations = atLeast(1); - for (int i = 0; i < numIterations; i++) { - doTestTermsEnumRandom(TestUtil.nextInt(random(), 1025, 8121), 1, 500); - } - } - - @Slow - public void testSparseDocValuesVsStoredFields() throws Exception { - int numIterations = atLeast(1); - for (int i = 0; i < numIterations; i++) { - doTestSparseDocValuesVsStoredFields(); - } - } - - private void doTestSparseDocValuesVsStoredFields() throws Exception { - final long[] values = new long[TestUtil.nextInt(random(), 1, 500)]; - for (int i = 0; i < values.length; ++i) { - values[i] = random().nextLong(); - } - - Directory dir = newFSDirectory(createTempDir()); - IndexWriterConfig conf = newIndexWriterConfig(new MockAnalyzer(random())); - conf.setMergeScheduler(new SerialMergeScheduler()); - RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf); - - // sparse compression is only enabled if less than 1% of docs have a value - final int avgGap = 100; - - final int numDocs = atLeast(200); - for (int i = random().nextInt(avgGap * 2); i >= 0; --i) { - writer.addDocument(new Document()); - } - final int maxNumValuesPerDoc = random().nextBoolean() ? 1 : TestUtil.nextInt(random(), 2, 5); - for (int i = 0; i < numDocs; ++i) { - Document doc = new Document(); - - // single-valued - long docValue = values[random().nextInt(values.length)]; - doc.add(new NumericDocValuesField("numeric", docValue)); - doc.add(new SortedDocValuesField("sorted", new BytesRef(Long.toString(docValue)))); - doc.add(new BinaryDocValuesField("binary", new BytesRef(Long.toString(docValue)))); - doc.add(new StoredField("value", docValue)); - - // multi-valued - final int numValues = TestUtil.nextInt(random(), 1, maxNumValuesPerDoc); - for (int j = 0; j < numValues; ++j) { - docValue = values[random().nextInt(values.length)]; - doc.add(new SortedNumericDocValuesField("sorted_numeric", docValue)); - doc.add(new SortedSetDocValuesField("sorted_set", new BytesRef(Long.toString(docValue)))); - doc.add(new StoredField("values", docValue)); - } - - writer.addDocument(doc); - - // add a gap - for (int j = TestUtil.nextInt(random(), 0, avgGap * 2); j >= 0; --j) { - writer.addDocument(new Document()); - } - } - - if (random().nextBoolean()) { - writer.forceMerge(1); - } - - final IndexReader indexReader = writer.getReader(); - TestUtil.checkReader(indexReader); - writer.close(); - - for (LeafReaderContext context : indexReader.leaves()) { - final LeafReader reader = context.reader(); - final NumericDocValues numeric = DocValues.getNumeric(reader, "numeric"); - - final SortedDocValues sorted = DocValues.getSorted(reader, "sorted"); - - final BinaryDocValues binary = DocValues.getBinary(reader, "binary"); - - final SortedNumericDocValues sortedNumeric = DocValues.getSortedNumeric(reader, "sorted_numeric"); - - final SortedSetDocValues sortedSet = DocValues.getSortedSet(reader, "sorted_set"); - - for (int i = 0; i < reader.maxDoc(); ++i) { - final Document doc = reader.document(i); - final IndexableField valueField = doc.getField("value"); - final Long value = valueField == null ? null : valueField.numericValue().longValue(); - - if (value == null) { - assertTrue(numeric.docID() + " vs " + i, numeric.docID() < i); - } else { - assertEquals(i, numeric.nextDoc()); - assertEquals(i, binary.nextDoc()); - assertEquals(i, sorted.nextDoc()); - assertEquals(value.longValue(), numeric.longValue()); - assertTrue(sorted.ordValue() >= 0); - assertEquals(new BytesRef(Long.toString(value)), sorted.lookupOrd(sorted.ordValue())); - assertEquals(new BytesRef(Long.toString(value)), binary.binaryValue()); - } - - final IndexableField[] valuesFields = doc.getFields("values"); - if (valuesFields.length == 0) { - assertTrue(sortedNumeric.docID() + " vs " + i, sortedNumeric.docID() < i); - } else { - final Set valueSet = new HashSet<>(); - for (IndexableField sf : valuesFields) { - valueSet.add(sf.numericValue().longValue()); - } - - assertEquals(i, sortedNumeric.nextDoc()); - assertEquals(valuesFields.length, sortedNumeric.docValueCount()); - for (int j = 0; j < sortedNumeric.docValueCount(); ++j) { - assertTrue(valueSet.contains(sortedNumeric.nextValue())); - } - assertEquals(i, sortedSet.nextDoc()); - int sortedSetCount = 0; - while (true) { - long ord = sortedSet.nextOrd(); - if (ord == SortedSetDocValues.NO_MORE_ORDS) { - break; - } - assertTrue(valueSet.contains(Long.parseLong(sortedSet.lookupOrd(ord).utf8ToString()))); - sortedSetCount++; - } - assertEquals(valueSet.size(), sortedSetCount); - } - } - } - - indexReader.close(); - dir.close(); - } - - // TODO: try to refactor this and some termsenum tests into the base class. - // to do this we need to fix the test class to get a DVF not a Codec so we can setup - // the postings format correctly. - private void doTestTermsEnumRandom(int numDocs, int minLength, int maxLength) throws Exception { - Directory dir = newFSDirectory(createTempDir()); - IndexWriterConfig conf = newIndexWriterConfig(new MockAnalyzer(random())); - conf.setMergeScheduler(new SerialMergeScheduler()); - // set to duel against a codec which has ordinals: - final PostingsFormat pf = TestUtil.getPostingsFormatWithOrds(random()); - final DocValuesFormat dv = new Lucene54DocValuesFormat(); - conf.setCodec(new AssertingCodec() { - @Override - public PostingsFormat getPostingsFormatForField(String field) { - return pf; - } - - @Override - public DocValuesFormat getDocValuesFormatForField(String field) { - return dv; - } - }); - RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf); - - // index some docs - for (int i = 0; i < numDocs; i++) { - Document doc = new Document(); - Field idField = new StringField("id", Integer.toString(i), Field.Store.NO); - doc.add(idField); - final int length = TestUtil.nextInt(random(), minLength, maxLength); - int numValues = random().nextInt(17); - // create a random list of strings - List values = new ArrayList<>(); - for (int v = 0; v < numValues; v++) { - values.add(TestUtil.randomSimpleString(random(), minLength, length)); - } - - // add in any order to the indexed field - ArrayList unordered = new ArrayList<>(values); - Collections.shuffle(unordered, random()); - for (String v : values) { - doc.add(newStringField("indexed", v, Field.Store.NO)); - } - - // add in any order to the dv field - ArrayList unordered2 = new ArrayList<>(values); - Collections.shuffle(unordered2, random()); - for (String v : unordered2) { - doc.add(new SortedSetDocValuesField("dv", new BytesRef(v))); - } - - writer.addDocument(doc); - if (random().nextInt(31) == 0) { - writer.commit(); - } - } - - // delete some docs - int numDeletions = random().nextInt(numDocs/10); - for (int i = 0; i < numDeletions; i++) { - int id = random().nextInt(numDocs); - writer.deleteDocuments(new Term("id", Integer.toString(id))); - } - - // compare per-segment - DirectoryReader ir = writer.getReader(); - for (LeafReaderContext context : ir.leaves()) { - LeafReader r = context.reader(); - Terms terms = r.terms("indexed"); - if (terms != null) { - SortedSetDocValues ssdv = r.getSortedSetDocValues("dv"); - assertEquals(terms.size(), ssdv.getValueCount()); - TermsEnum expected = terms.iterator(); - TermsEnum actual = r.getSortedSetDocValues("dv").termsEnum(); - assertEquals(terms.size(), expected, actual); - - doTestSortedSetEnumAdvanceIndependently(ssdv); - } - } - ir.close(); - - writer.forceMerge(1); - - // now compare again after the merge - ir = writer.getReader(); - LeafReader ar = getOnlyLeafReader(ir); - Terms terms = ar.terms("indexed"); - if (terms != null) { - assertEquals(terms.size(), ar.getSortedSetDocValues("dv").getValueCount()); - TermsEnum expected = terms.iterator(); - TermsEnum actual = ar.getSortedSetDocValues("dv").termsEnum(); - assertEquals(terms.size(), expected, actual); - } - ir.close(); - - writer.close(); - dir.close(); - } - - private void assertEquals(long numOrds, TermsEnum expected, TermsEnum actual) throws Exception { - BytesRef ref; - - // sequential next() through all terms - while ((ref = expected.next()) != null) { - assertEquals(ref, actual.next()); - assertEquals(expected.ord(), actual.ord()); - assertEquals(expected.term(), actual.term()); - } - assertNull(actual.next()); - - // sequential seekExact(ord) through all terms - for (long i = 0; i < numOrds; i++) { - expected.seekExact(i); - actual.seekExact(i); - assertEquals(expected.ord(), actual.ord()); - assertEquals(expected.term(), actual.term()); - } - - // sequential seekExact(BytesRef) through all terms - for (long i = 0; i < numOrds; i++) { - expected.seekExact(i); - assertTrue(actual.seekExact(expected.term())); - assertEquals(expected.ord(), actual.ord()); - assertEquals(expected.term(), actual.term()); - } - - // sequential seekCeil(BytesRef) through all terms - for (long i = 0; i < numOrds; i++) { - expected.seekExact(i); - assertEquals(SeekStatus.FOUND, actual.seekCeil(expected.term())); - assertEquals(expected.ord(), actual.ord()); - assertEquals(expected.term(), actual.term()); - } - - // random seekExact(ord) - for (long i = 0; i < numOrds; i++) { - long randomOrd = TestUtil.nextLong(random(), 0, numOrds - 1); - expected.seekExact(randomOrd); - actual.seekExact(randomOrd); - assertEquals(expected.ord(), actual.ord()); - assertEquals(expected.term(), actual.term()); - } - - // random seekExact(BytesRef) - for (long i = 0; i < numOrds; i++) { - long randomOrd = TestUtil.nextLong(random(), 0, numOrds - 1); - expected.seekExact(randomOrd); - actual.seekExact(expected.term()); - assertEquals(expected.ord(), actual.ord()); - assertEquals(expected.term(), actual.term()); - } - - // random seekCeil(BytesRef) - for (long i = 0; i < numOrds; i++) { - BytesRef target = new BytesRef(TestUtil.randomUnicodeString(random())); - SeekStatus expectedStatus = expected.seekCeil(target); - assertEquals(expectedStatus, actual.seekCeil(target)); - if (expectedStatus != SeekStatus.END) { - assertEquals(expected.ord(), actual.ord()); - assertEquals(expected.term(), actual.term()); - } - } - } - - public void testSparseLongValues() throws IOException { - final int iters = atLeast(5); - for (int iter = 0; iter < iters; ++iter) { - final int numDocs = TestUtil.nextInt(random(), 0, 100); - final int[] docIds = new int[numDocs]; - final long[] values = new long[numDocs]; - final int maxDoc; - if (numDocs == 0) { - maxDoc = 1 + random().nextInt(10); - } else { - docIds[0] = random().nextInt(10); - for (int i = 1; i < docIds.length; ++i) { - docIds[i] = docIds[i - 1] + 1 + random().nextInt(100); - } - maxDoc = docIds[numDocs - 1] + 1 + random().nextInt(10); - } - for (int i = 0; i < values.length; ++i) { - values[i] = random().nextLong(); - } - final long missingValue = random().nextLong(); - final LongValues docIdsValues = new LongValues() { - @Override - public long get(long index) { - return docIds[Math.toIntExact(index)]; - } - }; - final LongValues valuesValues = new LongValues() { - @Override - public long get(long index) { - return values[Math.toIntExact(index)]; - } - }; - final SparseNumericDocValues sparseValues = new SparseNumericDocValues(numDocs, docIdsValues, valuesValues); - - // sequential access - assertEquals(-1, sparseValues.docID()); - for (int i = 0; i < docIds.length; ++i) { - assertEquals(docIds[i], sparseValues.nextDoc()); - } - assertEquals(DocIdSetIterator.NO_MORE_DOCS, sparseValues.nextDoc()); - - // advance - for (int i = 0; i < 2000; ++i) { - final int target = TestUtil.nextInt(random(), 0, maxDoc); - int index = Arrays.binarySearch(docIds, target); - if (index < 0) { - index = -1 - index; - } - sparseValues.reset(); - if (index > 0) { - assertEquals(docIds[index - 1], sparseValues.advance(Math.toIntExact(docIds[index - 1]))); - } - if (index == docIds.length) { - assertEquals(DocIdSetIterator.NO_MORE_DOCS, sparseValues.advance(target)); - } else { - assertEquals(docIds[index], sparseValues.advance(target)); - } - } - - // advanceExact - for (int i = 0; i < 2000; ++i) { - sparseValues.reset(); - if (random().nextBoolean() && docIds.length > 0) { - sparseValues.advance(docIds[TestUtil.nextInt(random(), 0, docIds.length - 1)]); - } - - final int target = TestUtil.nextInt(random(), Math.max(0, sparseValues.docID()), maxDoc - 1); - final boolean exists = sparseValues.advanceExact(target); - - final int index = Arrays.binarySearch(docIds, target); - assertEquals(index >= 0, exists); - assertEquals(target, sparseValues.docID()); - - final boolean exists2 = sparseValues.advanceExact(target); - assertEquals(index >= 0, exists2); - assertEquals(target, sparseValues.docID()); - - final int nextIndex = index >= 0 ? index + 1 : -1 - index; - if (nextIndex >= docIds.length) { - assertEquals(DocIdSetIterator.NO_MORE_DOCS, sparseValues.nextDoc()); - } else { - assertEquals(docIds[nextIndex], sparseValues.nextDoc()); - } - } - - - final SparseNumericDocValuesRandomAccessWrapper raWrapper = new SparseNumericDocValuesRandomAccessWrapper(sparseValues, missingValue); - - // random-access - for (int i = 0; i < 2000; ++i) { - final int docId = TestUtil.nextInt(random(), 0, maxDoc - 1); - final int idx = Arrays.binarySearch(docIds, docId); - final long value = raWrapper.get(docId); - if (idx >= 0) { - assertEquals(values[idx], value); - } else { - assertEquals(missingValue, value); - } - } - - // sequential access - for (int docId = 0; docId < maxDoc; docId += random().nextInt(3)) { - final int idx = Arrays.binarySearch(docIds, docId); - final long value = raWrapper.get(docId); - if (idx >= 0) { - assertEquals(values[idx], value); - } else { - assertEquals(missingValue, value); - } - } - } - } - - @Slow - public void testSortedSetAroundBlockSize() throws IOException { - final int frontier = 1 << Lucene54DocValuesFormat.DIRECT_MONOTONIC_BLOCK_SHIFT; - for (int maxDoc = frontier - 1; maxDoc <= frontier + 1; ++maxDoc) { - final Directory dir = newDirectory(); - IndexWriter w = new IndexWriter(dir, newIndexWriterConfig().setMergePolicy(newLogMergePolicy())); - RAMFile buffer = new RAMFile(); - RAMOutputStream out = new RAMOutputStream(buffer, false); - Document doc = new Document(); - SortedSetDocValuesField field1 = new SortedSetDocValuesField("sset", new BytesRef()); - doc.add(field1); - SortedSetDocValuesField field2 = new SortedSetDocValuesField("sset", new BytesRef()); - doc.add(field2); - for (int i = 0; i < maxDoc; ++i) { - BytesRef s1 = new BytesRef(TestUtil.randomSimpleString(random(), 2)); - BytesRef s2 = new BytesRef(TestUtil.randomSimpleString(random(), 2)); - field1.setBytesValue(s1); - field2.setBytesValue(s2); - w.addDocument(doc); - Set set = new TreeSet<>(Arrays.asList(s1, s2)); - out.writeVInt(set.size()); - for (BytesRef ref : set) { - out.writeVInt(ref.length); - out.writeBytes(ref.bytes, ref.offset, ref.length); - } - } - out.close(); - w.forceMerge(1); - DirectoryReader r = DirectoryReader.open(w); - w.close(); - LeafReader sr = getOnlyLeafReader(r); - assertEquals(maxDoc, sr.maxDoc()); - SortedSetDocValues values = sr.getSortedSetDocValues("sset"); - assertNotNull(values); - RAMInputStream in = new RAMInputStream("", buffer); - BytesRefBuilder b = new BytesRefBuilder(); - for (int i = 0; i < maxDoc; ++i) { - assertEquals(i, values.nextDoc()); - final int numValues = in.readVInt(); - - for (int j = 0; j < numValues; ++j) { - b.setLength(in.readVInt()); - b.grow(b.length()); - in.readBytes(b.bytes(), 0, b.length()); - assertEquals(b.get(), values.lookupOrd(values.nextOrd())); - } - - assertEquals(SortedSetDocValues.NO_MORE_ORDS, values.nextOrd()); - } - r.close(); - dir.close(); - } - } - - @Slow - public void testSortedNumericAroundBlockSize() throws IOException { - final int frontier = 1 << Lucene54DocValuesFormat.DIRECT_MONOTONIC_BLOCK_SHIFT; - for (int maxDoc = frontier - 1; maxDoc <= frontier + 1; ++maxDoc) { - final Directory dir = newDirectory(); - IndexWriter w = new IndexWriter(dir, newIndexWriterConfig().setMergePolicy(newLogMergePolicy())); - RAMFile buffer = new RAMFile(); - RAMOutputStream out = new RAMOutputStream(buffer, false); - Document doc = new Document(); - SortedNumericDocValuesField field1 = new SortedNumericDocValuesField("snum", 0L); - doc.add(field1); - SortedNumericDocValuesField field2 = new SortedNumericDocValuesField("snum", 0L); - doc.add(field2); - for (int i = 0; i < maxDoc; ++i) { - long s1 = random().nextInt(100); - long s2 = random().nextInt(100); - field1.setLongValue(s1); - field2.setLongValue(s2); - w.addDocument(doc); - out.writeVLong(Math.min(s1, s2)); - out.writeVLong(Math.max(s1, s2)); - } - out.close(); - w.forceMerge(1); - DirectoryReader r = DirectoryReader.open(w); - w.close(); - LeafReader sr = getOnlyLeafReader(r); - assertEquals(maxDoc, sr.maxDoc()); - SortedNumericDocValues values = sr.getSortedNumericDocValues("snum"); - assertNotNull(values); - RAMInputStream in = new RAMInputStream("", buffer); - for (int i = 0; i < maxDoc; ++i) { - assertEquals(i, values.nextDoc()); - assertEquals(2, values.docValueCount()); - assertEquals(in.readVLong(), values.nextValue()); - assertEquals(in.readVLong(), values.nextValue()); - } - r.close(); - dir.close(); - } - } -} diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexFormatTooOldException.java b/lucene/core/src/java/org/apache/lucene/index/IndexFormatTooOldException.java index b7c02f5299e7..1fd79539adbd 100644 --- a/lucene/core/src/java/org/apache/lucene/index/IndexFormatTooOldException.java +++ b/lucene/core/src/java/org/apache/lucene/index/IndexFormatTooOldException.java @@ -42,7 +42,7 @@ public class IndexFormatTooOldException extends IOException { * @lucene.internal */ public IndexFormatTooOldException(String resourceDescription, String reason) { super("Format version is not supported (resource " + resourceDescription + "): " + - reason + ". This version of Lucene only supports indexes created with release 6.0 and later."); + reason + ". This version of Lucene only supports indexes created with release 7.0 and later."); this.resourceDescription = resourceDescription; this.reason = reason; this.version = null; diff --git a/lucene/core/src/java/org/apache/lucene/util/Version.java b/lucene/core/src/java/org/apache/lucene/util/Version.java index 0b10d95312f6..634caee610a7 100644 --- a/lucene/core/src/java/org/apache/lucene/util/Version.java +++ b/lucene/core/src/java/org/apache/lucene/util/Version.java @@ -38,62 +38,6 @@ public final class Version { @Deprecated public static final Version LUCENE_6_0_0 = new Version(6, 0, 0); - /** - * Match settings and bugs in Lucene's 6.0.1 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_0_1 = new Version(6, 0, 1); - - /** - * Match settings and bugs in Lucene's 6.1.0 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_1_0 = new Version(6, 1, 0); - - /** - * Match settings and bugs in Lucene's 6.2.0 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_2_0 = new Version(6, 2, 0); - - /** - * Match settings and bugs in Lucene's 6.2.1 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_2_1 = new Version(6, 2, 1); - - /** - * Match settings and bugs in Lucene's 6.3.0 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_3_0 = new Version(6, 3, 0); - - /** - * Match settings and bugs in Lucene's 6.4.0 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_4_0 = new Version(6, 4, 0); - - /** - * Match settings and bugs in Lucene's 6.4.1 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_4_1 = new Version(6, 4, 1); - - /** - * Match settings and bugs in Lucene's 6.4.2 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_4_2 = new Version(6, 4, 2); - /** * Match settings and bugs in Lucene's 6.5.0 release. * @deprecated Use latest @@ -101,27 +45,6 @@ public final class Version { @Deprecated public static final Version LUCENE_6_5_0 = new Version(6, 5, 0); - /** - * Match settings and bugs in Lucene's 6.5.1 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_5_1 = new Version(6, 5, 1); - - /** - * Match settings and bugs in Lucene's 6.6.0 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_6_0 = new Version(6, 6, 0); - - /** - * Match settings and bugs in Lucene's 6.7.0 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_7_0 = new Version(6, 7, 0); - /** * Match settings and bugs in Lucene's 7.0.0 release. * @deprecated (8.0.0) Use latest diff --git a/lucene/core/src/test/org/apache/lucene/util/TestVersion.java b/lucene/core/src/test/org/apache/lucene/util/TestVersion.java index 673aaae488a6..cc30a5d3bf03 100644 --- a/lucene/core/src/test/org/apache/lucene/util/TestVersion.java +++ b/lucene/core/src/test/org/apache/lucene/util/TestVersion.java @@ -32,25 +32,26 @@ public void testOnOrAfter() throws Exception { assertTrue("LATEST must be always onOrAfter("+v+")", Version.LATEST.onOrAfter(v)); } } - assertTrue(Version.LUCENE_7_0_0.onOrAfter(Version.LUCENE_6_0_0));; + assertTrue(Version.LUCENE_8_0_0.onOrAfter(Version.LUCENE_7_0_0));; } public void testToString() { - assertEquals("6.0.0", Version.LUCENE_6_0_0.toString()); assertEquals("7.0.0", Version.LUCENE_7_0_0.toString()); + assertEquals("8.0.0", Version.LUCENE_8_0_0.toString()); } public void testParseLeniently() throws Exception { - assertEquals(Version.LUCENE_6_0_0, Version.parseLeniently("6.0")); - assertEquals(Version.LUCENE_6_0_0, Version.parseLeniently("6.0.0")); - assertEquals(Version.LUCENE_6_0_0, Version.parseLeniently("LUCENE_60")); - assertEquals(Version.LUCENE_6_0_0, Version.parseLeniently("LUCENE_6_0")); - assertEquals(Version.LUCENE_6_0_0, Version.parseLeniently("LUCENE_6_0_0")); assertEquals(Version.LUCENE_7_0_0, Version.parseLeniently("7.0")); assertEquals(Version.LUCENE_7_0_0, Version.parseLeniently("7.0.0")); assertEquals(Version.LUCENE_7_0_0, Version.parseLeniently("LUCENE_70")); assertEquals(Version.LUCENE_7_0_0, Version.parseLeniently("LUCENE_7_0")); assertEquals(Version.LUCENE_7_0_0, Version.parseLeniently("LUCENE_7_0_0")); + assertEquals(Version.LUCENE_8_0_0, Version.parseLeniently("8.0")); + assertEquals(Version.LUCENE_8_0_0, Version.parseLeniently("8.0.0")); + assertEquals(Version.LUCENE_8_0_0, Version.parseLeniently("LUCENE_80")); + assertEquals(Version.LUCENE_8_0_0, Version.parseLeniently("LUCENE_8_0")); + assertEquals(Version.LUCENE_8_0_0, Version.parseLeniently("LUCENE_8_0_0")); + assertEquals(Version.LATEST, Version.parseLeniently("LATEST")); assertEquals(Version.LATEST, Version.parseLeniently("latest")); assertEquals(Version.LATEST, Version.parseLeniently("LUCENE_CURRENT")); @@ -74,9 +75,9 @@ public void testParseLenientlyExceptions() { assertTrue(expected.getMessage().contains("LUCENE61")); expected = expectThrows(ParseException.class, () -> { - Version.parseLeniently("LUCENE_6.0.0"); + Version.parseLeniently("LUCENE_7.0.0"); }); - assertTrue(expected.getMessage().contains("LUCENE_6.0.0")); + assertTrue(expected.getMessage().contains("LUCENE_7.0.0")); } public void testParseLenientlyOnAllConstants() throws Exception { @@ -94,8 +95,8 @@ public void testParseLenientlyOnAllConstants() throws Exception { } public void testParse() throws Exception { - assertEquals(Version.LUCENE_6_0_0, Version.parse("6.0.0")); assertEquals(Version.LUCENE_7_0_0, Version.parse("7.0.0")); + assertEquals(Version.LUCENE_8_0_0, Version.parse("8.0.0")); // Version does not pass judgement on the major version: assertEquals(1, Version.parse("1.0").major); @@ -103,69 +104,69 @@ public void testParse() throws Exception { } public void testForwardsCompatibility() throws Exception { - assertTrue(Version.parse("6.10.20").onOrAfter(Version.LUCENE_6_0_0)); + assertTrue(Version.parse("7.10.20").onOrAfter(Version.LUCENE_7_0_0)); } public void testParseExceptions() { ParseException expected = expectThrows(ParseException.class, () -> { - Version.parse("LUCENE_6_0_0"); + Version.parse("LUCENE_7_0_0"); }); - assertTrue(expected.getMessage().contains("LUCENE_6_0_0")); + assertTrue(expected.getMessage().contains("LUCENE_7_0_0")); expected = expectThrows(ParseException.class, () -> { - Version.parse("6.256"); + Version.parse("7.256"); }); - assertTrue(expected.getMessage().contains("6.256")); + assertTrue(expected.getMessage().contains("7.256")); expected = expectThrows(ParseException.class, () -> { - Version.parse("6.-1"); + Version.parse("7.-1"); }); - assertTrue(expected.getMessage().contains("6.-1")); + assertTrue(expected.getMessage().contains("7.-1")); expected = expectThrows(ParseException.class, () -> { - Version.parse("6.1.256"); + Version.parse("7.1.256"); }); - assertTrue(expected.getMessage().contains("6.1.256")); + assertTrue(expected.getMessage().contains("7.1.256")); expected = expectThrows(ParseException.class, () -> { - Version.parse("6.1.-1"); + Version.parse("7.1.-1"); }); - assertTrue(expected.getMessage().contains("6.1.-1")); + assertTrue(expected.getMessage().contains("7.1.-1")); expected = expectThrows(ParseException.class, () -> { - Version.parse("6.1.1.3"); + Version.parse("7.1.1.3"); }); - assertTrue(expected.getMessage().contains("6.1.1.3")); + assertTrue(expected.getMessage().contains("7.1.1.3")); expected = expectThrows(ParseException.class, () -> { - Version.parse("6.1.1.-1"); + Version.parse("7.1.1.-1"); }); - assertTrue(expected.getMessage().contains("6.1.1.-1")); + assertTrue(expected.getMessage().contains("7.1.1.-1")); expected = expectThrows(ParseException.class, () -> { - Version.parse("6.1.1.1"); + Version.parse("7.1.1.1"); }); - assertTrue(expected.getMessage().contains("6.1.1.1")); + assertTrue(expected.getMessage().contains("7.1.1.1")); expected = expectThrows(ParseException.class, () -> { - Version.parse("6.1.1.2"); + Version.parse("7.1.1.2"); }); - assertTrue(expected.getMessage().contains("6.1.1.2")); + assertTrue(expected.getMessage().contains("7.1.1.2")); expected = expectThrows(ParseException.class, () -> { - Version.parse("6.0.0.0"); + Version.parse("7.0.0.0"); }); - assertTrue(expected.getMessage().contains("6.0.0.0")); + assertTrue(expected.getMessage().contains("7.0.0.0")); expected = expectThrows(ParseException.class, () -> { - Version.parse("6.0.0.1.42"); + Version.parse("7.0.0.1.42"); }); - assertTrue(expected.getMessage().contains("6.0.0.1.42")); + assertTrue(expected.getMessage().contains("7.0.0.1.42")); expected = expectThrows(ParseException.class, () -> { - Version.parse("6..0.1"); + Version.parse("7..0.1"); }); - assertTrue(expected.getMessage().contains("6..0.1")); + assertTrue(expected.getMessage().contains("7..0.1")); } public void testDeprecations() throws Exception { From 869a48ccacddd3ad9e1dac68eee6d66b78a7049b Mon Sep 17 00:00:00 2001 From: Adrien Grand Date: Mon, 3 Jul 2017 14:12:25 +0200 Subject: [PATCH 5/7] Remove FixBrokenOffsets since 7.0+ indices cannot have broken offsets. --- .../apache/lucene/index/FixBrokenOffsets.java | 138 ------------------ .../lucene/index/TestFixBrokenOffsets.java | 112 -------------- 2 files changed, 250 deletions(-) delete mode 100644 lucene/backward-codecs/src/java/org/apache/lucene/index/FixBrokenOffsets.java delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/index/TestFixBrokenOffsets.java diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/index/FixBrokenOffsets.java b/lucene/backward-codecs/src/java/org/apache/lucene/index/FixBrokenOffsets.java deleted file mode 100644 index 9b3615eb37a7..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/index/FixBrokenOffsets.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.index; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; - -import org.apache.lucene.store.Directory; -import org.apache.lucene.store.FSDirectory; -import org.apache.lucene.util.IOUtils; -import org.apache.lucene.util.SuppressForbidden; - -/** - * Command-line tool that reads from a source index and - * writes to a dest index, correcting any broken offsets - * in the process. - * - * @lucene.experimental - */ -public class FixBrokenOffsets { - public SegmentInfos infos; - - FSDirectory fsDir; - - Path dir; - - @SuppressForbidden(reason = "System.out required: command line tool") - public static void main(String[] args) throws IOException { - if (args.length < 2) { - System.err.println("Usage: FixBrokenOffsetse "); - return; - } - Path srcPath = Paths.get(args[0]); - if (!Files.exists(srcPath)) { - throw new RuntimeException("srcPath " + srcPath.toAbsolutePath() + " doesn't exist"); - } - Path destPath = Paths.get(args[1]); - if (Files.exists(destPath)) { - throw new RuntimeException("destPath " + destPath.toAbsolutePath() + " already exists; please remove it and re-run"); - } - Directory srcDir = FSDirectory.open(srcPath); - DirectoryReader reader = DirectoryReader.open(srcDir); - - List leaves = reader.leaves(); - CodecReader[] filtered = new CodecReader[leaves.size()]; - for(int i=0;i finalW.addIndexes(dir)); - assertTrue(e.getMessage(), e.getMessage().startsWith("Cannot use addIndexes(Directory) with indexes that have been created by a different Lucene version.")); - w.close(); - // OK: addIndexes(Directory...) refuses to execute if the index creation version is different so broken offsets are not carried over - tmpDir.close(); - - final MockDirectoryWrapper tmpDir2 = newMockDirectory(); - tmpDir2.setCheckIndexOnClose(false); - w = new IndexWriter(tmpDir2, new IndexWriterConfig()); - DirectoryReader reader = DirectoryReader.open(dir); - List leaves = reader.leaves(); - CodecReader[] codecReaders = new CodecReader[leaves.size()]; - for(int i=0;i finalW2.addIndexes(codecReaders)); - assertEquals("Cannot merge a segment that has been created with major version 6 into this index which has been created by major version 7", e.getMessage()); - reader.close(); - w.close(); - tmpDir2.close(); - - // Now run the tool and confirm the broken offsets are fixed: - Path path2 = createTempDir("fixedbrokenoffsets").resolve("subdir"); - FixBrokenOffsets.main(new String[] {path.toString(), path2.toString()}); - Directory tmpDir3 = FSDirectory.open(path2); - TestUtil.checkIndex(tmpDir3); - tmpDir3.close(); - - dir.close(); - } -} From 9ca3dd26e423b396047326cd32b57d3cc6279f01 Mon Sep 17 00:00:00 2001 From: Adrien Grand Date: Mon, 3 Jul 2017 14:16:18 +0200 Subject: [PATCH 6/7] Remove old unsupported codecs. --- .../lucene/codecs/lucene60/Lucene60Codec.java | 177 ---------------- .../lucene/codecs/lucene60/package.html | 25 --- .../lucene/codecs/lucene62/Lucene62Codec.java | 176 ---------------- .../lucene/codecs/lucene62/package.html | 25 --- .../java/org/apache/lucene/index/package.html | 27 --- .../services/org.apache.lucene.codecs.Codec | 2 - .../org.apache.lucene.codecs.DocValuesFormat | 1 - .../codecs/lucene60/Lucene60RWCodec.java | 38 ---- .../codecs/lucene62/Lucene62RWCodec.java | 44 ---- .../lucene62/Lucene62RWSegmentInfoFormat.java | 193 ------------------ .../TestLucene62SegmentInfoFormat.java | 48 ----- .../index/TestBackwardsCompatibility.java | 12 +- .../index/TestIndexWriterOnOldIndex.java | 7 +- .../index/TestManyPointsInOldIndex.java | 1 + .../apache/lucene/index/dvupdates.6.0.0.zip | Bin 3420 -> 0 bytes .../org/apache/lucene/index/empty.6.0.0.zip | Bin 225 -> 0 bytes .../apache/lucene/index/manypointsindex.zip | Bin 3739 -> 0 bytes .../org/apache/lucene/index/maxposindex.zip | Bin 1702 -> 0 bytes .../apache/lucene/index/moreterms.6.0.0.zip | Bin 157215 -> 0 bytes .../org/apache/lucene/index/sorted.6.2.0.zip | Bin 157007 -> 0 bytes .../org/apache/lucene/index/sorted.6.2.1.zip | Bin 100974 -> 0 bytes .../org/apache/lucene/index/sorted.6.3.0.zip | Bin 71090 -> 0 bytes .../index/unsupported.630.brokenoffsets.zip | Bin 3203 -> 0 bytes .../unsupported.single-empty-doc.630.zip | Bin 1363 -> 0 bytes 24 files changed, 13 insertions(+), 763 deletions(-) delete mode 100644 lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene60/Lucene60Codec.java delete mode 100644 lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene60/package.html delete mode 100644 lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene62/Lucene62Codec.java delete mode 100644 lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene62/package.html delete mode 100644 lucene/backward-codecs/src/java/org/apache/lucene/index/package.html delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene60/Lucene60RWCodec.java delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/Lucene62RWCodec.java delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/Lucene62RWSegmentInfoFormat.java delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/TestLucene62SegmentInfoFormat.java delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/index/dvupdates.6.0.0.zip delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/index/empty.6.0.0.zip delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/index/manypointsindex.zip delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/index/maxposindex.zip delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/index/moreterms.6.0.0.zip delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/index/sorted.6.2.0.zip delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/index/sorted.6.2.1.zip delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/index/sorted.6.3.0.zip delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.630.brokenoffsets.zip delete mode 100644 lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.single-empty-doc.630.zip diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene60/Lucene60Codec.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene60/Lucene60Codec.java deleted file mode 100644 index f9b8671fcb63..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene60/Lucene60Codec.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene60; - -import java.util.Objects; - -import org.apache.lucene.codecs.Codec; -import org.apache.lucene.codecs.CompoundFormat; -import org.apache.lucene.codecs.DocValuesFormat; -import org.apache.lucene.codecs.FieldInfosFormat; -import org.apache.lucene.codecs.FilterCodec; -import org.apache.lucene.codecs.LiveDocsFormat; -import org.apache.lucene.codecs.NormsFormat; -import org.apache.lucene.codecs.PointsFormat; -import org.apache.lucene.codecs.PostingsFormat; -import org.apache.lucene.codecs.SegmentInfoFormat; -import org.apache.lucene.codecs.StoredFieldsFormat; -import org.apache.lucene.codecs.TermVectorsFormat; -import org.apache.lucene.codecs.lucene50.Lucene50CompoundFormat; -import org.apache.lucene.codecs.lucene50.Lucene50LiveDocsFormat; -import org.apache.lucene.codecs.lucene50.Lucene50SegmentInfoFormat; -import org.apache.lucene.codecs.lucene50.Lucene50StoredFieldsFormat.Mode; -import org.apache.lucene.codecs.lucene50.Lucene50StoredFieldsFormat; -import org.apache.lucene.codecs.lucene50.Lucene50TermVectorsFormat; -import org.apache.lucene.codecs.lucene53.Lucene53NormsFormat; -import org.apache.lucene.codecs.perfield.PerFieldDocValuesFormat; -import org.apache.lucene.codecs.perfield.PerFieldPostingsFormat; - -/** - * Implements the Lucene 6.0 index format, with configurable per-field postings - * and docvalues formats. - *

- * If you want to reuse functionality of this codec in another codec, extend - * {@link FilterCodec}. - * - * @see org.apache.lucene.codecs.lucene60 package documentation for file format details. - * - * @lucene.experimental - * @deprecated Only for 6.0 back compat - */ -@Deprecated -public class Lucene60Codec extends Codec { - private final TermVectorsFormat vectorsFormat = new Lucene50TermVectorsFormat(); - private final FieldInfosFormat fieldInfosFormat = new Lucene60FieldInfosFormat(); - private final SegmentInfoFormat segmentInfosFormat = new Lucene50SegmentInfoFormat(); - private final LiveDocsFormat liveDocsFormat = new Lucene50LiveDocsFormat(); - private final CompoundFormat compoundFormat = new Lucene50CompoundFormat(); - - private final PostingsFormat postingsFormat = new PerFieldPostingsFormat() { - @Override - public PostingsFormat getPostingsFormatForField(String field) { - return Lucene60Codec.this.getPostingsFormatForField(field); - } - }; - - private final DocValuesFormat docValuesFormat = new PerFieldDocValuesFormat() { - @Override - public DocValuesFormat getDocValuesFormatForField(String field) { - return Lucene60Codec.this.getDocValuesFormatForField(field); - } - }; - - private final StoredFieldsFormat storedFieldsFormat; - - /** - * Instantiates a new codec. - */ - public Lucene60Codec() { - this(Mode.BEST_SPEED); - } - - /** - * Instantiates a new codec, specifying the stored fields compression - * mode to use. - * @param mode stored fields compression mode to use for newly - * flushed/merged segments. - */ - public Lucene60Codec(Mode mode) { - super("Lucene60"); - this.storedFieldsFormat = new Lucene50StoredFieldsFormat(Objects.requireNonNull(mode)); - } - - @Override - public final StoredFieldsFormat storedFieldsFormat() { - return storedFieldsFormat; - } - - @Override - public final TermVectorsFormat termVectorsFormat() { - return vectorsFormat; - } - - @Override - public final PostingsFormat postingsFormat() { - return postingsFormat; - } - - @Override - public final FieldInfosFormat fieldInfosFormat() { - return fieldInfosFormat; - } - - @Override - public SegmentInfoFormat segmentInfoFormat() { - return segmentInfosFormat; - } - - @Override - public final LiveDocsFormat liveDocsFormat() { - return liveDocsFormat; - } - - @Override - public final CompoundFormat compoundFormat() { - return compoundFormat; - } - - @Override - public final PointsFormat pointsFormat() { - return new Lucene60PointsFormat(); - } - - /** Returns the postings format that should be used for writing - * new segments of field. - * - * The default implementation always returns "Lucene50". - *

- * WARNING: if you subclass, you are responsible for index - * backwards compatibility: future version of Lucene are only - * guaranteed to be able to read the default implementation. - */ - public PostingsFormat getPostingsFormatForField(String field) { - return defaultFormat; - } - - /** Returns the docvalues format that should be used for writing - * new segments of field. - * - * The default implementation always returns "Lucene54". - *

- * WARNING: if you subclass, you are responsible for index - * backwards compatibility: future version of Lucene are only - * guaranteed to be able to read the default implementation. - */ - public DocValuesFormat getDocValuesFormatForField(String field) { - return defaultDVFormat; - } - - @Override - public final DocValuesFormat docValuesFormat() { - return docValuesFormat; - } - - private final PostingsFormat defaultFormat = PostingsFormat.forName("Lucene50"); - private final DocValuesFormat defaultDVFormat = DocValuesFormat.forName("Lucene54"); - - private final NormsFormat normsFormat = new Lucene53NormsFormat(); - - @Override - public NormsFormat normsFormat() { - return normsFormat; - } -} diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene60/package.html b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene60/package.html deleted file mode 100644 index 6b4e234826dc..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene60/package.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - -Lucene 6.0 file format. - - diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene62/Lucene62Codec.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene62/Lucene62Codec.java deleted file mode 100644 index 3dd7daa3aa04..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene62/Lucene62Codec.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene62; - -import java.util.Objects; - -import org.apache.lucene.codecs.Codec; -import org.apache.lucene.codecs.CompoundFormat; -import org.apache.lucene.codecs.DocValuesFormat; -import org.apache.lucene.codecs.FieldInfosFormat; -import org.apache.lucene.codecs.FilterCodec; -import org.apache.lucene.codecs.LiveDocsFormat; -import org.apache.lucene.codecs.NormsFormat; -import org.apache.lucene.codecs.PointsFormat; -import org.apache.lucene.codecs.PostingsFormat; -import org.apache.lucene.codecs.SegmentInfoFormat; -import org.apache.lucene.codecs.StoredFieldsFormat; -import org.apache.lucene.codecs.TermVectorsFormat; -import org.apache.lucene.codecs.lucene50.Lucene50CompoundFormat; -import org.apache.lucene.codecs.lucene50.Lucene50LiveDocsFormat; -import org.apache.lucene.codecs.lucene50.Lucene50StoredFieldsFormat; -import org.apache.lucene.codecs.lucene50.Lucene50TermVectorsFormat; -import org.apache.lucene.codecs.lucene50.Lucene50StoredFieldsFormat.Mode; -import org.apache.lucene.codecs.lucene53.Lucene53NormsFormat; -import org.apache.lucene.codecs.lucene60.Lucene60FieldInfosFormat; -import org.apache.lucene.codecs.lucene60.Lucene60PointsFormat; -import org.apache.lucene.codecs.perfield.PerFieldDocValuesFormat; -import org.apache.lucene.codecs.perfield.PerFieldPostingsFormat; - -/** - * Implements the Lucene 6.2 index format, with configurable per-field postings - * and docvalues formats. - *

- * If you want to reuse functionality of this codec in another codec, extend - * {@link FilterCodec}. - * - * @see org.apache.lucene.codecs.lucene60 package documentation for file format details. - * - * @lucene.experimental - */ -public class Lucene62Codec extends Codec { - private final TermVectorsFormat vectorsFormat = new Lucene50TermVectorsFormat(); - private final FieldInfosFormat fieldInfosFormat = new Lucene60FieldInfosFormat(); - private final SegmentInfoFormat segmentInfosFormat = new Lucene62SegmentInfoFormat(); - private final LiveDocsFormat liveDocsFormat = new Lucene50LiveDocsFormat(); - private final CompoundFormat compoundFormat = new Lucene50CompoundFormat(); - - private final PostingsFormat postingsFormat = new PerFieldPostingsFormat() { - @Override - public PostingsFormat getPostingsFormatForField(String field) { - return Lucene62Codec.this.getPostingsFormatForField(field); - } - }; - - private final DocValuesFormat docValuesFormat = new PerFieldDocValuesFormat() { - @Override - public DocValuesFormat getDocValuesFormatForField(String field) { - return Lucene62Codec.this.getDocValuesFormatForField(field); - } - }; - - private final StoredFieldsFormat storedFieldsFormat; - - /** - * Instantiates a new codec. - */ - public Lucene62Codec() { - this(Mode.BEST_SPEED); - } - - /** - * Instantiates a new codec, specifying the stored fields compression - * mode to use. - * @param mode stored fields compression mode to use for newly - * flushed/merged segments. - */ - public Lucene62Codec(Mode mode) { - super("Lucene62"); - this.storedFieldsFormat = new Lucene50StoredFieldsFormat(Objects.requireNonNull(mode)); - } - - @Override - public final StoredFieldsFormat storedFieldsFormat() { - return storedFieldsFormat; - } - - @Override - public final TermVectorsFormat termVectorsFormat() { - return vectorsFormat; - } - - @Override - public final PostingsFormat postingsFormat() { - return postingsFormat; - } - - @Override - public final FieldInfosFormat fieldInfosFormat() { - return fieldInfosFormat; - } - - @Override - public SegmentInfoFormat segmentInfoFormat() { - return segmentInfosFormat; - } - - @Override - public final LiveDocsFormat liveDocsFormat() { - return liveDocsFormat; - } - - @Override - public final CompoundFormat compoundFormat() { - return compoundFormat; - } - - @Override - public final PointsFormat pointsFormat() { - return new Lucene60PointsFormat(); - } - - /** Returns the postings format that should be used for writing - * new segments of field. - * - * The default implementation always returns "Lucene50". - *

- * WARNING: if you subclass, you are responsible for index - * backwards compatibility: future version of Lucene are only - * guaranteed to be able to read the default implementation. - */ - public PostingsFormat getPostingsFormatForField(String field) { - return defaultFormat; - } - - /** Returns the docvalues format that should be used for writing - * new segments of field. - * - * The default implementation always returns "Lucene54". - *

- * WARNING: if you subclass, you are responsible for index - * backwards compatibility: future version of Lucene are only - * guaranteed to be able to read the default implementation. - */ - public DocValuesFormat getDocValuesFormatForField(String field) { - return defaultDVFormat; - } - - @Override - public final DocValuesFormat docValuesFormat() { - return docValuesFormat; - } - - private final PostingsFormat defaultFormat = PostingsFormat.forName("Lucene50"); - private final DocValuesFormat defaultDVFormat = DocValuesFormat.forName("Lucene54"); - - private final NormsFormat normsFormat = new Lucene53NormsFormat(); - - @Override - public NormsFormat normsFormat() { - return normsFormat; - } -} diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene62/package.html b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene62/package.html deleted file mode 100644 index 74e66d93bc6d..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene62/package.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - -Lucene 6.2 file format. - - diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/index/package.html b/lucene/backward-codecs/src/java/org/apache/lucene/index/package.html deleted file mode 100644 index 42ff91af6139..000000000000 --- a/lucene/backward-codecs/src/java/org/apache/lucene/index/package.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - Tools for handling backwards compatibility issues with indices. - - -Tools for handling backwards compatibility issues with indices. - - diff --git a/lucene/backward-codecs/src/resources/META-INF/services/org.apache.lucene.codecs.Codec b/lucene/backward-codecs/src/resources/META-INF/services/org.apache.lucene.codecs.Codec index 6954d7a641c9..4a812de77e5b 100644 --- a/lucene/backward-codecs/src/resources/META-INF/services/org.apache.lucene.codecs.Codec +++ b/lucene/backward-codecs/src/resources/META-INF/services/org.apache.lucene.codecs.Codec @@ -13,5 +13,3 @@ # See the License for the specific language governing permissions and # limitations under the License. -org.apache.lucene.codecs.lucene60.Lucene60Codec -org.apache.lucene.codecs.lucene62.Lucene62Codec diff --git a/lucene/backward-codecs/src/resources/META-INF/services/org.apache.lucene.codecs.DocValuesFormat b/lucene/backward-codecs/src/resources/META-INF/services/org.apache.lucene.codecs.DocValuesFormat index 26984efd4090..4a812de77e5b 100644 --- a/lucene/backward-codecs/src/resources/META-INF/services/org.apache.lucene.codecs.DocValuesFormat +++ b/lucene/backward-codecs/src/resources/META-INF/services/org.apache.lucene.codecs.DocValuesFormat @@ -13,4 +13,3 @@ # See the License for the specific language governing permissions and # limitations under the License. -org.apache.lucene.codecs.lucene54.Lucene54DocValuesFormat diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene60/Lucene60RWCodec.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene60/Lucene60RWCodec.java deleted file mode 100644 index eecfe09fa0a2..000000000000 --- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene60/Lucene60RWCodec.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene60; - -import org.apache.lucene.codecs.NormsFormat; -import org.apache.lucene.codecs.SegmentInfoFormat; -import org.apache.lucene.codecs.lucene50.Lucene50RWSegmentInfoFormat; -import org.apache.lucene.codecs.lucene53.Lucene53RWNormsFormat; - -public class Lucene60RWCodec extends Lucene60Codec { - - private final SegmentInfoFormat segmentInfoFormat = new Lucene50RWSegmentInfoFormat(); - private final NormsFormat normsFormat = new Lucene53RWNormsFormat(); - - @Override - public SegmentInfoFormat segmentInfoFormat() { - return segmentInfoFormat; - } - - @Override - public NormsFormat normsFormat() { - return normsFormat; - } -} diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/Lucene62RWCodec.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/Lucene62RWCodec.java deleted file mode 100644 index 34d3a7f0eae8..000000000000 --- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/Lucene62RWCodec.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene62; - -import org.apache.lucene.codecs.NormsFormat; -import org.apache.lucene.codecs.SegmentInfoFormat; -import org.apache.lucene.codecs.lucene53.Lucene53RWNormsFormat; -import org.apache.lucene.codecs.lucene62.Lucene62Codec; - -/** - * Read-write version of 6.2 codec for testing - * @deprecated for test purposes only - */ -@Deprecated -public class Lucene62RWCodec extends Lucene62Codec { - - private final SegmentInfoFormat segmentInfoFormat = new Lucene62RWSegmentInfoFormat(); - private final NormsFormat normsFormat = new Lucene53RWNormsFormat(); - - @Override - public SegmentInfoFormat segmentInfoFormat() { - return segmentInfoFormat; - } - - @Override - public NormsFormat normsFormat() { - return normsFormat; - } - -} diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/Lucene62RWSegmentInfoFormat.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/Lucene62RWSegmentInfoFormat.java deleted file mode 100644 index f2fbe9d70b96..000000000000 --- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/Lucene62RWSegmentInfoFormat.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.lucene.codecs.lucene62; - -import java.io.IOException; -import java.util.Set; - -import org.apache.lucene.codecs.CodecUtil; -import org.apache.lucene.index.IndexFileNames; -import org.apache.lucene.index.SegmentInfo; -import org.apache.lucene.search.Sort; -import org.apache.lucene.search.SortField; -import org.apache.lucene.search.SortedNumericSelector; -import org.apache.lucene.search.SortedNumericSortField; -import org.apache.lucene.search.SortedSetSelector; -import org.apache.lucene.search.SortedSetSortField; -import org.apache.lucene.store.Directory; -import org.apache.lucene.store.IOContext; -import org.apache.lucene.store.IndexOutput; -import org.apache.lucene.util.Version; - -/** - * Read-write version of 6.2 SegmentInfoFormat for testing - * @deprecated for test purposes only - */ -@Deprecated -public class Lucene62RWSegmentInfoFormat extends Lucene62SegmentInfoFormat { - - @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 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); - } - } - -} diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/TestLucene62SegmentInfoFormat.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/TestLucene62SegmentInfoFormat.java deleted file mode 100644 index e0efa9521a34..000000000000 --- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene62/TestLucene62SegmentInfoFormat.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.lucene.codecs.lucene62; - -import org.apache.lucene.codecs.Codec; -import org.apache.lucene.index.BaseSegmentInfoFormatTestCase; -import org.apache.lucene.util.Version; - -/** - * Tests Lucene62SegmentInfoFormat - */ -public class TestLucene62SegmentInfoFormat extends BaseSegmentInfoFormatTestCase { - - @Override - protected int getCreatedVersionMajor() { - return Version.LUCENE_6_2_0.major; - } - - @Override - protected Version[] getVersions() { - return new Version[] { Version.LUCENE_6_2_0 }; - } - - @Override - protected Codec getCodec() { - return new Lucene62RWCodec(); - } - - @Override - protected boolean supportsMinVersion() { - return false; - } -} diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java b/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java index ad50382120de..22b0ab6c7261 100644 --- a/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java +++ b/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java @@ -1436,9 +1436,10 @@ public void testUpgradeOldSingleSegmentIndexWithAdditions() throws Exception { } } - public static final String emptyIndex = "empty.6.0.0.zip"; + public static final String emptyIndex = "empty.7.0.0.zip"; public void testUpgradeEmptyOldIndex() throws Exception { + assumeTrue("Reenable when 7.0 is released", false); Path oldIndexDir = createTempDir("emptyIndex"); TestUtil.unzip(getDataInputStream(emptyIndex), oldIndexDir); Directory dir = newFSDirectory(oldIndexDir); @@ -1450,9 +1451,10 @@ public void testUpgradeEmptyOldIndex() throws Exception { dir.close(); } - public static final String moreTermsIndex = "moreterms.6.0.0.zip"; + public static final String moreTermsIndex = "moreterms.7.0.0.zip"; public void testMoreTerms() throws Exception { + assumeTrue("Reenable when 7.0 is released", false); Path oldIndexDir = createTempDir("moreterms"); TestUtil.unzip(getDataInputStream(moreTermsIndex), oldIndexDir); Directory dir = newFSDirectory(oldIndexDir); @@ -1462,7 +1464,7 @@ public void testMoreTerms() throws Exception { dir.close(); } - public static final String dvUpdatesIndex = "dvupdates.6.0.0.zip"; + public static final String dvUpdatesIndex = "dvupdates.7.0.0.zip"; private void assertNumericDocValues(LeafReader r, String f, String cf) throws IOException { NumericDocValues ndvf = r.getNumericDocValues(f); @@ -1497,6 +1499,7 @@ private void verifyDocValues(Directory dir) throws IOException { } public void testDocValuesUpdates() throws Exception { + assumeTrue("Reenable when 7.0 is released", false); Path oldIndexDir = createTempDir("dvupdates"); TestUtil.unzip(getDataInputStream(dvUpdatesIndex), oldIndexDir); Directory dir = newFSDirectory(oldIndexDir); @@ -1559,7 +1562,8 @@ public void testUpgradeThenMultipleCommits() throws Exception { } public void testSortedIndex() throws Exception { - String[] versions = new String[] {"6.2.0", "6.2.1", "6.3.0"}; + assumeTrue("Reenable when 7.0 is released", false); + String[] versions = new String[] {}; for(String version : versions) { Path path = createTempDir("sorted"); InputStream resource = TestBackwardsCompatibility.class.getResourceAsStream("sorted." + version + ".zip"); diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/TestIndexWriterOnOldIndex.java b/lucene/backward-codecs/src/test/org/apache/lucene/index/TestIndexWriterOnOldIndex.java index b48b0fd44e2b..db33fb3a8f8b 100644 --- a/lucene/backward-codecs/src/test/org/apache/lucene/index/TestIndexWriterOnOldIndex.java +++ b/lucene/backward-codecs/src/test/org/apache/lucene/index/TestIndexWriterOnOldIndex.java @@ -29,14 +29,15 @@ public class TestIndexWriterOnOldIndex extends LuceneTestCase { public void testOpenModeAndCreatedVersion() throws IOException { - InputStream resource = getClass().getResourceAsStream("unsupported.index.single-empty-doc.630.zip"); + assumeTrue("Reenable when 7.0 is released", false); + InputStream resource = getClass().getResourceAsStream("unsupported.index.single-empty-doc.7.0.0.zip"); assertNotNull(resource); Path path = createTempDir(); TestUtil.unzip(resource, path); Directory dir = newFSDirectory(path); for (OpenMode openMode : OpenMode.values()) { Directory tmpDir = newDirectory(dir); - assertEquals(6 /** 6.3.0 */, SegmentInfos.readLatestCommit(tmpDir).getIndexCreatedVersionMajor()); + assertEquals(7 /** 7.0.0 */, SegmentInfos.readLatestCommit(tmpDir).getIndexCreatedVersionMajor()); IndexWriter w = new IndexWriter(tmpDir, newIndexWriterConfig().setOpenMode(openMode)); w.commit(); w.close(); @@ -45,7 +46,7 @@ public void testOpenModeAndCreatedVersion() throws IOException { assertEquals(Version.LATEST.major, SegmentInfos.readLatestCommit(tmpDir).getIndexCreatedVersionMajor()); break; default: - assertEquals(6 /** 6.3.0 */, SegmentInfos.readLatestCommit(tmpDir).getIndexCreatedVersionMajor()); + assertEquals(7 /** 7.0.0 */, SegmentInfos.readLatestCommit(tmpDir).getIndexCreatedVersionMajor()); } tmpDir.close(); } diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/TestManyPointsInOldIndex.java b/lucene/backward-codecs/src/test/org/apache/lucene/index/TestManyPointsInOldIndex.java index 043979b5c27e..c567bec9d543 100644 --- a/lucene/backward-codecs/src/test/org/apache/lucene/index/TestManyPointsInOldIndex.java +++ b/lucene/backward-codecs/src/test/org/apache/lucene/index/TestManyPointsInOldIndex.java @@ -59,6 +59,7 @@ public static void main(String[] args) throws IOException { } public void testCheckOldIndex() throws IOException { + assumeTrue("Reenable when 7.0 is released", false); Path path = createTempDir("manypointsindex"); InputStream resource = getClass().getResourceAsStream("manypointsindex.zip"); assertNotNull("manypointsindex not found", resource); diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/dvupdates.6.0.0.zip b/lucene/backward-codecs/src/test/org/apache/lucene/index/dvupdates.6.0.0.zip deleted file mode 100644 index 38ac8e11cf179789f80cf7ff7f3e39ded5cb1d57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3420 zcma)9dpOkj9{$Y@b0H!-$|Z+tQag=Hq?CJ!!5CIEW1cZ&hQUZ!Y|0u^)R4tq1iSs-V1V%kzxjek1<(fqE%EG-xNrQB04$+r(4PmMZxhh~1pW{P01J;xO{Y!p zW4;opL>L~fNzV%uNJb0Al6>+^A%#AgN6EX^+}xZvI?TQ+?s#RNEv-RkvFl%m%gT7U znJvd4aID^nFk*5GfY^Y2a|-}S3Up8_T4ueJ=_G!U&h)3~h=qBymL>V{GPQ8sOhh{- zTh(fP6Eg*xq-sl5VzYyHc)AH>a|FEmVsWClUt}}>jtzT6R+dq*urRO(fNwa>jW4Fw zydAstb7ODVF^>|xZDI>wtO%?3#u<_y=@70(@pec)xR=d1bRi(wCn`9Tv05~mf{h4I z@t_{$&}eK#1q9~7a2Fe!z+fi#Lu^I5!uj#qc4@!g%`MloZ}+pJSX&8!1boPW{a>ua)S@mqf%H7FkfF~IQ1fWxc_m8~ zq=9*EOkJd-BNk98!$Y>)8tT7Gd^v}Jryq57>1bbPT6u;Q@?iXZ^X$;*iH0fhwdM;$ zUx8eSkfr#>aXzcuk?iwcuprI!Tf_$ZpD`Or6m)j+a1xZ$>dJEvtaWpUe3RqpQ8a@u ze4>Ffz156ftI5>F+NF+|yA`TL+MC;&{5$`4V#M8Z_x>BzAI|Qy@{G@YT(uXHQnKsO zpHa`V9(PTiuh9NiGF4TWIfebzHntb{&sT51AG&d}F7~uhC@1J5W6xB@sqZ}l5?nNp zC)>yj)F0yszHnT8pHFqR@WY@(TX7AzZ>^;Fm~0sHz2%m+qS2z z729df+e-{uZCM?xi+(_XR-{5O!D?;T7F;-`ePy9f7s?-L-Lx|B*V~|2$KcBn(TM5>eLYVBa@!!5$ zS&*Y*R$U!2B_VKcmam$Ql-kWZm9OlNIe{HYJZd`bSBL3ILAj9IOQS~ITjJ6>k-H6c z!c4R+(VKF$`76m5F(`Mla13#Cq(0s5Fx080tZb9BvolO>JK~{6C%zNOzm1(F;DhNc z_1RkIld$PT`fVp?x-=_Gpo4I1NpRTz46TAo42&^FDOFTwOh}joWsiU=`{!LnKkJ`` zwXo>-|5vn#mM8jTRYAXF^|0XlgTX1?j(Qk<()JUXJfx?OK)M-b#!T(sOp>VI(8S|z zz$#ys)&TjpXyAeb$Q}a&fQM=z3vh4GfA2 z)>gfG!$TKD*RFN)I$U;#IhY?ZCeqKq(XNyi=AEflPh}Gmx;~#uZpA1SP~{&}M`>U? zz5oy6-7<~ke69^yxmUf~2s-K7E~wX#0o_b>EHzwO<;iq{l96ZU-O|rGhXh}Scf_+c ze6xX(nmNhbgTd5Ze4>(3oUVS~YGcNsCk40qUO&ox{7XQ+KeuaF&>7^8Gv3IP*_2Ze zk}CVAU#}#@{53uGV50o|)nqfz>zt<0*H^5%D*H4jc4mwUW2kd0;j02)-h57^VYK-O z)D;q1IiO44sq0w_D-CTc$aJ?f2|NH@Gl-uaj1jqXW7XE;d%e7#QRdp+m>uI$#`dF5mrDHdxylkUdNG(OnowQG`EdVJ3@GYec&p)fhLEe%-l)CiHi>d{+Y9UI5m zy)Auwdr=wr$o@vFRmCIz4o;f`=p-FTxB14IE5)%t#!fUIKNWDle2k!uiOWdHyTep11|2kqdm0N{V~fR_sZ diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/empty.6.0.0.zip b/lucene/backward-codecs/src/test/org/apache/lucene/index/empty.6.0.0.zip deleted file mode 100644 index 8ca64d39c401e9ad00f95d376077b75c848fa858..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 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 diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/maxposindex.zip b/lucene/backward-codecs/src/test/org/apache/lucene/index/maxposindex.zip deleted file mode 100644 index aaabb5697307bf8fd9df63189415d798404f8260..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1702 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�Ya2Nk>*_|E~@^8PRR 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 diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/sorted.6.3.0.zip b/lucene/backward-codecs/src/test/org/apache/lucene/index/sorted.6.3.0.zip deleted file mode 100644 index 6d89d781ef29075d6140702e5dd2c80e3c15a5f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71090 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%0AMQVRa#{c5++KXrOqTsm8S9hX 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%0A#8UB9^AIo}`T@w)5J{lsW#h5nE5PzBV_1fk>vr z_;_R;e&2?3?!Z@e`6KJ|M>YfcEpSU_;VVrWwL94G6ON^{D9_kWw02+Cp7k8p8sYf& zk(pkHejt-Bjl>_%4EGZS`8Jug&;i`TQInF}>76Vws;9-P3$a@D_9ykoyY>|7tAc4b zgXPRZ7u0{DFi@-_%@M#^boiB%z`dr#bbZr>)u?S#)2;2jX$lf*@g!b0d}!APvGDLS z2nLa;viKNG$XTW%%Jyr$wbhN)vj{V=i~9%HxPCze>c4g}yX-E(F(JNlgg?hpvr-r0 z9_2+g1kuXGE5*~;NRNtJq zkjFK@?{&H|RHN(Sh}E4c2tqJ2&<}D^Yt`KuC zGpwig%~ihX+MRvh+MywEfyCNTdzYxN;fMr4Ollu7genbrpPFQoZBM`BO@l6>41JEL)V;kG(+kxD^ZBp6xxuk3*jPW*nmq`W(|s%UeRGQ;OzNy zv4*ffcw4u<2HT~UC~*1cRA|H59VkZR@%RqEMN}5xl10e>XrVe#v9(*(D_-e0qd4po z;)t^clb)Y*2&)G9ujKcejOawRyn!1$>sK{3Gi#|cxbs|MHGkgIP`wz^z`48cRS73*$A2k*oFpLF+EEY zn$Bi?^TZB8Ey;{`up`R#&AS06-|Ffl{~xR`lki^QkgOIJN2@d(ue3C4In?h^`jv>y zyUbcQ-m93`9|fFPvfLWpB^E3`kD(x-S?fu5td4oyN$KBxw9s8JD)Dw7_pa8a4{w>0 zVQncUs_RXr$630sfY0!~*23{A1KZsVI7x2xQ!_6Mt$(<|Awf8}DDZgJCw@zOeR8vt zR{!Lr(BiD;C>ZP4l27k!^;s~OG1&iH)&g{kw})g}Ti5*1b|DS1JZU>6JJR*JvDEBs?F8I{D z=ow7UHBFsYC$~^eeA=Pi3-44VDOrw+WRs=2zCTO4@09texmgPnjI-MF+;@&#d$9~G zAL7r?2{yh+;@?hhmXbu~ER0@wolM)jfo?5!UyzSBJ#|#qy0MwQc?lJp<~^457!1jf z@n)^Te&4n*8q|X$Q7~redD-U+SxRL~xhk(F>XKX%Kp_;~D_E1=3qScZFR@y{xZJvW z)5g|Z-WPF%<#RY|?jvUH**s$HedXT$G{ki7@|}d9L*qeTvzBe+J-u(mboH50v$5zN z-HFi}_1bdxxyFgf)SFqyKL0!Y9|?i`!)7FQRSxS@_woa%KqBcw=sb10UVo`Y_|fIB z{itxC)es*&wO_4=$aS`Re+>vK8Yut(zyfRU74|U)>s~r0U>&?iv@O z=ATAXrlOd+Z|MT*yK=wNig}-|J=Qp8@&v*5UMjsj6>Dx2Yi=2{E*DY3inb{@n4--6 z(im2-Fz%k#D(CpBd^xl&di{LSs0?J386T%VUt;fM6Wu9nphNE*A+53=5Sb2xE6Wj# zHl(=1b^F&1&2S6pt+3SK&*1oW8v?f;9QFj(4ekVsrR=yDM^M@ol!5_7$^@jjUIj{| z_sQuaBmmv3f)7{J8f+24toOtyW@hG9*=+4bIK%XyHFBTMJg1(|Oui~2)gFz|$*>GM??6I;u6nX(C z0eYht_aoi(1Q_q8@GEkDKA+-CQdF1h@s5sJI=dqHy9G5t95?z8hJ-y7&VvQ6R&VUB z9Nb)A@&79ys@gJ`Mm0Zw%1Ha9uQlA>-cD{<%k#beqrG~f-|=2TI=^_ob${>d7CTvI?LYOkrP@kJ@KiBT@IVK&2^v5P*L-pm*ajpT$fDQ5!now=|pwA%H*A z@#pZL?YA@!7aKP#9y>=1*q_o$AL8-5{wX3F5FiR2>i=Y{YB;KC|AEr>kTDDZ#eYMq z;lIa+#96$y($zu#kI4N$tUq#VL?MJg0Q4j9pIBTE^gmgy|1RtA+5fAqIwIhI-GqNn x*55t+D@v3E_%}!Y74QFA{9k#<2i{+8c;Nl77NBGNUM~8>33^xzCFw&0`~!Y6K4<^{ diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.630.brokenoffsets.zip b/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.630.brokenoffsets.zip deleted file mode 100644 index 3cf476a07d5a39f253f52c85b5f2512b698ed06d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3203 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 AzyJUM diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.single-empty-doc.630.zip b/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.single-empty-doc.630.zip deleted file mode 100644 index 1bf1d08ba2499fac9bfeae22492311f25cc236b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1363 zcmWIWW@Zs#U|`^2NNWi5Qt7#o8x7<&0x=td3`4wuUUFJ$Xb2|*v;K;;5lKK?TEWf0 z$nt`jfdNcx-ak)S?_Kb$IkTo`Wj&ZPKYBv^tm%(tg$GTU8Fhw%WwnZ^)=~bOwja80 z&3`a|V-|%Pn)E#7C-4{2j+tKaR10$hV0zSghQW7&IW;g`( zoM3x4?UOI7qy~%Og)I}pF8z^L(eW7HI&zRSLwc zkWeqqB#Ap>zUAk`NtQf+)!W&>HuOcU@#Y_ zrst;Sl@!Mt5(?{cfsil`I&-T+qPUA?YZg zaYQ8lK*zFc6Av#pu{71cdgg__NQ22=cV>abe86laUa{-;f0M2z_29y9f zth^|*BvmgbKRFwp!vee+ndF#p7o(enn%R)e0%bvPsQ}D+ z#F>Sfx{=K)1EzPNS)jB|oKdJTh-}ndCI*!F#AhC^fJZj33|PJ)M*}YNSlK{<%L;_e MK+o&~>SAC30OWqVuK)l5 From bc9c4144dfbe209d8982f786f6265c9f8d0167fb Mon Sep 17 00:00:00 2001 From: Adrien Grand Date: Mon, 3 Jul 2017 14:17:09 +0200 Subject: [PATCH 7/7] Remove unnecessary backward compatibility. --- .../org/apache/lucene/index/CheckIndex.java | 47 +++++++++---------- .../org/apache/lucene/index/IndexWriter.java | 6 +-- .../org/apache/lucene/index/SegmentInfos.java | 2 +- .../search/similarities/BM25Similarity.java | 38 ++++----------- .../search/similarities/SimilarityBase.java | 25 ++-------- .../search/similarities/TFIDFSimilarity.java | 25 ++-------- .../java/org/apache/lucene/util/Version.java | 13 ----- .../similarities/TestBM25Similarity.java | 16 ------- .../similarities/TestClassicSimilarity.java | 33 +------------ .../similarities/TestSimilarityBase.java | 10 ---- .../java/org/apache/lucene/util/TestUtil.java | 4 +- .../solr/schema/FieldTypePluginLoader.java | 6 +-- .../org/apache/solr/schema/IndexSchema.java | 4 +- .../solr/schema/IndexSchemaFactory.java | 9 +--- .../similarities/SchemaSimilarityFactory.java | 4 +- .../configsets/_default/conf/solrconfig.xml | 2 +- .../TestNonDefinedSimilarityFactory.java | 10 ---- 17 files changed, 54 insertions(+), 200 deletions(-) diff --git a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java index e448d8199e69..e605e981e828 100644 --- a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java +++ b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java @@ -744,13 +744,13 @@ public Status checkIndex(List onlySegments) throws IOException { segInfoStat.fieldNormStatus = testFieldNorms(reader, infoStream, failFast); // Test the Term Index - segInfoStat.termIndexStatus = testPostings(reader, infoStream, verbose, failFast, version); + segInfoStat.termIndexStatus = testPostings(reader, infoStream, verbose, failFast); // Test Stored Fields segInfoStat.storedFieldStatus = testStoredFields(reader, infoStream, failFast); // Test Term Vectors - segInfoStat.termVectorStatus = testTermVectors(reader, infoStream, verbose, crossCheckTermVectors, failFast, version); + segInfoStat.termVectorStatus = testTermVectors(reader, infoStream, verbose, crossCheckTermVectors, failFast); // Test Docvalues segInfoStat.docValuesStatus = testDocValues(reader, infoStream, failFast); @@ -1209,7 +1209,7 @@ private static void checkTermRanges(String field, int maxDoc, Terms terms, long * checks Fields api is consistent with itself. * searcher is optional, to verify with queries. Can be null. */ - private static Status.TermIndexStatus checkFields(Fields fields, Bits liveDocs, int maxDoc, FieldInfos fieldInfos, boolean doPrint, boolean isVectors, PrintStream infoStream, boolean verbose, Version version) throws IOException { + private static Status.TermIndexStatus checkFields(Fields fields, Bits liveDocs, int maxDoc, FieldInfos fieldInfos, boolean doPrint, boolean isVectors, PrintStream infoStream, boolean verbose) throws IOException { // TODO: we should probably return our own stats thing...?! long startNS; if (doPrint) { @@ -1465,20 +1465,17 @@ private static Status.TermIndexStatus checkFields(Fields fields, Bits liveDocs, if (hasOffsets) { int startOffset = postings.startOffset(); int endOffset = postings.endOffset(); - // In Lucene 7 we fixed IndexWriter to also enforce term vector offsets - if (isVectors == false || version.onOrAfter(Version.LUCENE_7_0_0)) { - if (startOffset < 0) { - throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": startOffset " + startOffset + " is out of bounds"); - } - if (startOffset < lastOffset) { - throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": startOffset " + startOffset + " < lastStartOffset " + lastOffset + "; consider using the FixBrokenOffsets tool in Lucene's backward-codecs module to correct your index"); - } - if (endOffset < 0) { - throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": endOffset " + endOffset + " is out of bounds"); - } - if (endOffset < startOffset) { - throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": endOffset " + endOffset + " < startOffset " + startOffset); - } + if (startOffset < 0) { + throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": startOffset " + startOffset + " is out of bounds"); + } + if (startOffset < lastOffset) { + throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": startOffset " + startOffset + " < lastStartOffset " + lastOffset + "; consider using the FixBrokenOffsets tool in Lucene's backward-codecs module to correct your index"); + } + if (endOffset < 0) { + throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": endOffset " + endOffset + " is out of bounds"); + } + if (endOffset < startOffset) { + throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + ": endOffset " + endOffset + " < startOffset " + startOffset); } lastOffset = startOffset; } @@ -1745,15 +1742,15 @@ private static Status.TermIndexStatus checkFields(Fields fields, Bits liveDocs, * Test the term index. * @lucene.experimental */ - public static Status.TermIndexStatus testPostings(CodecReader reader, PrintStream infoStream, Version version) throws IOException { - return testPostings(reader, infoStream, false, false, version); + public static Status.TermIndexStatus testPostings(CodecReader reader, PrintStream infoStream) throws IOException { + return testPostings(reader, infoStream, false, false); } /** * Test the term index. * @lucene.experimental */ - public static Status.TermIndexStatus testPostings(CodecReader reader, PrintStream infoStream, boolean verbose, boolean failFast, Version version) throws IOException { + public static Status.TermIndexStatus testPostings(CodecReader reader, PrintStream infoStream, boolean verbose, boolean failFast) throws IOException { // TODO: we should go and verify term vectors match, if // crossCheckTermVectors is on... @@ -1768,7 +1765,7 @@ public static Status.TermIndexStatus testPostings(CodecReader reader, PrintStrea final Fields fields = reader.getPostingsReader().getMergeInstance(); final FieldInfos fieldInfos = reader.getFieldInfos(); - status = checkFields(fields, reader.getLiveDocs(), maxDoc, fieldInfos, true, false, infoStream, verbose, version); + status = checkFields(fields, reader.getLiveDocs(), maxDoc, fieldInfos, true, false, infoStream, verbose); } catch (Throwable e) { if (failFast) { throw IOUtils.rethrowAlways(e); @@ -2377,15 +2374,15 @@ private static void checkDocValues(FieldInfo fi, DocValuesProducer dvReader, int * Test term vectors. * @lucene.experimental */ - public static Status.TermVectorStatus testTermVectors(CodecReader reader, PrintStream infoStream, Version version) throws IOException { - return testTermVectors(reader, infoStream, false, false, false, version); + public static Status.TermVectorStatus testTermVectors(CodecReader reader, PrintStream infoStream) throws IOException { + return testTermVectors(reader, infoStream, false, false, false); } /** * Test term vectors. * @lucene.experimental */ - public static Status.TermVectorStatus testTermVectors(CodecReader reader, PrintStream infoStream, boolean verbose, boolean crossCheckTermVectors, boolean failFast, Version version) throws IOException { + public static Status.TermVectorStatus testTermVectors(CodecReader reader, PrintStream infoStream, boolean verbose, boolean crossCheckTermVectors, boolean failFast) throws IOException { long startNS = System.nanoTime(); final Status.TermVectorStatus status = new Status.TermVectorStatus(); final FieldInfos fieldInfos = reader.getFieldInfos(); @@ -2425,7 +2422,7 @@ public static Status.TermVectorStatus testTermVectors(CodecReader reader, PrintS if (tfv != null) { // First run with no deletions: - checkFields(tfv, null, 1, fieldInfos, false, true, infoStream, verbose, version); + checkFields(tfv, null, 1, fieldInfos, false, true, infoStream, verbose); // Only agg stats if the doc is live: final boolean doStats = liveDocs == null || liveDocs.get(j); diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java index 26a25a59b087..c2cded7ae4f7 100644 --- a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java +++ b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java @@ -1170,9 +1170,7 @@ public IndexWriter(Directory d, IndexWriterConfig conf) throws IOException { } } - /** Confirms that the incoming index sort (if any) matches the existing index sort (if any). - * This is unfortunately just best effort, because it could be the old index only has unsorted flushed segments built - * before {@link Version#LUCENE_6_5_0} (flushed segments are sorted in Lucene 7.0). */ + /** Confirms that the incoming index sort (if any) matches the existing index sort (if any). */ private void validateIndexSort() throws CorruptIndexException { Sort indexSort = config.getIndexSort(); if (indexSort != null) { @@ -1180,7 +1178,7 @@ private void validateIndexSort() throws CorruptIndexException { Sort segmentIndexSort = info.info.getIndexSort(); if (segmentIndexSort != null && indexSort.equals(segmentIndexSort) == false) { throw new IllegalArgumentException("cannot change previous indexSort=" + segmentIndexSort + " (from segment=" + info + ") to new indexSort=" + indexSort); - } else if (segmentIndexSort == null && info.info.getVersion().onOrAfter(Version.LUCENE_6_5_0)) { + } else if (segmentIndexSort == null) { // Flushed segments are not sorted if they were built with a version prior to 6.5.0 throw new CorruptIndexException("segment not sorted with indexSort=" + segmentIndexSort, info.info.toString()); } diff --git a/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java b/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java index e463259f9de5..e3761ccc2f68 100644 --- a/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java +++ b/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java @@ -312,7 +312,7 @@ public static final SegmentInfos readCommit(Directory directory, ChecksumIndexIn CodecUtil.checkIndexHeaderSuffix(input, Long.toString(generation, Character.MAX_RADIX)); Version luceneVersion = Version.fromBits(input.readVInt(), input.readVInt(), input.readVInt()); - if (luceneVersion.onOrAfter(Version.LUCENE_6_0_0) == false) { + if (luceneVersion.onOrAfter(Version.LUCENE_7_0_0) == false) { // TODO: should we check indexCreatedVersion instead? throw new IndexFormatTooOldException(input, "this index is too old (version: " + luceneVersion + ")"); } diff --git a/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java b/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java index e693b2b99466..35554e2b20e1 100644 --- a/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java +++ b/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java @@ -118,16 +118,9 @@ public boolean getDiscountOverlaps() { } /** Cache of decoded bytes. */ - private static final float[] OLD_LENGTH_TABLE = new float[256]; private static final float[] LENGTH_TABLE = new float[256]; static { - for (int i = 1; i < 256; i++) { - float f = SmallFloat.byte315ToFloat((byte)i); - OLD_LENGTH_TABLE[i] = 1.0f / (f*f); - } - OLD_LENGTH_TABLE[0] = 1.0f / OLD_LENGTH_TABLE[255]; // otherwise inf - for (int i = 0; i < 256; i++) { LENGTH_TABLE[i] = SmallFloat.byte4ToInt((byte) i); } @@ -137,12 +130,7 @@ public boolean getDiscountOverlaps() { @Override public final long computeNorm(FieldInvertState state) { final int numTerms = discountOverlaps ? state.getLength() - state.getNumOverlap() : state.getLength(); - int indexCreatedVersionMajor = state.getIndexCreatedVersionMajor(); - if (indexCreatedVersionMajor >= 7) { - return SmallFloat.intToByte4(numTerms); - } else { - return SmallFloat.floatToByte315((float) (1 / Math.sqrt(numTerms))); - } + return SmallFloat.intToByte4(numTerms); } /** @@ -205,19 +193,17 @@ public final SimWeight computeWeight(float boost, CollectionStatistics collectio Explanation idf = termStats.length == 1 ? idfExplain(collectionStats, termStats[0]) : idfExplain(collectionStats, termStats); float avgdl = avgFieldLength(collectionStats); - float[] oldCache = new float[256]; float[] cache = new float[256]; for (int i = 0; i < cache.length; i++) { - oldCache[i] = k1 * ((1 - b) + b * OLD_LENGTH_TABLE[i] / avgdl); cache[i] = k1 * ((1 - b) + b * LENGTH_TABLE[i] / avgdl); } - return new BM25Stats(collectionStats.field(), boost, idf, avgdl, oldCache, cache); + return new BM25Stats(collectionStats.field(), boost, idf, avgdl, cache); } @Override public final SimScorer simScorer(SimWeight stats, LeafReaderContext context) throws IOException { BM25Stats bm25stats = (BM25Stats) stats; - return new BM25DocScorer(bm25stats, context.reader().getMetaData().getCreatedVersionMajor(), context.reader().getNormValues(bm25stats.field)); + return new BM25DocScorer(bm25stats, context.reader().getNormValues(bm25stats.field)); } private class BM25DocScorer extends SimScorer { @@ -229,17 +215,12 @@ private class BM25DocScorer extends SimScorer { /** precomputed norm[256] with k1 * ((1 - b) + b * dl / avgdl) */ private final float[] cache; - BM25DocScorer(BM25Stats stats, int indexCreatedVersionMajor, NumericDocValues norms) throws IOException { + BM25DocScorer(BM25Stats stats, NumericDocValues norms) throws IOException { this.stats = stats; this.weightValue = stats.weight * (k1 + 1); this.norms = norms; - if (indexCreatedVersionMajor >= 7) { - lengthCache = LENGTH_TABLE; - cache = stats.cache; - } else { - lengthCache = OLD_LENGTH_TABLE; - cache = stats.oldCache; - } + lengthCache = LENGTH_TABLE; + cache = stats.cache; } @Override @@ -287,16 +268,15 @@ private static class BM25Stats extends SimWeight { /** field name, for pulling norms */ private final String field; /** precomputed norm[256] with k1 * ((1 - b) + b * dl / avgdl) - * for both OLD_LENGTH_TABLE and LENGTH_TABLE */ - private final float[] oldCache, cache; + * for LENGTH_TABLE */ + private final float[] cache; - BM25Stats(String field, float boost, Explanation idf, float avgdl, float[] oldCache, float[] cache) { + BM25Stats(String field, float boost, Explanation idf, float avgdl, float[] cache) { this.field = field; this.boost = boost; this.idf = idf; this.avgdl = avgdl; this.weight = idf.getValue() * boost; - this.oldCache = oldCache; this.cache = cache; } diff --git a/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java b/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java index fb34f07a97ca..46899a3378fc 100644 --- a/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java +++ b/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java @@ -191,7 +191,6 @@ protected Explanation explain( @Override public final SimScorer simScorer(SimWeight stats, LeafReaderContext context) throws IOException { - int indexCreatedVersionMajor = context.reader().getMetaData().getCreatedVersionMajor(); if (stats instanceof MultiSimilarity.MultiStats) { // a multi term query (e.g. phrase). return the summation, // scoring almost as if it were boolean query @@ -199,12 +198,12 @@ public final SimScorer simScorer(SimWeight stats, LeafReaderContext context) thr SimScorer subScorers[] = new SimScorer[subStats.length]; for (int i = 0; i < subScorers.length; i++) { BasicStats basicstats = (BasicStats) subStats[i]; - subScorers[i] = new BasicSimScorer(basicstats, indexCreatedVersionMajor, context.reader().getNormValues(basicstats.field)); + subScorers[i] = new BasicSimScorer(basicstats, context.reader().getNormValues(basicstats.field)); } return new MultiSimilarity.MultiSimScorer(subScorers); } else { BasicStats basicstats = (BasicStats) stats; - return new BasicSimScorer(basicstats, indexCreatedVersionMajor, context.reader().getNormValues(basicstats.field)); + return new BasicSimScorer(basicstats, context.reader().getNormValues(basicstats.field)); } } @@ -218,16 +217,9 @@ public final SimScorer simScorer(SimWeight stats, LeafReaderContext context) thr // ------------------------------ Norm handling ------------------------------ /** Cache of decoded bytes. */ - private static final float[] OLD_LENGTH_TABLE = new float[256]; private static final float[] LENGTH_TABLE = new float[256]; static { - for (int i = 1; i < 256; i++) { - float f = SmallFloat.byte315ToFloat((byte)i); - OLD_LENGTH_TABLE[i] = 1.0f / (f*f); - } - OLD_LENGTH_TABLE[0] = 1.0f / OLD_LENGTH_TABLE[255]; // otherwise inf - for (int i = 0; i < 256; i++) { LENGTH_TABLE[i] = SmallFloat.byte4ToInt((byte) i); } @@ -241,12 +233,7 @@ public final long computeNorm(FieldInvertState state) { numTerms = state.getLength() - state.getNumOverlap(); else numTerms = state.getLength(); - int indexCreatedVersionMajor = state.getIndexCreatedVersionMajor(); - if (indexCreatedVersionMajor >= 7) { - return SmallFloat.intToByte4(numTerms); - } else { - return SmallFloat.floatToByte315((float) (1 / Math.sqrt(numTerms))); - } + return SmallFloat.intToByte4(numTerms); } // ----------------------------- Static methods ------------------------------ @@ -268,12 +255,10 @@ public static double log2(double x) { final class BasicSimScorer extends SimScorer { private final BasicStats stats; private final NumericDocValues norms; - private final float[] normCache; - BasicSimScorer(BasicStats stats, int indexCreatedVersionMajor, NumericDocValues norms) throws IOException { + BasicSimScorer(BasicStats stats, NumericDocValues norms) throws IOException { this.stats = stats; this.norms = norms; - this.normCache = indexCreatedVersionMajor >= 7 ? LENGTH_TABLE : OLD_LENGTH_TABLE; } float getLengthValue(int doc) throws IOException { @@ -281,7 +266,7 @@ float getLengthValue(int doc) throws IOException { return 1F; } if (norms.advanceExact(doc)) { - return normCache[Byte.toUnsignedInt((byte) norms.longValue())]; + return LENGTH_TABLE[Byte.toUnsignedInt((byte) norms.longValue())]; } else { return 0; } diff --git a/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java b/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java index 14b3c3f8359a..dba1c61b090f 100644 --- a/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java +++ b/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java @@ -376,15 +376,6 @@ */ public abstract class TFIDFSimilarity extends Similarity { - /** Cache of decoded bytes. */ - static final float[] OLD_NORM_TABLE = new float[256]; - - static { - for (int i = 0; i < 256; i++) { - OLD_NORM_TABLE[i] = SmallFloat.byte315ToFloat((byte)i); - } - } - /** * Sole constructor. (For invocation by subclass * constructors, typically implicit.) @@ -516,11 +507,7 @@ public final long computeNorm(FieldInvertState state) { numTerms = state.getLength() - state.getNumOverlap(); else numTerms = state.getLength(); - if (state.getIndexCreatedVersionMajor() >= 7) { - return SmallFloat.intToByte4(numTerms); - } else { - return SmallFloat.floatToByte315(lengthNorm(numTerms)); - } + return SmallFloat.intToByte4(numTerms); } /** Computes the amount of a sloppy phrase match, based on an edit distance. @@ -569,14 +556,8 @@ public final SimWeight computeWeight(float boost, CollectionStatistics collectio @Override public final SimScorer simScorer(SimWeight stats, LeafReaderContext context) throws IOException { IDFStats idfstats = (IDFStats) stats; - final float[] normTable; - if (context.reader().getMetaData().getCreatedVersionMajor() >= 7) { - // the norms only encode the length, we need a translation table that depends on how lengthNorm is implemented - normTable = idfstats.normTable; - } else { - // the norm is directly encoded in the index - normTable = OLD_NORM_TABLE; - } + // the norms only encode the length, we need a translation table that depends on how lengthNorm is implemented + final float[] normTable = idfstats.normTable; return new TFIDFSimScorer(idfstats, context.reader().getNormValues(idfstats.field), normTable); } diff --git a/lucene/core/src/java/org/apache/lucene/util/Version.java b/lucene/core/src/java/org/apache/lucene/util/Version.java index 634caee610a7..81d02f21c79f 100644 --- a/lucene/core/src/java/org/apache/lucene/util/Version.java +++ b/lucene/core/src/java/org/apache/lucene/util/Version.java @@ -32,19 +32,6 @@ */ public final class Version { - /** Match settings and bugs in Lucene's 6.0 release. - * @deprecated (7.0.0) Use latest - */ - @Deprecated - public static final Version LUCENE_6_0_0 = new Version(6, 0, 0); - - /** - * Match settings and bugs in Lucene's 6.5.0 release. - * @deprecated Use latest - */ - @Deprecated - public static final Version LUCENE_6_5_0 = new Version(6, 5, 0); - /** * Match settings and bugs in Lucene's 7.0.0 release. * @deprecated (8.0.0) Use latest diff --git a/lucene/core/src/test/org/apache/lucene/search/similarities/TestBM25Similarity.java b/lucene/core/src/test/org/apache/lucene/search/similarities/TestBM25Similarity.java index 7c11d6b7edb6..4c6382baf62d 100644 --- a/lucene/core/src/test/org/apache/lucene/search/similarities/TestBM25Similarity.java +++ b/lucene/core/src/test/org/apache/lucene/search/similarities/TestBM25Similarity.java @@ -17,24 +17,8 @@ package org.apache.lucene.search.similarities; -import java.io.IOException; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field.Store; -import org.apache.lucene.document.TextField; -import org.apache.lucene.index.DirectoryReader; -import org.apache.lucene.index.IndexReader; -import org.apache.lucene.index.IndexWriter; -import org.apache.lucene.index.SegmentInfos; -import org.apache.lucene.index.Term; import org.apache.lucene.search.Explanation; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.TermQuery; -import org.apache.lucene.store.Directory; import org.apache.lucene.util.LuceneTestCase; -import org.apache.lucene.util.Version; public class TestBM25Similarity extends LuceneTestCase { diff --git a/lucene/core/src/test/org/apache/lucene/search/similarities/TestClassicSimilarity.java b/lucene/core/src/test/org/apache/lucene/search/similarities/TestClassicSimilarity.java index 2b36ed257653..e7a56067c557 100644 --- a/lucene/core/src/test/org/apache/lucene/search/similarities/TestClassicSimilarity.java +++ b/lucene/core/src/test/org/apache/lucene/search/similarities/TestClassicSimilarity.java @@ -19,29 +19,24 @@ import java.io.IOException; import java.util.Arrays; -import java.util.stream.Collectors; -import java.util.stream.IntStream; import org.apache.lucene.document.Document; -import org.apache.lucene.document.StringField; -import org.apache.lucene.document.TextField; import org.apache.lucene.document.Field.Store; +import org.apache.lucene.document.StringField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.FieldInvertState; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.MultiReader; -import org.apache.lucene.index.SegmentInfos; import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.DisjunctionMaxQuery; -import org.apache.lucene.search.Explanation; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.similarities.TFIDFSimilarity.IDFStats; -import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.store.Directory; import org.apache.lucene.util.IOUtils; import org.apache.lucene.util.LuceneTestCase; @@ -163,16 +158,6 @@ public void testDMQHitOrEmpty() throws IOException { public void testSaneNormValues() throws IOException { ClassicSimilarity sim = new ClassicSimilarity(); - for (int i = 0; i < 256; i++) { - float boost = TFIDFSimilarity.OLD_NORM_TABLE[i]; - assertFalse("negative boost: " + boost + ", byte=" + i, boost < 0.0f); - assertFalse("inf bost: " + boost + ", byte=" + i, Float.isInfinite(boost)); - assertFalse("nan boost for byte=" + i, Float.isNaN(boost)); - if (i > 0) { - assertTrue("boost is not increasing: " + boost + ",byte=" + i, boost > TFIDFSimilarity.OLD_NORM_TABLE[i-1]); - } - } - TFIDFSimilarity.IDFStats stats = (IDFStats) sim.computeWeight(1f, new IndexSearcher(new MultiReader()).collectionStatistics("foo")); for (int i = 0; i < 256; i++) { float boost = stats.normTable[i]; @@ -185,20 +170,6 @@ public void testSaneNormValues() throws IOException { } } - private static Explanation findExplanation(Explanation expl, String text) { - if (expl.getDescription().startsWith(text)) { - return expl; - } else { - for (Explanation sub : expl.getDetails()) { - Explanation match = findExplanation(sub, text); - if (match != null) { - return match; - } - } - } - return null; - } - public void testSameNormsAsBM25() { ClassicSimilarity sim1 = new ClassicSimilarity(); BM25Similarity sim2 = new BM25Similarity(); diff --git a/lucene/core/src/test/org/apache/lucene/search/similarities/TestSimilarityBase.java b/lucene/core/src/test/org/apache/lucene/search/similarities/TestSimilarityBase.java index c5472fac3a38..8fbd69d9190e 100644 --- a/lucene/core/src/test/org/apache/lucene/search/similarities/TestSimilarityBase.java +++ b/lucene/core/src/test/org/apache/lucene/search/similarities/TestSimilarityBase.java @@ -20,23 +20,16 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.FieldType; import org.apache.lucene.document.TextField; -import org.apache.lucene.document.Field.Store; -import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.FieldInvertState; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.IndexReader; -import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.RandomIndexWriter; -import org.apache.lucene.index.SegmentInfos; import org.apache.lucene.index.Term; -import org.apache.lucene.index.TermContext; import org.apache.lucene.search.CollectionStatistics; import org.apache.lucene.search.Explanation; import org.apache.lucene.search.IndexSearcher; @@ -44,14 +37,11 @@ import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TermStatistics; import org.apache.lucene.search.TopDocs; -import org.apache.lucene.search.similarities.Similarity.SimWeight; import org.apache.lucene.store.Directory; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.Version; -import com.carrotsearch.randomizedtesting.generators.RandomPicks; - /** * Tests the {@link SimilarityBase}-based Similarities. Contains unit tests and * integration tests for all Similarities and correctness tests for a select diff --git a/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java b/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java index 0ea90fc04eb9..d3351ab9f633 100644 --- a/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java +++ b/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java @@ -334,9 +334,9 @@ public static void checkReader(LeafReader reader, boolean crossCheckTermVectors) CheckIndex.testLiveDocs(codecReader, infoStream, true); CheckIndex.testFieldInfos(codecReader, infoStream, true); CheckIndex.testFieldNorms(codecReader, infoStream, true); - CheckIndex.testPostings(codecReader, infoStream, false, true, Version.LUCENE_7_0_0); + CheckIndex.testPostings(codecReader, infoStream, false, true); CheckIndex.testStoredFields(codecReader, infoStream, true); - CheckIndex.testTermVectors(codecReader, infoStream, false, crossCheckTermVectors, true, Version.LUCENE_7_0_0); + CheckIndex.testTermVectors(codecReader, infoStream, false, crossCheckTermVectors, true); CheckIndex.testDocValues(codecReader, infoStream, true); CheckIndex.testPoints(codecReader, infoStream, true); diff --git a/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java b/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java index f332934abdec..2cddb8fde315 100644 --- a/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java +++ b/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java @@ -421,10 +421,10 @@ private Version parseConfiguredVersion(String configuredVersion, String pluginCl Version version = (configuredVersion != null) ? Config.parseLuceneVersionString(configuredVersion) : schema.getDefaultLuceneMatchVersion(); - if (!version.onOrAfter(Version.LUCENE_6_0_0)) { + if (!version.onOrAfter(Version.LUCENE_7_0_0)) { log.warn(pluginClassName + " is using deprecated " + version + - " emulation. You should at some point declare and reindex to at least 6.0, because " + - "5.x emulation is deprecated and will be removed in 7.0"); + " emulation. You should at some point declare and reindex to at least 7.0, because " + + "6.x emulation is deprecated and will be removed in 8.0"); } return version; } diff --git a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java index 36efbcf8a251..94884a2fd116 100644 --- a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java +++ b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java @@ -68,7 +68,6 @@ import org.apache.solr.request.LocalSolrQueryRequest; import org.apache.solr.response.SchemaXmlWriter; import org.apache.solr.response.SolrQueryResponse; -import org.apache.solr.search.similarities.ClassicSimilarityFactory; import org.apache.solr.search.similarities.SchemaSimilarityFactory; import org.apache.solr.util.DOMUtil; import org.apache.solr.util.plugin.SolrCoreAware; @@ -475,8 +474,7 @@ protected void readSchema(InputSource is) { Node node = (Node) xpath.evaluate(expression, document, XPathConstants.NODE); similarityFactory = readSimilarity(loader, node); if (similarityFactory == null) { - final boolean modernSim = getDefaultLuceneMatchVersion().onOrAfter(Version.LUCENE_6_0_0); - final Class simClass = modernSim ? SchemaSimilarityFactory.class : ClassicSimilarityFactory.class; + final Class simClass = SchemaSimilarityFactory.class; // use the loader to ensure proper SolrCoreAware handling similarityFactory = loader.newInstance(simClass.getName(), SimilarityFactory.class); similarityFactory.init(new ModifiableSolrParams()); diff --git a/solr/core/src/java/org/apache/solr/schema/IndexSchemaFactory.java b/solr/core/src/java/org/apache/solr/schema/IndexSchemaFactory.java index 83750c3355b4..fda4868c27e1 100644 --- a/solr/core/src/java/org/apache/solr/schema/IndexSchemaFactory.java +++ b/solr/core/src/java/org/apache/solr/schema/IndexSchemaFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ package org.apache.solr.schema; -import org.apache.lucene.util.Version; + import org.apache.solr.common.SolrException; import org.apache.solr.common.SolrException.ErrorCode; import org.apache.solr.core.PluginInfo; @@ -65,12 +65,7 @@ public static IndexSchema buildIndexSchema(String resourceName, SolrConfig confi factory = config.getResourceLoader().newInstance(info.className, IndexSchemaFactory.class); factory.init(info.initArgs); } else { - if (config.luceneMatchVersion.onOrAfter(Version.LUCENE_6_0_0)) { - // ManagedIndexSchemaFactory is SolrCoreAware so we must create using the resource loader - factory = config.getResourceLoader().newInstance(ManagedIndexSchemaFactory.class.getName(), IndexSchemaFactory.class); - } else { - factory = new ClassicIndexSchemaFactory(); - } + factory = config.getResourceLoader().newInstance(ManagedIndexSchemaFactory.class.getName(), IndexSchemaFactory.class); } IndexSchema schema = factory.create(resourceName, config); return schema; diff --git a/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java b/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java index 3c942d25b1b4..0aea8ed8c142 100644 --- a/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java +++ b/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java @@ -114,9 +114,7 @@ public Similarity getSimilarity() { Similarity defaultSim = null; if (null == defaultSimFromFieldType) { // nothing configured, choose a sensible implicit default... - defaultSim = this.core.getSolrConfig().luceneMatchVersion.onOrAfter(Version.LUCENE_6_0_0) - ? new BM25Similarity() - : new ClassicSimilarity(); + defaultSim = new BM25Similarity(); } else { FieldType defSimFT = core.getLatestSchema().getFieldTypeByName(defaultSimFromFieldType); if (null == defSimFT) { diff --git a/solr/core/src/test-files/solr/configsets/_default/conf/solrconfig.xml b/solr/core/src/test-files/solr/configsets/_default/conf/solrconfig.xml index f75303fc32bc..c885f06d20ca 100644 --- a/solr/core/src/test-files/solr/configsets/_default/conf/solrconfig.xml +++ b/solr/core/src/test-files/solr/configsets/_default/conf/solrconfig.xml @@ -35,7 +35,7 @@ that you fully re-index after changing this setting as it can affect both how text is indexed and queried. --> - 7.0.0 + 8.0.0