This is an automated email from the ASF dual-hosted git repository. ishan pushed a commit to branch jira/solr-17927 in repository https://gitbox.apache.org/repos/asf/solr.git
commit d90ef9983c816397ac03752cbabbe385890945d1 Author: punAhuja <[email protected]> AuthorDate: Mon Sep 29 10:08:34 2025 +0530 Modified tests to expect new behaviour of added default efSearch parameter --- .../org/apache/solr/schema/DenseVectorField.java | 57 +++++++++++++--------- .../org/apache/solr/search/vector/KnnQParser.java | 7 ++- .../apache/solr/search/vector/KnnQParserTest.java | 16 +++--- .../search/TextToVectorQParserTest.java | 2 +- 4 files changed, 49 insertions(+), 33 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java index c35527cfec2..01c51a358d2 100644 --- a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java +++ b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java @@ -511,29 +511,40 @@ public class DenseVectorField extends FloatPointField { DenseVectorParser vectorBuilder = getVectorBuilder(vectorToSearch, DenseVectorParser.BuilderPhase.QUERY); - final Query knnQuery = - switch (vectorEncoding) { - case FLOAT32 -> new SolrKnnFloatVectorQuery( - fieldName, vectorBuilder.getFloatVector(), topK, efSearch, filterQuery); - case BYTE -> new SolrKnnByteVectorQuery( - fieldName, vectorBuilder.getByteVector(), topK, efSearch, filterQuery); - }; - - final boolean seedEnabled = (seedQuery != null); - final boolean earlyTerminationEnabled = - (earlyTermination != null && earlyTermination.isEnabled()); - - int caseNumber = (seedEnabled ? 1 : 0) + (earlyTerminationEnabled ? 2 : 0); - return switch (caseNumber) { - // 0: no seed, no early termination -> knnQuery - default -> knnQuery; - // 1: only seed -> Seeded(knnQuery) - case 1 -> getSeededQuery(knnQuery, seedQuery); - // 2: only early termination -> Patience(knnQuery) - case 2 -> getEarlyTerminationQuery(knnQuery, earlyTermination); - // 3: seed + early termination -> Patience(Seeded(knnQuery)) - case 3 -> getEarlyTerminationQuery(getSeededQuery(knnQuery, seedQuery), earlyTermination); - }; + switch (vectorEncoding) { + case FLOAT32: + SolrKnnFloatVectorQuery knnFloatVectorQuery = + new SolrKnnFloatVectorQuery( + fieldName, vectorBuilder.getFloatVector(), topK, efSearch, filterQuery); + if (earlyTermination.isEnabled()) { + return (earlyTermination.getSaturationThreshold() != null + && earlyTermination.getPatience() != null) + ? PatienceKnnVectorQuery.fromFloatQuery( + knnFloatVectorQuery, + earlyTermination.getSaturationThreshold(), + earlyTermination.getPatience()) + : PatienceKnnVectorQuery.fromFloatQuery(knnFloatVectorQuery); + } + return knnFloatVectorQuery; + case BYTE: + SolrKnnByteVectorQuery knnByteVectorQuery = + new SolrKnnByteVectorQuery( + fieldName, vectorBuilder.getByteVector(), topK, efSearch, filterQuery); + if (earlyTermination.isEnabled()) { + return (earlyTermination.getSaturationThreshold() != null + && earlyTermination.getPatience() != null) + ? PatienceKnnVectorQuery.fromByteQuery( + knnByteVectorQuery, + earlyTermination.getSaturationThreshold(), + earlyTermination.getPatience()) + : PatienceKnnVectorQuery.fromByteQuery(knnByteVectorQuery); + } + return knnByteVectorQuery; + default: + throw new SolrException( + SolrException.ErrorCode.SERVER_ERROR, + "Unexpected state. Vector Encoding: " + vectorEncoding); + } } /** diff --git a/solr/core/src/java/org/apache/solr/search/vector/KnnQParser.java b/solr/core/src/java/org/apache/solr/search/vector/KnnQParser.java index 65b5650ba38..95afb3ef18f 100644 --- a/solr/core/src/java/org/apache/solr/search/vector/KnnQParser.java +++ b/solr/core/src/java/org/apache/solr/search/vector/KnnQParser.java @@ -111,6 +111,11 @@ public class KnnQParser extends AbstractVectorQParserBase { final int efSearch = localParams.getInt("ef-search", topK * 2); return denseVectorType.getKnnVectorQuery( - schemaField.getName(), vectorToSearch, topK, efSearch, getFilterQuery(), getEarlyTerminationParams()); + schemaField.getName(), + vectorToSearch, + topK, + efSearch, + getFilterQuery(), + getEarlyTerminationParams()); } } diff --git a/solr/core/src/test/org/apache/solr/search/vector/KnnQParserTest.java b/solr/core/src/test/org/apache/solr/search/vector/KnnQParserTest.java index 35920c882c2..ca13e9fe02e 100644 --- a/solr/core/src/test/org/apache/solr/search/vector/KnnQParserTest.java +++ b/solr/core/src/test/org/apache/solr/search/vector/KnnQParserTest.java @@ -975,7 +975,7 @@ public class KnnQParserTest extends SolrTestCaseJ4 { } @Test - public void testKnnFloatWithoutExplicitlyEarlyTermination_returnsKnnFloatVectorQuery() { + public void testKnnFloatWithoutExplicitlyEarlyTermination_returnsSolrKnnFloatVectorQuery() { // It verifies that when no early termination parameters are provided, // the default behavior is applied (early termination is disabled), and no special logic is // triggered. @@ -990,11 +990,11 @@ public class KnnQParserTest extends SolrTestCaseJ4 { "debugQuery", "true"), "//result[@numFound='5']", - "//str[@name='parsedquery'][.='KnnFloatVectorQuery(KnnFloatVectorQuery:vector[1.0,...][5])']"); + "//str[@name='parsedquery'][.='SolrKnnFloatVectorQuery(SolrKnnFloatVectorQuery:vector[1.0,...][10])']"); } @Test - public void testKnnFloatWithoutEarlyTermination_returnsKnnFloatVectorQuery() { + public void testKnnFloatWithoutEarlyTermination_returnsSolrKnnFloatVectorQuery() { // It verifies that when early termination is explicitly set to false, no special logic is // triggered. String vectorToSearch = "[1.0, 2.0, 3.0, 4.0]"; @@ -1008,7 +1008,7 @@ public class KnnQParserTest extends SolrTestCaseJ4 { "debugQuery", "true"), "//result[@numFound='5']", - "//str[@name='parsedquery'][.='KnnFloatVectorQuery(KnnFloatVectorQuery:vector[1.0,...][5])']"); + "//str[@name='parsedquery'][.='SolrKnnFloatVectorQuery(SolrKnnFloatVectorQuery:vector[1.0,...][10])']"); } @Test @@ -1029,7 +1029,7 @@ public class KnnQParserTest extends SolrTestCaseJ4 { String expectedParsedQuery = String.format( Locale.US, - "PatienceKnnVectorQuery(PatienceKnnVectorQuery{saturationThreshold=%.3f, patience=%d, delegate=KnnFloatVectorQuery:vector[1.0,...][10]})", + "PatienceKnnVectorQuery(PatienceKnnVectorQuery{saturationThreshold=%.3f, patience=%d, delegate=SolrKnnFloatVectorQuery:vector[1.0,...][20]})", defaultSaturationThreshold, defaultPatience); @@ -1068,7 +1068,7 @@ public class KnnQParserTest extends SolrTestCaseJ4 { String expectedParsedQuery = String.format( Locale.US, - "PatienceKnnVectorQuery(PatienceKnnVectorQuery{saturationThreshold=%.3f, patience=%d, delegate=KnnFloatVectorQuery:vector[1.0,...][10]})", + "PatienceKnnVectorQuery(PatienceKnnVectorQuery{saturationThreshold=%.3f, patience=%d, delegate=SolrKnnFloatVectorQuery:vector[1.0,...][20]})", explicitSaturationThreshold, explicitPatience); @@ -1101,7 +1101,7 @@ public class KnnQParserTest extends SolrTestCaseJ4 { String expectedParsedQuery = String.format( Locale.US, - "PatienceKnnVectorQuery(PatienceKnnVectorQuery{saturationThreshold=%.3f, patience=%d, delegate=KnnByteVectorQuery:vector_byte_encoding[2,...][5]})", + "PatienceKnnVectorQuery(PatienceKnnVectorQuery{saturationThreshold=%.3f, patience=%d, delegate=SolrKnnByteVectorQuery:vector_byte_encoding[2,...][10]})", explicitSaturationThreshold, explicitPatience); @@ -1133,7 +1133,7 @@ public class KnnQParserTest extends SolrTestCaseJ4 { String expectedParsedQuery = String.format( Locale.US, - "PatienceKnnVectorQuery(PatienceKnnVectorQuery{saturationThreshold=%.3f, patience=%d, delegate=KnnFloatVectorQuery:vector[1.0,...][10]})", + "PatienceKnnVectorQuery(PatienceKnnVectorQuery{saturationThreshold=%.3f, patience=%d, delegate=SolrKnnFloatVectorQuery:vector[1.0,...][20]})", explicitSaturationThreshold, explicitPatience); diff --git a/solr/modules/language-models/src/test/org/apache/solr/languagemodels/textvectorisation/search/TextToVectorQParserTest.java b/solr/modules/language-models/src/test/org/apache/solr/languagemodels/textvectorisation/search/TextToVectorQParserTest.java index bfe42e30842..1756554aa20 100644 --- a/solr/modules/language-models/src/test/org/apache/solr/languagemodels/textvectorisation/search/TextToVectorQParserTest.java +++ b/solr/modules/language-models/src/test/org/apache/solr/languagemodels/textvectorisation/search/TextToVectorQParserTest.java @@ -406,7 +406,7 @@ public class TextToVectorQParserTest extends TestLanguageModelBase { String expectedParsedQuery = String.format( Locale.US, - "PatienceKnnVectorQuery(PatienceKnnVectorQuery{saturationThreshold=%.3f, patience=%d, delegate=KnnFloatVectorQuery:vector[1.0,...][5]})", + "PatienceKnnVectorQuery(PatienceKnnVectorQuery{saturationThreshold=%.3f, patience=%d, delegate=SolrKnnFloatVectorQuery:vector[1.0,...][10]})", defaultSaturationThreshold, defaultPatience);
