diff --git a/CHANGELOG.md b/CHANGELOG.md index 9045edd06..f2ac91ef5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Maintenance * Update package name to fix compilation issue [#2513](https://github.com/opensearch-project/k-NN/pull/2513) ### Refactoring +* Refactor codec to leverage backwards_codecs [#2546](https://github.com/opensearch-project/k-NN/pull/2546) ## [Unreleased 2.x](https://github.com/opensearch-project/k-NN/compare/2.19...2.x) ### Features diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN10010Codec/KNN10010Codec.java b/src/main/java/org/opensearch/knn/index/codec/KNN10010Codec/KNN10010Codec.java index 97848bb35..73371bb61 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNN10010Codec/KNN10010Codec.java +++ b/src/main/java/org/opensearch/knn/index/codec/KNN10010Codec/KNN10010Codec.java @@ -12,31 +12,37 @@ import org.apache.lucene.codecs.FilterCodec; import org.apache.lucene.codecs.KnnVectorsFormat; import org.apache.lucene.codecs.StoredFieldsFormat; +import org.apache.lucene.codecs.lucene101.Lucene101Codec; import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; import org.opensearch.index.mapper.MapperService; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80DocValuesFormat; import org.opensearch.knn.index.codec.KNN9120Codec.DerivedSourceStoredFieldsFormat; -import org.opensearch.knn.index.codec.KNNCodecVersion; -import org.opensearch.knn.index.codec.KNNFormatFacade; +import org.opensearch.knn.index.codec.KNN9120Codec.KNN9120PerFieldKnnVectorsFormat; import org.opensearch.knn.index.codec.derivedsource.DerivedSourceReadersSupplier; +import java.util.Optional; + /** * KNN Codec that wraps the Lucene Codec which is part of Lucene 10.0.1 */ public class KNN10010Codec extends FilterCodec { - private static final KNNCodecVersion VERSION = KNNCodecVersion.V_10_01_0; - private final KNNFormatFacade knnFormatFacade; + private static final String NAME = "KNN10010Codec"; + public static final Codec DEFAULT_DELEGATE = new Lucene101Codec(); + private static final PerFieldKnnVectorsFormat DEFAULT_KNN_VECTOR_FORMAT = new KNN9120PerFieldKnnVectorsFormat(Optional.empty()); + private final PerFieldKnnVectorsFormat perFieldKnnVectorsFormat; private final StoredFieldsFormat storedFieldsFormat; private final MapperService mapperService; /** - * No arg constructor that uses Lucene99 as the delegate + * No arg constructor that uses Lucene101Codec as the delegate */ public KNN10010Codec() { - this(VERSION.getDefaultCodecDelegate(), VERSION.getPerFieldKnnVectorsFormat(), null); + this(DEFAULT_DELEGATE, DEFAULT_KNN_VECTOR_FORMAT, null); } /** @@ -47,9 +53,8 @@ public KNN10010Codec() { * @param knnVectorsFormat per field format for KnnVector */ @Builder - protected KNN10010Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat, MapperService mapperService) { - super(VERSION.getCodecName(), delegate); - knnFormatFacade = VERSION.getKnnFormatFacadeSupplier().apply(delegate); + public KNN10010Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat, MapperService mapperService) { + super(NAME, delegate); perFieldKnnVectorsFormat = knnVectorsFormat; this.mapperService = mapperService; this.storedFieldsFormat = getStoredFieldsFormat(); @@ -57,12 +62,12 @@ protected KNN10010Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsForma @Override public DocValuesFormat docValuesFormat() { - return knnFormatFacade.docValuesFormat(); + return new KNN80DocValuesFormat(delegate.docValuesFormat()); } @Override public CompoundFormat compoundFormat() { - return knnFormatFacade.compoundFormat(); + return new KNN80CompoundFormat(delegate.compoundFormat()); } @Override diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80Codec.java b/src/main/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80Codec.java deleted file mode 100644 index 0064f49fe..000000000 --- a/src/main/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80Codec.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.opensearch.knn.index.codec.KNN80Codec; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -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.KnnVectorsFormat; -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.perfield.PerFieldDocValuesFormat; - -/** - * Extends the Codec to support a new file format for KNN index - * based on the mappings. - * - */ -public final class KNN80Codec extends Codec { - - private static final Logger logger = LogManager.getLogger(KNN80Codec.class); - private final DocValuesFormat docValuesFormat; - private final DocValuesFormat perFieldDocValuesFormat; - private final CompoundFormat compoundFormat; - private Codec lucene80Codec; - - public static final String KNN_80 = "KNN80Codec"; - public static final String LUCENE_80 = "Lucene80"; // Lucene Codec to be used - - public KNN80Codec() { - super(KNN_80); - this.docValuesFormat = new KNN80DocValuesFormat(); - this.perFieldDocValuesFormat = new PerFieldDocValuesFormat() { - @Override - public DocValuesFormat getDocValuesFormatForField(String field) { - return docValuesFormat; - } - }; - this.compoundFormat = new KNN80CompoundFormat(); - } - - /* - * This function returns the Lucene80 Codec. - */ - public Codec getDelegatee() { - if (lucene80Codec == null) lucene80Codec = Codec.forName(LUCENE_80); - return lucene80Codec; - } - - @Override - public DocValuesFormat docValuesFormat() { - return this.perFieldDocValuesFormat; - } - - /* - * For all the below functions, we could have extended FilterCodec, but this brings - * SPI related issues while loading Codec in the tests. So fall back to traditional - * approach of manually overriding. - */ - - @Override - public PostingsFormat postingsFormat() { - return getDelegatee().postingsFormat(); - } - - @Override - public StoredFieldsFormat storedFieldsFormat() { - return getDelegatee().storedFieldsFormat(); - } - - @Override - public TermVectorsFormat termVectorsFormat() { - return getDelegatee().termVectorsFormat(); - } - - @Override - public FieldInfosFormat fieldInfosFormat() { - return getDelegatee().fieldInfosFormat(); - } - - @Override - public SegmentInfoFormat segmentInfoFormat() { - return getDelegatee().segmentInfoFormat(); - } - - @Override - public NormsFormat normsFormat() { - return getDelegatee().normsFormat(); - } - - @Override - public LiveDocsFormat liveDocsFormat() { - return getDelegatee().liveDocsFormat(); - } - - @Override - public CompoundFormat compoundFormat() { - return this.compoundFormat; - } - - @Override - public PointsFormat pointsFormat() { - return getDelegatee().pointsFormat(); - } - - @Override - public KnnVectorsFormat knnVectorsFormat() { - throw new UnsupportedOperationException("Codec does not support knn vector format"); - } -} diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN84Codec/KNN84Codec.java b/src/main/java/org/opensearch/knn/index/codec/KNN84Codec/KNN84Codec.java deleted file mode 100644 index b55365c09..000000000 --- a/src/main/java/org/opensearch/knn/index/codec/KNN84Codec/KNN84Codec.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.opensearch.knn.index.codec.KNN84Codec; - -import org.apache.lucene.codecs.KnnVectorsFormat; -import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; -import org.opensearch.knn.index.codec.KNN80Codec.KNN80DocValuesFormat; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -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.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.perfield.PerFieldDocValuesFormat; - -/** - * Extends the Codec to support a new file format for KNN index - * based on the mappings. - * - */ -public final class KNN84Codec extends Codec { - - private static final Logger logger = LogManager.getLogger(KNN84Codec.class); - private final DocValuesFormat docValuesFormat; - private final DocValuesFormat perFieldDocValuesFormat; - private final CompoundFormat compoundFormat; - private Codec lucene84Codec; - - public static final String KNN_84 = "KNN84Codec"; - public static final String LUCENE_84 = "Lucene84"; // Lucene Codec to be used - - public KNN84Codec() { - super(KNN_84); - // Note that DocValuesFormat can use old Codec's DocValuesFormat. For instance Lucene84 uses Lucene80 - // DocValuesFormat. Refer to defaultDVFormat in LuceneXXCodec.java to find out which version it uses - this.docValuesFormat = new KNN80DocValuesFormat(); - this.perFieldDocValuesFormat = new PerFieldDocValuesFormat() { - @Override - public DocValuesFormat getDocValuesFormatForField(String field) { - return docValuesFormat; - } - }; - this.compoundFormat = new KNN80CompoundFormat(); - } - - /* - * This function returns the Lucene84 Codec. - */ - public Codec getDelegatee() { - if (lucene84Codec == null) lucene84Codec = Codec.forName(LUCENE_84); - return lucene84Codec; - } - - @Override - public DocValuesFormat docValuesFormat() { - return this.perFieldDocValuesFormat; - } - - /* - * For all the below functions, we could have extended FilterCodec, but this brings - * SPI related issues while loading Codec in the tests. So fall back to traditional - * approach of manually overriding. - */ - - @Override - public PostingsFormat postingsFormat() { - return getDelegatee().postingsFormat(); - } - - @Override - public StoredFieldsFormat storedFieldsFormat() { - return getDelegatee().storedFieldsFormat(); - } - - @Override - public TermVectorsFormat termVectorsFormat() { - return getDelegatee().termVectorsFormat(); - } - - @Override - public FieldInfosFormat fieldInfosFormat() { - return getDelegatee().fieldInfosFormat(); - } - - @Override - public SegmentInfoFormat segmentInfoFormat() { - return getDelegatee().segmentInfoFormat(); - } - - @Override - public NormsFormat normsFormat() { - return getDelegatee().normsFormat(); - } - - @Override - public LiveDocsFormat liveDocsFormat() { - return getDelegatee().liveDocsFormat(); - } - - @Override - public CompoundFormat compoundFormat() { - return this.compoundFormat; - } - - @Override - public PointsFormat pointsFormat() { - return getDelegatee().pointsFormat(); - } - - @Override - public KnnVectorsFormat knnVectorsFormat() { - return getDelegatee().knnVectorsFormat(); - } -} diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN86Codec/KNN86Codec.java b/src/main/java/org/opensearch/knn/index/codec/KNN86Codec/KNN86Codec.java deleted file mode 100644 index a3b34559a..000000000 --- a/src/main/java/org/opensearch/knn/index/codec/KNN86Codec/KNN86Codec.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.opensearch.knn.index.codec.KNN86Codec; - -import org.apache.lucene.codecs.KnnVectorsFormat; -import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; -import org.opensearch.knn.index.codec.KNN80Codec.KNN80DocValuesFormat; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -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.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.perfield.PerFieldDocValuesFormat; - -/** - * Extends the Codec to support a new file format for KNN index - * based on the mappings. - * - */ -public final class KNN86Codec extends Codec { - - private static final Logger logger = LogManager.getLogger(KNN86Codec.class); - private final DocValuesFormat docValuesFormat; - private final DocValuesFormat perFieldDocValuesFormat; - private final CompoundFormat compoundFormat; - private Codec lucene86Codec; - private PostingsFormat postingsFormat = null; - - public static final String KNN_86 = "KNN86Codec"; - public static final String LUCENE_86 = "Lucene86"; // Lucene Codec to be used - - public KNN86Codec() { - super(KNN_86); - // Note that DocValuesFormat can use old Codec's DocValuesFormat. For instance Lucene84 uses Lucene80 - // DocValuesFormat. Refer to defaultDVFormat in LuceneXXCodec.java to find out which version it uses - this.docValuesFormat = new KNN80DocValuesFormat(); - this.perFieldDocValuesFormat = new PerFieldDocValuesFormat() { - @Override - public DocValuesFormat getDocValuesFormatForField(String field) { - return docValuesFormat; - } - }; - this.compoundFormat = new KNN80CompoundFormat(); - } - - /* - * This function returns the Lucene84 Codec. - */ - public Codec getDelegatee() { - if (lucene86Codec == null) lucene86Codec = Codec.forName(LUCENE_86); - return lucene86Codec; - } - - @Override - public DocValuesFormat docValuesFormat() { - return this.perFieldDocValuesFormat; - } - - /* - * For all the below functions, we could have extended FilterCodec, but this brings - * SPI related issues while loading Codec in the tests. So fall back to traditional - * approach of manually overriding. - */ - - public void setPostingsFormat(PostingsFormat postingsFormat) { - this.postingsFormat = postingsFormat; - } - - @Override - public PostingsFormat postingsFormat() { - if (this.postingsFormat == null) { - return getDelegatee().postingsFormat(); - } - return this.postingsFormat; - } - - @Override - public StoredFieldsFormat storedFieldsFormat() { - return getDelegatee().storedFieldsFormat(); - } - - @Override - public TermVectorsFormat termVectorsFormat() { - return getDelegatee().termVectorsFormat(); - } - - @Override - public FieldInfosFormat fieldInfosFormat() { - return getDelegatee().fieldInfosFormat(); - } - - @Override - public SegmentInfoFormat segmentInfoFormat() { - return getDelegatee().segmentInfoFormat(); - } - - @Override - public NormsFormat normsFormat() { - return getDelegatee().normsFormat(); - } - - @Override - public LiveDocsFormat liveDocsFormat() { - return getDelegatee().liveDocsFormat(); - } - - @Override - public CompoundFormat compoundFormat() { - return this.compoundFormat; - } - - @Override - public PointsFormat pointsFormat() { - return getDelegatee().pointsFormat(); - } - - @Override - public KnnVectorsFormat knnVectorsFormat() { - return getDelegatee().knnVectorsFormat(); - } -} diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN87Codec/KNN87Codec.java b/src/main/java/org/opensearch/knn/index/codec/KNN87Codec/KNN87Codec.java deleted file mode 100644 index 20799648c..000000000 --- a/src/main/java/org/opensearch/knn/index/codec/KNN87Codec/KNN87Codec.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.opensearch.knn.index.codec.KNN87Codec; - -import org.apache.lucene.codecs.FilterCodec; -import org.apache.lucene.backward_codecs.lucene87.Lucene87Codec; -import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; -import org.opensearch.knn.index.codec.KNN80Codec.KNN80DocValuesFormat; -import org.apache.lucene.codecs.Codec; -import org.apache.lucene.codecs.CompoundFormat; -import org.apache.lucene.codecs.DocValuesFormat; - -/** - * Extends the Codec to support a new file format for KNN index - * based on the mappings. - * - */ -public final class KNN87Codec extends FilterCodec { - - private final DocValuesFormat docValuesFormat; - private final CompoundFormat compoundFormat; - - public static final String KNN_87 = "KNN87Codec"; - - /** - * No arg constructor that uses Lucene87 as the delegate - */ - public KNN87Codec() { - this(new Lucene87Codec()); - } - - /** - * Constructor that takes a Codec delegate to delegate all methods this code does not implement to. - * - * @param delegate codec that will perform all operations this codec does not override - */ - public KNN87Codec(Codec delegate) { - super(KNN_87, delegate); - // Note that DocValuesFormat can use old Codec's DocValuesFormat. For instance Lucene84 uses Lucene80 - // DocValuesFormat. Refer to defaultDVFormat in LuceneXXCodec.java to find out which version it uses - this.docValuesFormat = new KNN80DocValuesFormat(delegate.docValuesFormat()); - this.compoundFormat = new KNN80CompoundFormat(delegate.compoundFormat()); - } - - @Override - public DocValuesFormat docValuesFormat() { - return this.docValuesFormat; - } - - @Override - public CompoundFormat compoundFormat() { - return this.compoundFormat; - } -} diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN910Codec/KNN910Codec.java b/src/main/java/org/opensearch/knn/index/codec/KNN910Codec/KNN910Codec.java deleted file mode 100644 index 77783dc29..000000000 --- a/src/main/java/org/opensearch/knn/index/codec/KNN910Codec/KNN910Codec.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ -package org.opensearch.knn.index.codec.KNN910Codec; - -import org.apache.lucene.codecs.Codec; -import org.apache.lucene.codecs.CompoundFormat; -import org.apache.lucene.codecs.DocValuesFormat; -import org.apache.lucene.codecs.FilterCodec; -import org.opensearch.knn.index.codec.KNNCodecVersion; -import org.opensearch.knn.index.codec.KNNFormatFacade; - -/** - * Extends the Codec to support a new file format for KNN index - * based on the mappings. - * - */ -public final class KNN910Codec extends FilterCodec { - private static final KNNCodecVersion VERSION = KNNCodecVersion.V_9_1_0; - private final KNNFormatFacade knnFormatFacade; - - /** - * No arg constructor that uses Lucene91 as the delegate - */ - public KNN910Codec() { - this(VERSION.getDefaultCodecDelegate()); - } - - /** - * Constructor that takes a Codec delegate to delegate all methods this code does not implement to. - * - * @param delegate codec that will perform all operations this codec does not override - */ - public KNN910Codec(Codec delegate) { - super(VERSION.getCodecName(), delegate); - knnFormatFacade = VERSION.getKnnFormatFacadeSupplier().apply(delegate); - } - - @Override - public DocValuesFormat docValuesFormat() { - return knnFormatFacade.docValuesFormat(); - } - - @Override - public CompoundFormat compoundFormat() { - return knnFormatFacade.compoundFormat(); - } -} diff --git a/src/main/java/org/opensearch/knn/index/codec/KNNCodecService.java b/src/main/java/org/opensearch/knn/index/codec/KNNCodecService.java index b58706c43..7548a9eac 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNNCodecService.java +++ b/src/main/java/org/opensearch/knn/index/codec/KNNCodecService.java @@ -9,8 +9,12 @@ import org.opensearch.index.codec.CodecService; import org.opensearch.index.codec.CodecServiceConfig; import org.opensearch.index.mapper.MapperService; +import org.opensearch.knn.index.codec.KNN10010Codec.KNN10010Codec; +import org.opensearch.knn.index.codec.KNN9120Codec.KNN9120PerFieldKnnVectorsFormat; import org.opensearch.knn.index.codec.nativeindex.NativeIndexBuildStrategyFactory; +import java.util.Optional; + /** * KNNCodecService to inject the right KNNCodec version */ @@ -33,6 +37,10 @@ public KNNCodecService(CodecServiceConfig codecServiceConfig, NativeIndexBuildSt */ @Override public Codec codec(String name) { - return KNNCodecVersion.current().getKnnCodecSupplier().apply(super.codec(name), mapperService, nativeIndexBuildStrategyFactory); + return KNN10010Codec.builder() + .delegate(super.codec(name)) + .mapperService(mapperService) + .knnVectorsFormat(new KNN9120PerFieldKnnVectorsFormat(Optional.ofNullable(mapperService), nativeIndexBuildStrategyFactory)) + .build(); } } diff --git a/src/main/java/org/opensearch/knn/index/codec/KNNCodecVersion.java b/src/main/java/org/opensearch/knn/index/codec/KNNCodecVersion.java index 053ee689e..027169d72 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNNCodecVersion.java +++ b/src/main/java/org/opensearch/knn/index/codec/KNNCodecVersion.java @@ -5,160 +5,13 @@ package org.opensearch.knn.index.codec; -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.apache.lucene.backward_codecs.lucene91.Lucene91Codec; -import org.apache.lucene.backward_codecs.lucene912.Lucene912Codec; -import org.apache.lucene.backward_codecs.lucene92.Lucene92Codec; -import org.apache.lucene.backward_codecs.lucene94.Lucene94Codec; -import org.apache.lucene.backward_codecs.lucene95.Lucene95Codec; -import org.apache.lucene.backward_codecs.lucene99.Lucene99Codec; import org.apache.lucene.codecs.Codec; -import org.apache.lucene.codecs.lucene101.Lucene101Codec; -import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; -import org.opensearch.common.TriFunction; -import org.opensearch.index.mapper.MapperService; import org.opensearch.knn.index.codec.KNN10010Codec.KNN10010Codec; -import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; -import org.opensearch.knn.index.codec.KNN80Codec.KNN80DocValuesFormat; -import org.opensearch.knn.index.codec.KNN910Codec.KNN910Codec; -import org.opensearch.knn.index.codec.KNN9120Codec.KNN9120Codec; -import org.opensearch.knn.index.codec.KNN9120Codec.KNN9120PerFieldKnnVectorsFormat; -import org.opensearch.knn.index.codec.KNN920Codec.KNN920Codec; -import org.opensearch.knn.index.codec.KNN920Codec.KNN920PerFieldKnnVectorsFormat; -import org.opensearch.knn.index.codec.KNN940Codec.KNN940Codec; -import org.opensearch.knn.index.codec.KNN940Codec.KNN940PerFieldKnnVectorsFormat; -import org.opensearch.knn.index.codec.KNN950Codec.KNN950Codec; -import org.opensearch.knn.index.codec.KNN950Codec.KNN950PerFieldKnnVectorsFormat; -import org.opensearch.knn.index.codec.KNN990Codec.KNN990Codec; -import org.opensearch.knn.index.codec.KNN990Codec.KNN990PerFieldKnnVectorsFormat; -import org.opensearch.knn.index.codec.nativeindex.NativeIndexBuildStrategyFactory; - -import java.util.Optional; -import java.util.function.Function; -import java.util.function.Supplier; /** - * Abstraction for k-NN codec version, aggregates all details for specific version such as codec name, corresponding - * Lucene codec, formats including one for k-NN vector etc. + * Class contains easy to access information about current default codec. */ -@AllArgsConstructor -@Getter -public enum KNNCodecVersion { - - V_9_1_0( - "KNN910Codec", - new Lucene91Codec(), - null, - (delegate) -> new KNNFormatFacade( - new KNN80DocValuesFormat(delegate.docValuesFormat()), - new KNN80CompoundFormat(delegate.compoundFormat()) - ), - (userCodec, mapperService, nativeIndexBuildStrategyFactory) -> new KNN910Codec(userCodec), - KNN910Codec::new - ), - - V_9_2_0( - "KNN920Codec", - new Lucene92Codec(), - new KNN920PerFieldKnnVectorsFormat(Optional.empty()), - (delegate) -> new KNNFormatFacade( - new KNN80DocValuesFormat(delegate.docValuesFormat()), - new KNN80CompoundFormat(delegate.compoundFormat()) - ), - (userCodec, mapperService, nativeIndexBuildStrategyFactory) -> KNN920Codec.builder() - .delegate(userCodec) - .knnVectorsFormat(new KNN920PerFieldKnnVectorsFormat(Optional.ofNullable(mapperService))) - .build(), - KNN920Codec::new - ), - - V_9_4_0( - "KNN940Codec", - new Lucene94Codec(), - new KNN940PerFieldKnnVectorsFormat(Optional.empty()), - (delegate) -> new KNNFormatFacade( - new KNN80DocValuesFormat(delegate.docValuesFormat()), - new KNN80CompoundFormat(delegate.compoundFormat()) - ), - (userCodec, mapperService, nativeIndexBuildStrategyFactory) -> KNN940Codec.builder() - .delegate(userCodec) - .knnVectorsFormat(new KNN940PerFieldKnnVectorsFormat(Optional.ofNullable(mapperService))) - .build(), - KNN940Codec::new - ), - - V_9_5_0( - "KNN950Codec", - new Lucene95Codec(), - new KNN950PerFieldKnnVectorsFormat(Optional.empty()), - (delegate) -> new KNNFormatFacade( - new KNN80DocValuesFormat(delegate.docValuesFormat()), - new KNN80CompoundFormat(delegate.compoundFormat()) - ), - (userCodec, mapperService, nativeIndexBuildStrategyFactory) -> KNN950Codec.builder() - .delegate(userCodec) - .knnVectorsFormat(new KNN950PerFieldKnnVectorsFormat(Optional.ofNullable(mapperService))) - .build(), - KNN950Codec::new - ), - - V_9_9_0( - "KNN990Codec", - new Lucene99Codec(), - new KNN990PerFieldKnnVectorsFormat(Optional.empty()), - (delegate) -> new KNNFormatFacade( - new KNN80DocValuesFormat(delegate.docValuesFormat()), - new KNN80CompoundFormat(delegate.compoundFormat()) - ), - (userCodec, mapperService, nativeIndexBuildStrategyFactory) -> KNN990Codec.builder() - .delegate(userCodec) - .knnVectorsFormat(new KNN990PerFieldKnnVectorsFormat(Optional.ofNullable(mapperService))) - .build(), - KNN990Codec::new - ), - - V_9_12_0( - "KNN9120Codec", - new Lucene912Codec(), - new KNN9120PerFieldKnnVectorsFormat(Optional.empty()), - (delegate) -> new KNNFormatFacade( - new KNN80DocValuesFormat(delegate.docValuesFormat()), - new KNN80CompoundFormat(delegate.compoundFormat()) - ), - (userCodec, mapperService, nativeIndexBuildStrategyFactory) -> KNN9120Codec.builder() - .delegate(userCodec) - .knnVectorsFormat(new KNN9120PerFieldKnnVectorsFormat(Optional.ofNullable(mapperService))) - .mapperService(mapperService) - .build(), - KNN9120Codec::new - ), - V_10_01_0( - "KNN10010Codec", - new Lucene101Codec(), - new KNN9120PerFieldKnnVectorsFormat(Optional.empty()), - (delegate) -> new KNNFormatFacade( - new KNN80DocValuesFormat(delegate.docValuesFormat()), - new KNN80CompoundFormat(delegate.compoundFormat()) - ), - (userCodec, mapperService, nativeIndexBuildStrategyFactory) -> KNN10010Codec.builder() - .delegate(userCodec) - .knnVectorsFormat(new KNN9120PerFieldKnnVectorsFormat(Optional.ofNullable(mapperService), nativeIndexBuildStrategyFactory)) - .mapperService(mapperService) - .build(), - KNN10010Codec::new - ); - - private static final KNNCodecVersion CURRENT = V_10_01_0; - - private final String codecName; - private final Codec defaultCodecDelegate; - private final PerFieldKnnVectorsFormat perFieldKnnVectorsFormat; - private final Function knnFormatFacadeSupplier; - private final TriFunction knnCodecSupplier; - private final Supplier defaultKnnCodecSupplier; - - public static final KNNCodecVersion current() { - return CURRENT; - } +public class KNNCodecVersion { + public static final Codec CURRENT_DEFAULT = new KNN10010Codec(); + public static final Codec CURRENT_DEFAULT_DELEGATE = KNN10010Codec.DEFAULT_DELEGATE; } diff --git a/src/main/java/org/opensearch/knn/index/codec/KNNFormatFacade.java b/src/main/java/org/opensearch/knn/index/codec/KNNFormatFacade.java deleted file mode 100644 index bf9b1ad7f..000000000 --- a/src/main/java/org/opensearch/knn/index/codec/KNNFormatFacade.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ -package org.opensearch.knn.index.codec; - -import org.apache.lucene.codecs.CompoundFormat; -import org.apache.lucene.codecs.DocValuesFormat; - -/** - * Class abstracts facade for plugin formats. - */ -public class KNNFormatFacade { - - private final DocValuesFormat docValuesFormat; - private final CompoundFormat compoundFormat; - - public KNNFormatFacade(final DocValuesFormat docValuesFormat, final CompoundFormat compoundFormat) { - this.docValuesFormat = docValuesFormat; - this.compoundFormat = compoundFormat; - } - - public DocValuesFormat docValuesFormat() { - return docValuesFormat; - } - - public CompoundFormat compoundFormat() { - return compoundFormat; - } -} diff --git a/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN910Codec/KNN910Codec.java b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN910Codec/KNN910Codec.java new file mode 100644 index 000000000..924a55e98 --- /dev/null +++ b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN910Codec/KNN910Codec.java @@ -0,0 +1,45 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ +package org.opensearch.knn.index.codec.backward_codecs.KNN910Codec; + +import org.apache.lucene.backward_codecs.lucene91.Lucene91Codec; +import org.apache.lucene.codecs.Codec; +import org.apache.lucene.codecs.CompoundFormat; +import org.apache.lucene.codecs.DocValuesFormat; +import org.apache.lucene.codecs.FilterCodec; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80DocValuesFormat; + +/** + * Extends the Codec to support a new file format for KNN index + * based on the mappings. + * + */ +public final class KNN910Codec extends FilterCodec { + + private static final String NAME = "KNN910Codec"; + private static final Codec DEFAULT_DELEGATE = new Lucene91Codec(); + + /** + * No arg constructor that uses Lucene91 as the delegate + */ + public KNN910Codec() { + this(DEFAULT_DELEGATE); + } + + private KNN910Codec(Codec delegate) { + super(NAME, delegate); + } + + @Override + public DocValuesFormat docValuesFormat() { + return new KNN80DocValuesFormat(delegate.docValuesFormat()); + } + + @Override + public CompoundFormat compoundFormat() { + return new KNN80CompoundFormat(delegate.compoundFormat()); + } +} diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN9120Codec/KNN9120Codec.java b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN9120Codec/KNN9120Codec.java similarity index 73% rename from src/main/java/org/opensearch/knn/index/codec/KNN9120Codec/KNN9120Codec.java rename to src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN9120Codec/KNN9120Codec.java index 5e40faf1a..375b9fe48 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNN9120Codec/KNN9120Codec.java +++ b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN9120Codec/KNN9120Codec.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.knn.index.codec.KNN9120Codec; +package org.opensearch.knn.index.codec.backward_codecs.KNN9120Codec; -import lombok.Builder; +import org.apache.lucene.backward_codecs.lucene912.Lucene912Codec; import org.apache.lucene.codecs.Codec; import org.apache.lucene.codecs.CompoundFormat; import org.apache.lucene.codecs.DocValuesFormat; @@ -14,16 +14,22 @@ import org.apache.lucene.codecs.StoredFieldsFormat; import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; import org.opensearch.index.mapper.MapperService; -import org.opensearch.knn.index.codec.KNNCodecVersion; -import org.opensearch.knn.index.codec.KNNFormatFacade; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80DocValuesFormat; +import org.opensearch.knn.index.codec.KNN9120Codec.DerivedSourceStoredFieldsFormat; +import org.opensearch.knn.index.codec.KNN9120Codec.KNN9120PerFieldKnnVectorsFormat; import org.opensearch.knn.index.codec.derivedsource.DerivedSourceReadersSupplier; +import java.util.Optional; + /** * KNN Codec that wraps the Lucene Codec which is part of Lucene 9.12 */ public class KNN9120Codec extends FilterCodec { - private static final KNNCodecVersion VERSION = KNNCodecVersion.V_9_12_0; - private final KNNFormatFacade knnFormatFacade; + private static final String NAME = "KNN9120Codec"; + private static final Codec DEFAULT_DELEGATE = new Lucene912Codec(); + private static final PerFieldKnnVectorsFormat DEFAULT_KNN_VECTOR_FORMAT = new KNN9120PerFieldKnnVectorsFormat(Optional.empty()); + private final PerFieldKnnVectorsFormat perFieldKnnVectorsFormat; private final StoredFieldsFormat storedFieldsFormat; @@ -33,7 +39,7 @@ public class KNN9120Codec extends FilterCodec { * No arg constructor that uses Lucene99 as the delegate */ public KNN9120Codec() { - this(VERSION.getDefaultCodecDelegate(), VERSION.getPerFieldKnnVectorsFormat(), null); + this(DEFAULT_DELEGATE, DEFAULT_KNN_VECTOR_FORMAT, null); } /** @@ -43,10 +49,8 @@ public KNN9120Codec() { * @param delegate codec that will perform all operations this codec does not override * @param knnVectorsFormat per field format for KnnVector */ - @Builder - protected KNN9120Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat, MapperService mapperService) { - super(VERSION.getCodecName(), delegate); - knnFormatFacade = VERSION.getKnnFormatFacadeSupplier().apply(delegate); + private KNN9120Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat, MapperService mapperService) { + super(NAME, delegate); perFieldKnnVectorsFormat = knnVectorsFormat; this.mapperService = mapperService; this.storedFieldsFormat = getStoredFieldsFormat(); @@ -54,12 +58,12 @@ protected KNN9120Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat @Override public DocValuesFormat docValuesFormat() { - return knnFormatFacade.docValuesFormat(); + return new KNN80DocValuesFormat(delegate.docValuesFormat()); } @Override public CompoundFormat compoundFormat() { - return knnFormatFacade.compoundFormat(); + return new KNN80CompoundFormat(delegate.compoundFormat()); } @Override diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN920Codec/KNN920Codec.java b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN920Codec/KNN920Codec.java similarity index 59% rename from src/main/java/org/opensearch/knn/index/codec/KNN920Codec/KNN920Codec.java rename to src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN920Codec/KNN920Codec.java index b79c1b4f2..10b8f31fe 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNN920Codec/KNN920Codec.java +++ b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN920Codec/KNN920Codec.java @@ -2,33 +2,37 @@ * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.knn.index.codec.KNN920Codec; +package org.opensearch.knn.index.codec.backward_codecs.KNN920Codec; -import lombok.Builder; import lombok.extern.log4j.Log4j2; +import org.apache.lucene.backward_codecs.lucene92.Lucene92Codec; import org.apache.lucene.codecs.Codec; import org.apache.lucene.codecs.CompoundFormat; import org.apache.lucene.codecs.DocValuesFormat; import org.apache.lucene.codecs.FilterCodec; import org.apache.lucene.codecs.KnnVectorsFormat; import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; -import org.opensearch.knn.index.codec.KNNCodecVersion; -import org.opensearch.knn.index.codec.KNNFormatFacade; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80DocValuesFormat; + +import java.util.Optional; /** * KNN codec that is based on Lucene92 codec */ @Log4j2 public final class KNN920Codec extends FilterCodec { - private static final KNNCodecVersion VERSION = KNNCodecVersion.V_9_2_0; - private final KNNFormatFacade knnFormatFacade; + private static final String NAME = "KNN920Codec"; + private static final Codec DEFAULT_DELEGATE = new Lucene92Codec(); + private static final PerFieldKnnVectorsFormat DEFAULT_KNN_VECTOR_FORMAT = new KNN920PerFieldKnnVectorsFormat(Optional.empty()); + private final PerFieldKnnVectorsFormat perFieldKnnVectorsFormat; /** * No arg constructor that uses Lucene91 as the delegate */ public KNN920Codec() { - this(VERSION.getDefaultCodecDelegate(), VERSION.getPerFieldKnnVectorsFormat()); + this(DEFAULT_DELEGATE, DEFAULT_KNN_VECTOR_FORMAT); } /** @@ -37,21 +41,19 @@ public KNN920Codec() { * @param delegate codec that will perform all operations this codec does not override * @param knnVectorsFormat per field format for KnnVector */ - @Builder - public KNN920Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat) { - super(VERSION.getCodecName(), delegate); - knnFormatFacade = VERSION.getKnnFormatFacadeSupplier().apply(delegate); + private KNN920Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat) { + super(NAME, delegate); perFieldKnnVectorsFormat = knnVectorsFormat; } @Override public DocValuesFormat docValuesFormat() { - return knnFormatFacade.docValuesFormat(); + return new KNN80DocValuesFormat(delegate.docValuesFormat()); } @Override public CompoundFormat compoundFormat() { - return knnFormatFacade.compoundFormat(); + return new KNN80CompoundFormat(delegate.compoundFormat()); } @Override diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN920Codec/KNN920PerFieldKnnVectorsFormat.java b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN920Codec/KNN920PerFieldKnnVectorsFormat.java similarity index 93% rename from src/main/java/org/opensearch/knn/index/codec/KNN920Codec/KNN920PerFieldKnnVectorsFormat.java rename to src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN920Codec/KNN920PerFieldKnnVectorsFormat.java index 7cca04319..9fcb7b1dc 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNN920Codec/KNN920PerFieldKnnVectorsFormat.java +++ b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN920Codec/KNN920PerFieldKnnVectorsFormat.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.knn.index.codec.KNN920Codec; +package org.opensearch.knn.index.codec.backward_codecs.KNN920Codec; import org.apache.lucene.backward_codecs.lucene92.Lucene92HnswVectorsFormat; import org.opensearch.index.mapper.MapperService; diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN940Codec/KNN940Codec.java b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN940Codec/KNN940Codec.java similarity index 58% rename from src/main/java/org/opensearch/knn/index/codec/KNN940Codec/KNN940Codec.java rename to src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN940Codec/KNN940Codec.java index a056581d6..ff4c383d9 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNN940Codec/KNN940Codec.java +++ b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN940Codec/KNN940Codec.java @@ -3,28 +3,32 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.knn.index.codec.KNN940Codec; +package org.opensearch.knn.index.codec.backward_codecs.KNN940Codec; -import lombok.Builder; +import org.apache.lucene.backward_codecs.lucene94.Lucene94Codec; import org.apache.lucene.codecs.CompoundFormat; import org.apache.lucene.codecs.Codec; import org.apache.lucene.codecs.DocValuesFormat; import org.apache.lucene.codecs.FilterCodec; import org.apache.lucene.codecs.KnnVectorsFormat; import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; -import org.opensearch.knn.index.codec.KNNCodecVersion; -import org.opensearch.knn.index.codec.KNNFormatFacade; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80DocValuesFormat; + +import java.util.Optional; public class KNN940Codec extends FilterCodec { - private static final KNNCodecVersion VERSION = KNNCodecVersion.V_9_4_0; - private final KNNFormatFacade knnFormatFacade; + private static final String NAME = "KNN940Codec"; + private static final Codec DEFAULT_DELEGATE = new Lucene94Codec(); + private static final PerFieldKnnVectorsFormat DEFAULT_KNN_VECTOR_FORMAT = new KNN940PerFieldKnnVectorsFormat(Optional.empty()); + private final PerFieldKnnVectorsFormat perFieldKnnVectorsFormat; /** * No arg constructor that uses Lucene94 as the delegate */ public KNN940Codec() { - this(VERSION.getDefaultCodecDelegate(), VERSION.getPerFieldKnnVectorsFormat()); + this(DEFAULT_DELEGATE, DEFAULT_KNN_VECTOR_FORMAT); } /** @@ -34,21 +38,19 @@ public KNN940Codec() { * @param delegate codec that will perform all operations this codec does not override * @param knnVectorsFormat per field format for KnnVector */ - @Builder - protected KNN940Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat) { - super(VERSION.getCodecName(), delegate); - knnFormatFacade = VERSION.getKnnFormatFacadeSupplier().apply(delegate); + private KNN940Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat) { + super(NAME, delegate); perFieldKnnVectorsFormat = knnVectorsFormat; } @Override public DocValuesFormat docValuesFormat() { - return knnFormatFacade.docValuesFormat(); + return new KNN80DocValuesFormat(delegate.docValuesFormat()); } @Override public CompoundFormat compoundFormat() { - return knnFormatFacade.compoundFormat(); + return new KNN80CompoundFormat(delegate.compoundFormat()); } @Override diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN940Codec/KNN940PerFieldKnnVectorsFormat.java b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN940Codec/KNN940PerFieldKnnVectorsFormat.java similarity index 93% rename from src/main/java/org/opensearch/knn/index/codec/KNN940Codec/KNN940PerFieldKnnVectorsFormat.java rename to src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN940Codec/KNN940PerFieldKnnVectorsFormat.java index 1ed9c929c..00b700747 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNN940Codec/KNN940PerFieldKnnVectorsFormat.java +++ b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN940Codec/KNN940PerFieldKnnVectorsFormat.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.knn.index.codec.KNN940Codec; +package org.opensearch.knn.index.codec.backward_codecs.KNN940Codec; import org.apache.lucene.backward_codecs.lucene94.Lucene94HnswVectorsFormat; import org.opensearch.index.mapper.MapperService; diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN950Codec/KNN950Codec.java b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN950Codec/KNN950Codec.java similarity index 58% rename from src/main/java/org/opensearch/knn/index/codec/KNN950Codec/KNN950Codec.java rename to src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN950Codec/KNN950Codec.java index 338e54451..b926a7891 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNN950Codec/KNN950Codec.java +++ b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN950Codec/KNN950Codec.java @@ -3,28 +3,32 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.knn.index.codec.KNN950Codec; +package org.opensearch.knn.index.codec.backward_codecs.KNN950Codec; -import lombok.Builder; +import org.apache.lucene.backward_codecs.lucene95.Lucene95Codec; import org.apache.lucene.codecs.Codec; import org.apache.lucene.codecs.CompoundFormat; import org.apache.lucene.codecs.DocValuesFormat; import org.apache.lucene.codecs.FilterCodec; import org.apache.lucene.codecs.KnnVectorsFormat; import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; -import org.opensearch.knn.index.codec.KNNCodecVersion; -import org.opensearch.knn.index.codec.KNNFormatFacade; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80DocValuesFormat; + +import java.util.Optional; public class KNN950Codec extends FilterCodec { - private static final KNNCodecVersion VERSION = KNNCodecVersion.V_9_5_0; - private final KNNFormatFacade knnFormatFacade; + private static final String NAME = "KNN950Codec"; + private static final Codec DEFAULT_DELEGATE = new Lucene95Codec(); + private static final PerFieldKnnVectorsFormat DEFAULT_KNN_VECTOR_FORMAT = new KNN950PerFieldKnnVectorsFormat(Optional.empty()); + private final PerFieldKnnVectorsFormat perFieldKnnVectorsFormat; /** * No arg constructor that uses Lucene95 as the delegate */ public KNN950Codec() { - this(VERSION.getDefaultCodecDelegate(), VERSION.getPerFieldKnnVectorsFormat()); + this(DEFAULT_DELEGATE, DEFAULT_KNN_VECTOR_FORMAT); } /** @@ -34,21 +38,19 @@ public KNN950Codec() { * @param delegate codec that will perform all operations this codec does not override * @param knnVectorsFormat per field format for KnnVector */ - @Builder - protected KNN950Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat) { - super(VERSION.getCodecName(), delegate); - knnFormatFacade = VERSION.getKnnFormatFacadeSupplier().apply(delegate); + private KNN950Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat) { + super(NAME, delegate); perFieldKnnVectorsFormat = knnVectorsFormat; } @Override public DocValuesFormat docValuesFormat() { - return knnFormatFacade.docValuesFormat(); + return new KNN80DocValuesFormat(delegate.docValuesFormat()); } @Override public CompoundFormat compoundFormat() { - return knnFormatFacade.compoundFormat(); + return new KNN80CompoundFormat(delegate.compoundFormat()); } @Override diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN950Codec/KNN950PerFieldKnnVectorsFormat.java b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN950Codec/KNN950PerFieldKnnVectorsFormat.java similarity index 95% rename from src/main/java/org/opensearch/knn/index/codec/KNN950Codec/KNN950PerFieldKnnVectorsFormat.java rename to src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN950Codec/KNN950PerFieldKnnVectorsFormat.java index 7a1458057..27d251f54 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNN950Codec/KNN950PerFieldKnnVectorsFormat.java +++ b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN950Codec/KNN950PerFieldKnnVectorsFormat.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.knn.index.codec.KNN950Codec; +package org.opensearch.knn.index.codec.backward_codecs.KNN950Codec; import org.apache.lucene.backward_codecs.lucene95.Lucene95HnswVectorsFormat; import org.opensearch.index.mapper.MapperService; diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN990Codec/KNN990Codec.java b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN990Codec/KNN990Codec.java similarity index 60% rename from src/main/java/org/opensearch/knn/index/codec/KNN990Codec/KNN990Codec.java rename to src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN990Codec/KNN990Codec.java index 4b8a1d3cd..68cc76306 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNN990Codec/KNN990Codec.java +++ b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN990Codec/KNN990Codec.java @@ -3,31 +3,35 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.knn.index.codec.KNN990Codec; +package org.opensearch.knn.index.codec.backward_codecs.KNN990Codec; -import lombok.Builder; +import org.apache.lucene.backward_codecs.lucene99.Lucene99Codec; import org.apache.lucene.codecs.Codec; import org.apache.lucene.codecs.CompoundFormat; import org.apache.lucene.codecs.DocValuesFormat; import org.apache.lucene.codecs.FilterCodec; import org.apache.lucene.codecs.KnnVectorsFormat; import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; -import org.opensearch.knn.index.codec.KNNCodecVersion; -import org.opensearch.knn.index.codec.KNNFormatFacade; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; +import org.opensearch.knn.index.codec.KNN80Codec.KNN80DocValuesFormat; + +import java.util.Optional; /** * KNN Codec that wraps the Lucene Codec which is part of Lucene 9.9 */ public class KNN990Codec extends FilterCodec { - private static final KNNCodecVersion VERSION = KNNCodecVersion.V_9_9_0; - private final KNNFormatFacade knnFormatFacade; + private static final String NAME = "KNN990Codec"; + private static final Codec DEFAULT_DELEGATE = new Lucene99Codec(); + private static final PerFieldKnnVectorsFormat DEFAULT_KNN_VECTOR_FORMAT = new KNN990PerFieldKnnVectorsFormat(Optional.empty()); + private final PerFieldKnnVectorsFormat perFieldKnnVectorsFormat; /** * No arg constructor that uses Lucene99 as the delegate */ public KNN990Codec() { - this(VERSION.getDefaultCodecDelegate(), VERSION.getPerFieldKnnVectorsFormat()); + this(DEFAULT_DELEGATE, DEFAULT_KNN_VECTOR_FORMAT); } /** @@ -37,21 +41,19 @@ public KNN990Codec() { * @param delegate codec that will perform all operations this codec does not override * @param knnVectorsFormat per field format for KnnVector */ - @Builder - protected KNN990Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat) { - super(VERSION.getCodecName(), delegate); - knnFormatFacade = VERSION.getKnnFormatFacadeSupplier().apply(delegate); + private KNN990Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat) { + super(NAME, delegate); perFieldKnnVectorsFormat = knnVectorsFormat; } @Override public DocValuesFormat docValuesFormat() { - return knnFormatFacade.docValuesFormat(); + return new KNN80DocValuesFormat(delegate.docValuesFormat()); } @Override public CompoundFormat compoundFormat() { - return knnFormatFacade.compoundFormat(); + return new KNN80CompoundFormat(delegate.compoundFormat()); } @Override diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN990Codec/KNN990PerFieldKnnVectorsFormat.java b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN990Codec/KNN990PerFieldKnnVectorsFormat.java similarity index 96% rename from src/main/java/org/opensearch/knn/index/codec/KNN990Codec/KNN990PerFieldKnnVectorsFormat.java rename to src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN990Codec/KNN990PerFieldKnnVectorsFormat.java index 67ea7b544..39a3c5bc8 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNN990Codec/KNN990PerFieldKnnVectorsFormat.java +++ b/src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN990Codec/KNN990PerFieldKnnVectorsFormat.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.knn.index.codec.KNN990Codec; +package org.opensearch.knn.index.codec.backward_codecs.KNN990Codec; import org.apache.lucene.codecs.lucene99.Lucene99HnswScalarQuantizedVectorsFormat; import org.apache.lucene.codecs.lucene99.Lucene99HnswVectorsFormat; diff --git a/src/main/java/org/opensearch/knn/index/codec/KNN990Codec/UnitTestCodec.java b/src/main/java/org/opensearch/knn/index/codec/util/UnitTestCodec.java similarity index 56% rename from src/main/java/org/opensearch/knn/index/codec/KNN990Codec/UnitTestCodec.java rename to src/main/java/org/opensearch/knn/index/codec/util/UnitTestCodec.java index d651f410a..84c9f4ac9 100644 --- a/src/main/java/org/opensearch/knn/index/codec/KNN990Codec/UnitTestCodec.java +++ b/src/main/java/org/opensearch/knn/index/codec/util/UnitTestCodec.java @@ -1,30 +1,32 @@ /* + * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. */ -package org.opensearch.knn.index.codec.KNN990Codec; +package org.opensearch.knn.index.codec.util; import org.apache.lucene.codecs.FilterCodec; import org.apache.lucene.codecs.KnnVectorsFormat; import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; import org.opensearch.knn.index.codec.KNNCodecVersion; +import java.util.function.Supplier; + /** * This codec is for testing. The reason for putting this codec here is SPI is only scanning the src folder and not * able to pick this class if its in test folder. Don't use this codec outside of testing */ public class UnitTestCodec extends FilterCodec { - private static final Integer BUILD_GRAPH_ALWAYS = 0; + private final Supplier knnVectorsFormatSupplier; public UnitTestCodec() { - super("UnitTestCodec", KNNCodecVersion.current().getDefaultKnnCodecSupplier().get()); + super("UnitTestCodec", KNNCodecVersion.CURRENT_DEFAULT); + this.knnVectorsFormatSupplier = KNNCodecVersion.CURRENT_DEFAULT::knnVectorsFormat; + } + + public UnitTestCodec(Supplier knnVectorsFormatSupplier) { + super("UnitTestCodec", KNNCodecVersion.CURRENT_DEFAULT); + this.knnVectorsFormatSupplier = knnVectorsFormatSupplier; } @Override @@ -32,7 +34,7 @@ public KnnVectorsFormat knnVectorsFormat() { return new PerFieldKnnVectorsFormat() { @Override public KnnVectorsFormat getKnnVectorsFormatForField(String field) { - return new NativeEngines990KnnVectorsFormat(BUILD_GRAPH_ALWAYS); + return knnVectorsFormatSupplier.get(); } }; } diff --git a/src/main/resources/META-INF/services/org.apache.lucene.codecs.Codec b/src/main/resources/META-INF/services/org.apache.lucene.codecs.Codec index e0ed615f7..50380d4b2 100644 --- a/src/main/resources/META-INF/services/org.apache.lucene.codecs.Codec +++ b/src/main/resources/META-INF/services/org.apache.lucene.codecs.Codec @@ -1,12 +1,8 @@ -org.opensearch.knn.index.codec.KNN80Codec.KNN80Codec -org.opensearch.knn.index.codec.KNN84Codec.KNN84Codec -org.opensearch.knn.index.codec.KNN86Codec.KNN86Codec -org.opensearch.knn.index.codec.KNN87Codec.KNN87Codec -org.opensearch.knn.index.codec.KNN910Codec.KNN910Codec -org.opensearch.knn.index.codec.KNN920Codec.KNN920Codec -org.opensearch.knn.index.codec.KNN940Codec.KNN940Codec -org.opensearch.knn.index.codec.KNN950Codec.KNN950Codec -org.opensearch.knn.index.codec.KNN990Codec.KNN990Codec -org.opensearch.knn.index.codec.KNN9120Codec.KNN9120Codec +org.opensearch.knn.index.codec.backward_codecs.KNN910Codec.KNN910Codec +org.opensearch.knn.index.codec.backward_codecs.KNN920Codec.KNN920Codec +org.opensearch.knn.index.codec.backward_codecs.KNN940Codec.KNN940Codec +org.opensearch.knn.index.codec.backward_codecs.KNN950Codec.KNN950Codec +org.opensearch.knn.index.codec.backward_codecs.KNN990Codec.KNN990Codec +org.opensearch.knn.index.codec.backward_codecs.KNN9120Codec.KNN9120Codec org.opensearch.knn.index.codec.KNN10010Codec.KNN10010Codec -org.opensearch.knn.index.codec.KNN990Codec.UnitTestCodec +org.opensearch.knn.index.codec.util.UnitTestCodec diff --git a/src/test/java/org/opensearch/knn/index/codec/KNN10010Codec/KNN10010CodecTests.java b/src/test/java/org/opensearch/knn/index/codec/KNN10010Codec/KNN10010CodecTests.java index 217027613..1ef34c8ca 100644 --- a/src/test/java/org/opensearch/knn/index/codec/KNN10010Codec/KNN10010CodecTests.java +++ b/src/test/java/org/opensearch/knn/index/codec/KNN10010Codec/KNN10010CodecTests.java @@ -20,12 +20,12 @@ public class KNN10010CodecTests extends KNNCodecTestCase { @SneakyThrows public void testMultiFieldsKnnIndex() { - testMultiFieldsKnnIndex(KNN10010Codec.builder().delegate(KNNCodecVersion.V_10_01_0.getDefaultCodecDelegate()).build()); + testMultiFieldsKnnIndex(KNN10010Codec.builder().delegate(KNNCodecVersion.CURRENT_DEFAULT_DELEGATE).build()); } @SneakyThrows public void testBuildFromModelTemplate() { - testBuildFromModelTemplate(KNN10010Codec.builder().delegate(KNNCodecVersion.V_10_01_0.getDefaultCodecDelegate()).build()); + testBuildFromModelTemplate(KNN10010Codec.builder().delegate(KNNCodecVersion.CURRENT_DEFAULT_DELEGATE).build()); } // Ensure that the codec is able to return the correct per field knn vectors format for codec @@ -42,7 +42,7 @@ public void testKnnVectorIndex() { mapperService) -> new KNN9120PerFieldKnnVectorsFormat(Optional.of(mapperService)); Function knnCodecProvider = (knnVectorFormat) -> KNN10010Codec.builder() - .delegate(KNNCodecVersion.V_10_01_0.getDefaultCodecDelegate()) + .delegate(KNNCodecVersion.CURRENT_DEFAULT_DELEGATE) .knnVectorsFormat(knnVectorFormat) .build(); diff --git a/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80CompoundFormatTests.java b/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80CompoundFormatTests.java index b9aca7620..e50954033 100644 --- a/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80CompoundFormatTests.java +++ b/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80CompoundFormatTests.java @@ -16,8 +16,8 @@ import org.junit.BeforeClass; import org.opensearch.common.util.set.Sets; import org.opensearch.knn.KNNTestCase; -import org.opensearch.knn.index.codec.KNN87Codec.KNN87Codec; import org.opensearch.knn.index.codec.KNNCodecTestUtil; +import org.opensearch.knn.index.codec.KNNCodecVersion; import org.opensearch.knn.index.engine.KNNEngine; import java.io.IOException; @@ -36,7 +36,7 @@ public class KNN80CompoundFormatTests extends KNNTestCase { @BeforeClass public static void setStaticVariables() { directory = newFSDirectory(createTempDir()); - codec = new KNN87Codec(); + codec = KNNCodecVersion.CURRENT_DEFAULT; } @AfterClass diff --git a/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80DocValuesConsumerTests.java b/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80DocValuesConsumerTests.java index c11bc765f..1d0318bdb 100644 --- a/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80DocValuesConsumerTests.java +++ b/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80DocValuesConsumerTests.java @@ -27,6 +27,7 @@ import org.opensearch.common.xcontent.XContentFactory; import org.opensearch.knn.KNNTestCase; import org.opensearch.knn.common.KNNConstants; +import org.opensearch.knn.index.codec.KNNCodecVersion; import org.opensearch.knn.index.engine.KNNMethodConfigContext; import org.opensearch.knn.index.engine.KNNMethodContext; import org.opensearch.knn.index.VectorDataType; @@ -36,7 +37,6 @@ import org.opensearch.knn.index.mapper.KNNVectorFieldMapper; import org.opensearch.knn.index.engine.MethodComponentContext; import org.opensearch.knn.index.SpaceType; -import org.opensearch.knn.index.codec.KNN87Codec.KNN87Codec; import org.opensearch.knn.index.codec.KNNCodecTestUtil; import org.opensearch.knn.index.codec.util.KNNCodecUtil; import org.opensearch.knn.index.engine.KNNEngine; @@ -87,7 +87,7 @@ public class KNN80DocValuesConsumerTests extends KNNTestCase { @BeforeClass public static void setStaticVariables() { directory = newFSDirectory(createTempDir()); - codec = new KNN87Codec(); + codec = KNNCodecVersion.CURRENT_DEFAULT; } @AfterClass diff --git a/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80DocValuesProducerTests.java b/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80DocValuesProducerTests.java index 6b18c51c3..012424421 100644 --- a/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80DocValuesProducerTests.java +++ b/src/test/java/org/opensearch/knn/index/codec/KNN80Codec/KNN80DocValuesProducerTests.java @@ -24,7 +24,8 @@ import org.opensearch.knn.common.KNNConstants; import org.opensearch.knn.index.SpaceType; import org.opensearch.knn.index.VectorDataType; -import org.opensearch.knn.index.codec.KNN87Codec.KNN87Codec; +import org.opensearch.knn.index.codec.KNN10010Codec.KNN10010Codec; +import org.opensearch.knn.index.codec.KNN9120Codec.KNN9120PerFieldKnnVectorsFormat; import org.opensearch.knn.index.codec.KNNCodecTestUtil; import org.opensearch.knn.index.engine.KNNEngine; import org.opensearch.knn.index.engine.KNNMethodConfigContext; @@ -35,6 +36,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; +import java.util.Optional; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; @@ -67,7 +69,7 @@ public void testProduceKNNBinaryField_fromCodec_nmslibCurrent() throws IOExcepti when(mockDelegateCodec.docValuesFormat()).thenReturn(mockDocValuesFormat); when(mockDocValuesFormat.fieldsProducer(any())).thenReturn(mockDocValuesProducer); when(mockDocValuesFormat.getName()).thenReturn("mockDocValuesFormat"); - Codec codec = new KNN87Codec(mockDelegateCodec); + Codec codec = new KNN10010Codec(mockDelegateCodec, new KNN9120PerFieldKnnVectorsFormat(Optional.empty()), null); String segmentName = "_test"; int docsInSegment = 100; @@ -136,7 +138,7 @@ public void testProduceKNNBinaryField_whenFieldHasNonBinaryDocValues_thenSkipTho when(mockDelegateCodec.docValuesFormat()).thenReturn(mockDocValuesFormat); when(mockDocValuesFormat.fieldsProducer(any())).thenReturn(mockDocValuesProducer); when(mockDocValuesFormat.getName()).thenReturn("mockDocValuesFormat"); - Codec codec = new KNN87Codec(mockDelegateCodec); + Codec codec = new KNN10010Codec(mockDelegateCodec, new KNN9120PerFieldKnnVectorsFormat(Optional.empty()), null); String segmentName = "_test"; int docsInSegment = 100; diff --git a/src/test/java/org/opensearch/knn/index/codec/KNN87Codec/KNN87CodecTests.java b/src/test/java/org/opensearch/knn/index/codec/KNN87Codec/KNN87CodecTests.java deleted file mode 100644 index ff93fd3a8..000000000 --- a/src/test/java/org/opensearch/knn/index/codec/KNN87Codec/KNN87CodecTests.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.opensearch.knn.index.codec.KNN87Codec; - -import org.opensearch.knn.index.codec.KNNCodecTestCase; - -public class KNN87CodecTests extends KNNCodecTestCase { - - public void testWriteByOldCodec() throws Exception { - testWriteByOldCodec(new KNN87Codec()); - } -} diff --git a/src/test/java/org/opensearch/knn/index/codec/KNN990Codec/KNN990CodecTests.java b/src/test/java/org/opensearch/knn/index/codec/KNN990Codec/KNN990CodecTests.java deleted file mode 100644 index 307ebbb24..000000000 --- a/src/test/java/org/opensearch/knn/index/codec/KNN990Codec/KNN990CodecTests.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.opensearch.knn.index.codec.KNN990Codec; - -import lombok.SneakyThrows; -import org.apache.lucene.codecs.Codec; -import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; -import org.opensearch.index.mapper.MapperService; -import org.opensearch.knn.index.codec.KNNCodecTestCase; - -import java.util.Optional; -import java.util.function.Function; - -import static org.opensearch.knn.index.codec.KNNCodecVersion.V_9_9_0; - -public class KNN990CodecTests extends KNNCodecTestCase { - - @SneakyThrows - public void testMultiFieldsKnnIndex() { - testMultiFieldsKnnIndex(KNN990Codec.builder().delegate(V_9_9_0.getDefaultCodecDelegate()).build()); - } - - @SneakyThrows - public void testBuildFromModelTemplate() { - testBuildFromModelTemplate((KNN990Codec.builder().delegate(V_9_9_0.getDefaultCodecDelegate()).build())); - } - - // Ensure that the codec is able to return the correct per field knn vectors format for codec - public void testCodecSetsCustomPerFieldKnnVectorsFormat() { - final Codec codec = new KNN990Codec(); - assertTrue(codec.knnVectorsFormat() instanceof KNN990PerFieldKnnVectorsFormat); - } - - // IMPORTANT: When this Codec is moved to a backwards Codec, this test needs to be removed, because it attempts to - // write with a read only codec, which will fail - @SneakyThrows - public void testKnnVectorIndex() { - Function perFieldKnnVectorsFormatProvider = ( - mapperService) -> new KNN990PerFieldKnnVectorsFormat(Optional.of(mapperService)); - - Function knnCodecProvider = (knnVectorFormat) -> KNN990Codec.builder() - .delegate(V_9_9_0.getDefaultCodecDelegate()) - .knnVectorsFormat(knnVectorFormat) - .build(); - - testKnnVectorIndex(knnCodecProvider, perFieldKnnVectorsFormatProvider); - } -} diff --git a/src/test/java/org/opensearch/knn/index/codec/KNN990Codec/NativeEngines990KnnVectorsFormatTests.java b/src/test/java/org/opensearch/knn/index/codec/KNN990Codec/NativeEngines990KnnVectorsFormatTests.java index cf7d7f8f7..cc3da2d00 100644 --- a/src/test/java/org/opensearch/knn/index/codec/KNN990Codec/NativeEngines990KnnVectorsFormatTests.java +++ b/src/test/java/org/opensearch/knn/index/codec/KNN990Codec/NativeEngines990KnnVectorsFormatTests.java @@ -61,6 +61,7 @@ import org.opensearch.knn.common.KNNConstants; import org.opensearch.knn.index.SpaceType; import org.opensearch.knn.index.VectorDataType; +import org.opensearch.knn.index.codec.util.UnitTestCodec; import org.opensearch.knn.index.engine.KNNEngine; import org.opensearch.knn.index.engine.qframe.QuantizationConfig; import org.opensearch.knn.index.engine.qframe.QuantizationConfigParser; @@ -80,7 +81,7 @@ @Log4j2 public class NativeEngines990KnnVectorsFormatTests extends KNNTestCase { - private static final Codec TESTING_CODEC = new UnitTestCodec(); + private static final Codec TESTING_CODEC = new UnitTestCodec(() -> new NativeEngines990KnnVectorsFormat(0)); private static final String FLAT_VECTOR_FILE_EXT = ".vec"; private static final String FAISS_ENGINE_FILE_EXT = ".faiss"; private static final String FLOAT_VECTOR_FIELD = "float_field"; diff --git a/src/test/java/org/opensearch/knn/index/codec/KNNCodecFactoryTests.java b/src/test/java/org/opensearch/knn/index/codec/KNNCodecFactoryTests.java deleted file mode 100644 index 29dae6085..000000000 --- a/src/test/java/org/opensearch/knn/index/codec/KNNCodecFactoryTests.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.opensearch.knn.index.codec; - -import org.apache.lucene.backward_codecs.lucene92.Lucene92Codec; -import org.apache.lucene.codecs.Codec; -import org.apache.lucene.backward_codecs.lucene91.Lucene91Codec; -import org.apache.lucene.backward_codecs.lucene94.Lucene94Codec; -import org.apache.lucene.backward_codecs.lucene95.Lucene95Codec; -import org.opensearch.knn.KNNTestCase; - -import static org.opensearch.knn.index.codec.KNNCodecVersion.V_9_1_0; -import static org.opensearch.knn.index.codec.KNNCodecVersion.V_9_2_0; -import static org.opensearch.knn.index.codec.KNNCodecVersion.V_9_4_0; -import static org.opensearch.knn.index.codec.KNNCodecVersion.V_9_5_0; - -public class KNNCodecFactoryTests extends KNNTestCase { - - public void testKNN910Codec() { - assertDelegateForVersion(V_9_1_0, Lucene91Codec.class); - assertNull(V_9_1_0.getPerFieldKnnVectorsFormat()); - assertNotNull(V_9_1_0.getKnnFormatFacadeSupplier().apply(V_9_1_0.getDefaultCodecDelegate())); - } - - public void testKNN920Codec() { - assertDelegateForVersion(V_9_2_0, Lucene92Codec.class); - assertNotNull(V_9_2_0.getPerFieldKnnVectorsFormat()); - assertNotNull(V_9_2_0.getKnnFormatFacadeSupplier().apply(V_9_2_0.getDefaultCodecDelegate())); - } - - public void testKNN940Codec() { - assertDelegateForVersion(V_9_4_0, Lucene94Codec.class); - assertNotNull(V_9_4_0.getPerFieldKnnVectorsFormat()); - assertNotNull(V_9_4_0.getKnnFormatFacadeSupplier().apply(V_9_4_0.getDefaultCodecDelegate())); - } - - public void testKNN950Codec() { - assertDelegateForVersion(V_9_5_0, Lucene95Codec.class); - assertNotNull(V_9_5_0.getPerFieldKnnVectorsFormat()); - assertNotNull(V_9_5_0.getKnnFormatFacadeSupplier().apply(V_9_5_0.getDefaultCodecDelegate())); - } - - private void assertDelegateForVersion(final KNNCodecVersion codecVersion, final Class expectedCodecClass) { - final Codec defaultDelegate = codecVersion.getDefaultCodecDelegate(); - assertNotNull(defaultDelegate); - assertTrue(defaultDelegate.getClass().isAssignableFrom(expectedCodecClass)); - } -} diff --git a/src/test/java/org/opensearch/knn/index/codec/KNNCodecServiceTests.java b/src/test/java/org/opensearch/knn/index/codec/KNNCodecServiceTests.java index f16f1c62d..b6967b5b9 100644 --- a/src/test/java/org/opensearch/knn/index/codec/KNNCodecServiceTests.java +++ b/src/test/java/org/opensearch/knn/index/codec/KNNCodecServiceTests.java @@ -47,7 +47,7 @@ public void testGetCodecByName() { Logger loggerMock = mock(Logger.class); CodecServiceConfig codecServiceConfig = new CodecServiceConfig(indexSettings, mapperService, loggerMock); KNNCodecService knnCodecService = new KNNCodecService(codecServiceConfig, mock(NativeIndexBuildStrategyFactory.class)); - Codec codec = knnCodecService.codec(KNNCodecVersion.current().getCodecName()); + Codec codec = knnCodecService.codec(KNNCodecVersion.CURRENT_DEFAULT_DELEGATE.getName()); assertNotNull(codec); } @@ -62,7 +62,7 @@ public void testGetCodecByNameWithNoMapperService() { Logger loggerMock = mock(Logger.class); CodecServiceConfig codecServiceConfig = new CodecServiceConfig(indexSettings, null, loggerMock); KNNCodecService knnCodecService = new KNNCodecService(codecServiceConfig, mock(NativeIndexBuildStrategyFactory.class)); - Codec codec = knnCodecService.codec(KNNCodecVersion.current().getCodecName()); + Codec codec = knnCodecService.codec(KNNCodecVersion.CURRENT_DEFAULT_DELEGATE.getName()); assertNotNull(codec); } } diff --git a/src/test/java/org/opensearch/knn/index/query/ExactSearcherTests.java b/src/test/java/org/opensearch/knn/index/query/ExactSearcherTests.java index a4b853560..3de9bf878 100644 --- a/src/test/java/org/opensearch/knn/index/query/ExactSearcherTests.java +++ b/src/test/java/org/opensearch/knn/index/query/ExactSearcherTests.java @@ -155,7 +155,7 @@ public void testRadialSearch_whenNoEngineFiles_thenSuccess() { 100, false, false, - KNNCodecVersion.current().getDefaultCodecDelegate(), + KNNCodecVersion.CURRENT_DEFAULT, Map.of(), new byte[StringHelper.ID_LENGTH], Map.of(), diff --git a/src/test/java/org/opensearch/knn/index/query/KNNWeightTests.java b/src/test/java/org/opensearch/knn/index/query/KNNWeightTests.java index 7a1da8781..8dbddd276 100644 --- a/src/test/java/org/opensearch/knn/index/query/KNNWeightTests.java +++ b/src/test/java/org/opensearch/knn/index/query/KNNWeightTests.java @@ -41,11 +41,11 @@ import org.opensearch.knn.KNNTestCase; import org.opensearch.knn.index.KNNSettings; import org.opensearch.knn.index.codec.KNN990Codec.QuantizationConfigKNNCollector; +import org.opensearch.knn.index.codec.KNNCodecVersion; import org.opensearch.knn.index.codec.util.KNNCodecUtil; import org.opensearch.knn.index.engine.MethodComponentContext; import org.opensearch.knn.index.SpaceType; import org.opensearch.knn.index.VectorDataType; -import org.opensearch.knn.index.codec.KNNCodecVersion; import org.opensearch.knn.index.codec.util.KNNVectorAsArraySerializer; import org.opensearch.knn.index.memory.NativeMemoryAllocation; import org.opensearch.knn.index.memory.NativeMemoryCacheManager; @@ -271,7 +271,7 @@ public void testQueryScoreForFaissWithModel() { 100, true, false, - KNNCodecVersion.current().getDefaultCodecDelegate(), + KNNCodecVersion.CURRENT_DEFAULT, Map.of(), new byte[StringHelper.ID_LENGTH], Map.of(), @@ -362,7 +362,7 @@ public void testScorer_whenNoVectorFieldsInDocument_thenEmptyScorerIsReturned() 100, false, false, - KNNCodecVersion.current().getDefaultCodecDelegate(), + KNNCodecVersion.CURRENT_DEFAULT, Map.of(), new byte[StringHelper.ID_LENGTH], Map.of(), @@ -405,7 +405,7 @@ public void testEmptyQueryResults() { 100, true, false, - KNNCodecVersion.current().getDefaultCodecDelegate(), + KNNCodecVersion.CURRENT_DEFAULT, Map.of(), new byte[StringHelper.ID_LENGTH], Map.of(), @@ -590,7 +590,7 @@ public void testScorerWithQuantizedVector() { 100, // Max document count for this segment false, // Is this a compound file segment false, // Is this a merged segment - KNNCodecVersion.current().getDefaultCodecDelegate(), // Codec delegate for KNN + KNNCodecVersion.CURRENT_DEFAULT, Map.of(), // Diagnostics map new byte[StringHelper.ID_LENGTH], // Segment ID Map.of(), // Attributes @@ -862,7 +862,7 @@ private SegmentReader mockSegmentReader() { 100, true, false, - KNNCodecVersion.current().getDefaultCodecDelegate(), + KNNCodecVersion.CURRENT_DEFAULT, Map.of(), new byte[StringHelper.ID_LENGTH], Map.of(), @@ -993,7 +993,7 @@ public void testRadialSearch_whenNoEngineFiles_thenPerformExactSearch() { 100, false, false, - KNNCodecVersion.current().getDefaultCodecDelegate(), + KNNCodecVersion.CURRENT_DEFAULT, Map.of(), new byte[StringHelper.ID_LENGTH], Map.of(), @@ -1438,7 +1438,7 @@ public void testDoANNSearch_whenRadialIsDefined_thenCallJniRadiusQueryIndex() { 100, true, false, - KNNCodecVersion.current().getDefaultCodecDelegate(), + KNNCodecVersion.CURRENT_DEFAULT, Map.of(), new byte[StringHelper.ID_LENGTH], Map.of(), @@ -1515,7 +1515,7 @@ private SegmentReader getMockedSegmentReader() { 100, true, false, - KNNCodecVersion.current().getDefaultCodecDelegate(), + KNNCodecVersion.CURRENT_DEFAULT, Map.of(), new byte[StringHelper.ID_LENGTH], Map.of(), @@ -1580,7 +1580,7 @@ private void testQueryScore( 100, true, false, - KNNCodecVersion.current().getDefaultCodecDelegate(), + KNNCodecVersion.CURRENT_DEFAULT, Map.of(), new byte[StringHelper.ID_LENGTH], Map.of(),