From e1d689b3b11fc485d071d9f4582ffff1d5aacb51 Mon Sep 17 00:00:00 2001 From: Shubham Chaudhary Date: Thu, 23 Oct 2025 16:21:48 -0400 Subject: [PATCH] Add checkDimension check to Lucene104ScalarQuantizedVectorScorer#getRandomVectorScorer --- .../apache/lucene/codecs/hnsw/FlatVectorsScorer.java | 7 +++++++ .../Lucene104ScalarQuantizedVectorScorer.java | 10 ++-------- .../lucene99/Lucene99ScalarQuantizedVectorScorer.java | 9 +-------- .../Lucene99MemorySegmentFlatVectorsScorer.java | 11 ++--------- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/lucene/core/src/java/org/apache/lucene/codecs/hnsw/FlatVectorsScorer.java b/lucene/core/src/java/org/apache/lucene/codecs/hnsw/FlatVectorsScorer.java index 6ed170731de4..969c624c880e 100644 --- a/lucene/core/src/java/org/apache/lucene/codecs/hnsw/FlatVectorsScorer.java +++ b/lucene/core/src/java/org/apache/lucene/codecs/hnsw/FlatVectorsScorer.java @@ -67,4 +67,11 @@ RandomVectorScorer getRandomVectorScorer( RandomVectorScorer getRandomVectorScorer( VectorSimilarityFunction similarityFunction, KnnVectorValues vectorValues, byte[] target) throws IOException; + + static void checkDimensions(int queryLen, int fieldLen) { + if (queryLen != fieldLen) { + throw new IllegalArgumentException( + "vector query dimension: " + queryLen + " differs from field dimension: " + fieldLen); + } + } } diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene104/Lucene104ScalarQuantizedVectorScorer.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene104/Lucene104ScalarQuantizedVectorScorer.java index db2021a2a0e5..642d88251226 100644 --- a/lucene/core/src/java/org/apache/lucene/codecs/lucene104/Lucene104ScalarQuantizedVectorScorer.java +++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene104/Lucene104ScalarQuantizedVectorScorer.java @@ -39,13 +39,6 @@ public Lucene104ScalarQuantizedVectorScorer(FlatVectorsScorer nonQuantizedDelega this.nonQuantizedDelegate = nonQuantizedDelegate; } - static void checkDimensions(int queryLen, int fieldLen) { - if (queryLen != fieldLen) { - throw new IllegalArgumentException( - "vector query dimension: " + queryLen + " differs from field dimension: " + fieldLen); - } - } - @Override public RandomVectorScorerSupplier getRandomVectorScorerSupplier( VectorSimilarityFunction similarityFunction, KnnVectorValues vectorValues) @@ -62,7 +55,7 @@ public RandomVectorScorer getRandomVectorScorer( VectorSimilarityFunction similarityFunction, KnnVectorValues vectorValues, float[] target) throws IOException { if (vectorValues instanceof QuantizedByteVectorValues qv) { - checkDimensions(target.length, qv.dimension()); + FlatVectorsScorer.checkDimensions(target.length, qv.dimension()); OptimizedScalarQuantizer quantizer = qv.getQuantizer(); Lucene104ScalarQuantizedVectorsFormat.ScalarEncoding scalarEncoding = qv.getScalarEncoding(); byte[] scratch = new byte[scalarEncoding.getDiscreteDimensions(qv.dimension())]; @@ -103,6 +96,7 @@ public float score(int node) throws IOException { public RandomVectorScorer getRandomVectorScorer( VectorSimilarityFunction similarityFunction, KnnVectorValues vectorValues, byte[] target) throws IOException { + FlatVectorsScorer.checkDimensions(target.length, vectorValues.dimension()); return nonQuantizedDelegate.getRandomVectorScorer(similarityFunction, vectorValues, target); } diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene99/Lucene99ScalarQuantizedVectorScorer.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene99/Lucene99ScalarQuantizedVectorScorer.java index 80afaf5c685a..a668c01de6bf 100644 --- a/lucene/core/src/java/org/apache/lucene/codecs/lucene99/Lucene99ScalarQuantizedVectorScorer.java +++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene99/Lucene99ScalarQuantizedVectorScorer.java @@ -95,7 +95,7 @@ static UpdateableRandomVectorScorer fromVectorSimilarity( VectorSimilarityFunction sim, float constMultiplier, QuantizedByteVectorValues values) { - checkDimensions(targetBytes.length, values.dimension()); + FlatVectorsScorer.checkDimensions(values.dimension(), targetBytes.length); return switch (sim) { case EUCLIDEAN -> new Euclidean(values, constMultiplier, targetBytes); case COSINE, DOT_PRODUCT -> @@ -115,13 +115,6 @@ static UpdateableRandomVectorScorer fromVectorSimilarity( }; } - static void checkDimensions(int queryLen, int fieldLen) { - if (queryLen != fieldLen) { - throw new IllegalArgumentException( - "vector query dimension: " + queryLen + " differs from field dimension: " + fieldLen); - } - } - private static UpdateableRandomVectorScorer.AbstractUpdateableRandomVectorScorer dotProductFactory( byte[] targetBytes, diff --git a/lucene/core/src/java25/org/apache/lucene/internal/vectorization/Lucene99MemorySegmentFlatVectorsScorer.java b/lucene/core/src/java25/org/apache/lucene/internal/vectorization/Lucene99MemorySegmentFlatVectorsScorer.java index 8f60de6cda13..ade4a248c0db 100644 --- a/lucene/core/src/java25/org/apache/lucene/internal/vectorization/Lucene99MemorySegmentFlatVectorsScorer.java +++ b/lucene/core/src/java25/org/apache/lucene/internal/vectorization/Lucene99MemorySegmentFlatVectorsScorer.java @@ -84,7 +84,7 @@ private RandomVectorScorerSupplier getByteScorerSupplier( public RandomVectorScorer getRandomVectorScorer( VectorSimilarityFunction similarityType, KnnVectorValues vectorValues, float[] target) throws IOException { - checkDimensions(target.length, vectorValues.dimension()); + FlatVectorsScorer.checkDimensions(target.length, vectorValues.dimension()); if (vectorValues instanceof FloatVectorValues fvv && fvv instanceof HasIndexSlice floatVectorValues && floatVectorValues.getSlice() != null) { @@ -102,7 +102,7 @@ public RandomVectorScorer getRandomVectorScorer( public RandomVectorScorer getRandomVectorScorer( VectorSimilarityFunction similarityType, KnnVectorValues vectorValues, byte[] queryVector) throws IOException { - checkDimensions(queryVector.length, vectorValues.dimension()); + FlatVectorsScorer.checkDimensions(queryVector.length, vectorValues.dimension()); // a quantized values here is a wrapping or delegation issue assert !(vectorValues instanceof QuantizedByteVectorValues); if (vectorValues instanceof ByteVectorValues bvv @@ -118,13 +118,6 @@ public RandomVectorScorer getRandomVectorScorer( return delegate.getRandomVectorScorer(similarityType, vectorValues, queryVector); } - static void checkDimensions(int queryLen, int fieldLen) { - if (queryLen != fieldLen) { - throw new IllegalArgumentException( - "vector query dimension: " + queryLen + " differs from field dimension: " + fieldLen); - } - } - @Override public String toString() { return "Lucene99MemorySegmentFlatVectorsScorer()";