From fbd8ccccc74c6d52dc78a80a2b3c016cafa921f6 Mon Sep 17 00:00:00 2001 From: fherpich Date: Sun, 16 Nov 2025 22:05:30 +0100 Subject: [PATCH 1/4] Support "Hybrid" parameter in `IndexSearchRequest` and add tests for it --- .../meilisearch/sdk/IndexSearchRequest.java | 6 ++ .../sdk/IndexSearchRequestTest.java | 57 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java diff --git a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java index 8e35ab3e2..ded6957a2 100644 --- a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java +++ b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java @@ -1,5 +1,6 @@ package com.meilisearch.sdk; +import com.meilisearch.sdk.model.Hybrid; import com.meilisearch.sdk.model.MatchingStrategy; import lombok.*; import lombok.experimental.Accessors; @@ -38,6 +39,7 @@ public class IndexSearchRequest { private FederationOptions federationOptions; protected String[] locales; protected String distinct; + protected Hybrid hybrid; protected Boolean retrieveVectors; /** @@ -110,6 +112,10 @@ public String toString() { .putOpt("distinct", this.distinct) .putOpt("retrieveVectors", this.retrieveVectors); + if (this.hybrid != null) { + jsonObject.put("hybrid", this.hybrid.toJSONObject()); + } + return jsonObject.toString(); } } diff --git a/src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java b/src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java new file mode 100644 index 000000000..b38743890 --- /dev/null +++ b/src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java @@ -0,0 +1,57 @@ +package com.meilisearch.sdk; + +import com.meilisearch.sdk.model.Hybrid; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; + +class IndexIndexSearchRequestTest { + @Test + void toStringWithHybridUsingBuilder() { + IndexSearchRequest classToTest = + IndexSearchRequest.builder() + .q("This is a Test") + .hybrid(Hybrid.builder().semanticRatio(0.5).embedder("default").build()) + .build(); + + String expected = + "{\"q\":\"This is a Test\",\"hybrid\":{\"semanticRatio\":0.5,\"embedder\":\"default\"}}"; + assertThat(classToTest.toString(), is(equalTo(expected))); + + // Verify getters + assertThat(classToTest.getHybrid().getSemanticRatio(), is(equalTo(0.5))); + assertThat(classToTest.getHybrid().getEmbedder(), is(equalTo("default"))); + } + + @Test + void toStringWithHybridAndOtherParameters() { + IndexSearchRequest classToTest = + IndexSearchRequest.builder() + .q("This is a Test") + .offset(200) + .limit(900) + .hybrid( + Hybrid.builder() + .semanticRatio(0.7) + .embedder("custom-embedder") + .build()) + .build(); + + String expected = + "{\"q\":\"This is a Test\",\"hybrid\":{\"semanticRatio\":0.7,\"embedder\":\"custom-embedder\"},\"offset\":200,\"limit\":900}"; + assertThat(classToTest.toString(), is(equalTo(expected))); + } + + @Test + void toStringWithHybridOnlyEmbedder() { + IndexSearchRequest classToTest = + new IndexSearchRequest("someIndexUuid") + .setQuery("This is a Test") + .setHybrid(Hybrid.builder().embedder("default").build()); + + String expected = "{\"q\":\"This is a Test\",\"hybrid\":{\"embedder\":\"default\"}}"; + assertThat(classToTest.toString(), is(equalTo(expected))); + } +} From 4e1d7fd1c2cac6d49c2d255957b6f1a7fd687950 Mon Sep 17 00:00:00 2001 From: fherpich Date: Sun, 16 Nov 2025 22:21:25 +0100 Subject: [PATCH 2/4] Handle null values for "hybrid" in `IndexSearchRequest` and fix test class name --- .../java/com/meilisearch/sdk/IndexSearchRequest.java | 11 ++++++----- .../com/meilisearch/sdk/IndexSearchRequestTest.java | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java index ded6957a2..599313b1f 100644 --- a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java +++ b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java @@ -110,11 +110,12 @@ public String toString() { .putOpt("attributesToSearchOn", this.attributesToSearchOn) .putOpt("locales", this.locales) .putOpt("distinct", this.distinct) - .putOpt("retrieveVectors", this.retrieveVectors); - - if (this.hybrid != null) { - jsonObject.put("hybrid", this.hybrid.toJSONObject()); - } + .putOpt("retrieveVectors", this.retrieveVectors) + .putOpt( + "hybrid", + this.hybrid != null + ? this.hybrid.toJSONObject() : + null); return jsonObject.toString(); } diff --git a/src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java b/src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java index b38743890..76ac87615 100644 --- a/src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java +++ b/src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java @@ -7,7 +7,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; -class IndexIndexSearchRequestTest { +class IndexSearchRequestTest { @Test void toStringWithHybridUsingBuilder() { IndexSearchRequest classToTest = From 7c85e6dbddd25b615b2a99272b94cff8d33a81c4 Mon Sep 17 00:00:00 2001 From: fherpich Date: Sun, 16 Nov 2025 22:26:14 +0100 Subject: [PATCH 3/4] Add "hybrid" parameter to JavaDoc in `IndexSearchRequest` --- src/main/java/com/meilisearch/sdk/IndexSearchRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java index 599313b1f..68c1128b6 100644 --- a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java +++ b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java @@ -47,7 +47,7 @@ public class IndexSearchRequest { * offset: 0, limit: 20, attributesToRetrieve: ["*"], attributesToCrop: null, cropLength: 200, * attributesToHighlight: null, filter: null, showMatchesPosition: false, facets: null, sort: * null, showRankingScore: false, showRankingScoreDetails: false, rankingScoreThreshold: null - * distinct: null, retrieveVectors: false + * distinct: null, retrieveVectors: false, hybrid: null * * @param indexUid uid of the requested index String */ From ad390e648efcd3f23c7182f81a7778aed8932f1e Mon Sep 17 00:00:00 2001 From: fherpich Date: Sun, 16 Nov 2025 23:02:47 +0100 Subject: [PATCH 4/4] Refactor spacing in `IndexSearchRequest` and update formatting in corresponding tests according to spotless --- .../meilisearch/sdk/IndexSearchRequest.java | 6 +-- .../sdk/IndexSearchRequestTest.java | 44 +++++++++---------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java index 68c1128b6..e0e29acc6 100644 --- a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java +++ b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java @@ -111,11 +111,7 @@ public String toString() { .putOpt("locales", this.locales) .putOpt("distinct", this.distinct) .putOpt("retrieveVectors", this.retrieveVectors) - .putOpt( - "hybrid", - this.hybrid != null - ? this.hybrid.toJSONObject() : - null); + .putOpt("hybrid", this.hybrid != null ? this.hybrid.toJSONObject() : null); return jsonObject.toString(); } diff --git a/src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java b/src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java index 76ac87615..b5b1c171e 100644 --- a/src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java +++ b/src/test/java/com/meilisearch/sdk/IndexSearchRequestTest.java @@ -1,23 +1,23 @@ package com.meilisearch.sdk; -import com.meilisearch.sdk.model.Hybrid; -import org.junit.jupiter.api.Test; - import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; +import com.meilisearch.sdk.model.Hybrid; +import org.junit.jupiter.api.Test; + class IndexSearchRequestTest { @Test void toStringWithHybridUsingBuilder() { IndexSearchRequest classToTest = - IndexSearchRequest.builder() - .q("This is a Test") - .hybrid(Hybrid.builder().semanticRatio(0.5).embedder("default").build()) - .build(); + IndexSearchRequest.builder() + .q("This is a Test") + .hybrid(Hybrid.builder().semanticRatio(0.5).embedder("default").build()) + .build(); String expected = - "{\"q\":\"This is a Test\",\"hybrid\":{\"semanticRatio\":0.5,\"embedder\":\"default\"}}"; + "{\"q\":\"This is a Test\",\"hybrid\":{\"semanticRatio\":0.5,\"embedder\":\"default\"}}"; assertThat(classToTest.toString(), is(equalTo(expected))); // Verify getters @@ -28,28 +28,28 @@ void toStringWithHybridUsingBuilder() { @Test void toStringWithHybridAndOtherParameters() { IndexSearchRequest classToTest = - IndexSearchRequest.builder() - .q("This is a Test") - .offset(200) - .limit(900) - .hybrid( - Hybrid.builder() - .semanticRatio(0.7) - .embedder("custom-embedder") - .build()) - .build(); + IndexSearchRequest.builder() + .q("This is a Test") + .offset(200) + .limit(900) + .hybrid( + Hybrid.builder() + .semanticRatio(0.7) + .embedder("custom-embedder") + .build()) + .build(); String expected = - "{\"q\":\"This is a Test\",\"hybrid\":{\"semanticRatio\":0.7,\"embedder\":\"custom-embedder\"},\"offset\":200,\"limit\":900}"; + "{\"q\":\"This is a Test\",\"hybrid\":{\"semanticRatio\":0.7,\"embedder\":\"custom-embedder\"},\"offset\":200,\"limit\":900}"; assertThat(classToTest.toString(), is(equalTo(expected))); } @Test void toStringWithHybridOnlyEmbedder() { IndexSearchRequest classToTest = - new IndexSearchRequest("someIndexUuid") - .setQuery("This is a Test") - .setHybrid(Hybrid.builder().embedder("default").build()); + new IndexSearchRequest("someIndexUuid") + .setQuery("This is a Test") + .setHybrid(Hybrid.builder().embedder("default").build()); String expected = "{\"q\":\"This is a Test\",\"hybrid\":{\"embedder\":\"default\"}}"; assertThat(classToTest.toString(), is(equalTo(expected)));