From ba681bfe77db76488261d0759bbe0e21ce9e783f Mon Sep 17 00:00:00 2001 From: Oleksandr Klymenko Date: Fri, 8 Aug 2025 23:01:12 +0200 Subject: [PATCH 1/2] test: Add additional filter condition tests for SimpleVectorStore Co-authored-by: Oleksandr Klymenko Signed-off-by: Oleksandr Klymenko --- .../SimpleVectorStoreWithFilterTests.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreWithFilterTests.java b/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreWithFilterTests.java index 10b7f748438..b400867994b 100644 --- a/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreWithFilterTests.java +++ b/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreWithFilterTests.java @@ -281,4 +281,69 @@ void shouldFilterWithInCondition() { assertThat(results.get(0).getId()).isEqualTo("1"); } + @Test + void shouldFilterByNumericRange() { + List docs = Arrays.asList( + Document.builder().id("1").text("entity").metadata(Map.of("value", 1)).build(), + Document.builder().id("2").text("entity").metadata(Map.of("value", 2)).build(), + Document.builder().id("3").text("entity").metadata(Map.of("value", 3)).build() + ); + + vectorStore.add(docs); + + List results = vectorStore.similaritySearch( + SearchRequest.builder().query("entity").filterExpression("value >= 1 && value <= 1").build()); + + assertThat(results).hasSize(1); + assertThat(results.get(0).getId()).isEqualTo("1"); + } + + @Test + void shouldReturnEmptyResultsWhenNoDocumentsMatchFilter() { + Document doc = Document.builder() + .id("1") + .text("test") + .metadata(Map.of("type", "document")) + .build(); + + vectorStore.add(List.of(doc)); + + List results = vectorStore.similaritySearch( + SearchRequest.builder().query("test").filterExpression("type == 'image'").build()); + + assertThat(results).isEmpty(); + } + + @Test + void shouldFilterByBooleanValue() { + List docs = Arrays.asList( + Document.builder().id("1").text("instance").metadata(Map.of("enabled", true)).build(), + Document.builder().id("2").text("instance").metadata(Map.of("enabled", false)).build() + ); + + vectorStore.add(docs); + + List results = vectorStore.similaritySearch( + SearchRequest.builder().query("instance").filterExpression("enabled == true").build()); + + assertThat(results).hasSize(1); + assertThat(results.get(0).getId()).isEqualTo("1"); + } + + @Test + void shouldFilterByNotEqual() { + List docs = Arrays.asList( + Document.builder().id("1").text("item").metadata(Map.of("classification", "typeA")).build(), + Document.builder().id("2").text("item").metadata(Map.of("classification", "typeB")).build() + ); + + vectorStore.add(docs); + + List results = vectorStore.similaritySearch( + SearchRequest.builder().query("item").filterExpression("classification != 'typeB'").build()); + + assertThat(results).hasSize(1); + assertThat(results.get(0).getId()).isEqualTo("1"); + } + } From 044ab9809d588852525d837a2020fe814d75445d Mon Sep 17 00:00:00 2001 From: Oleksandr Klymenko Date: Fri, 8 Aug 2025 23:03:22 +0200 Subject: [PATCH 2/2] test: fix format SimpleVectorStore Co-authored-by: Oleksandr Klymenko Signed-off-by: Oleksandr Klymenko --- .../SimpleVectorStoreWithFilterTests.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreWithFilterTests.java b/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreWithFilterTests.java index b400867994b..d59d9d44b3d 100644 --- a/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreWithFilterTests.java +++ b/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreWithFilterTests.java @@ -286,8 +286,7 @@ void shouldFilterByNumericRange() { List docs = Arrays.asList( Document.builder().id("1").text("entity").metadata(Map.of("value", 1)).build(), Document.builder().id("2").text("entity").metadata(Map.of("value", 2)).build(), - Document.builder().id("3").text("entity").metadata(Map.of("value", 3)).build() - ); + Document.builder().id("3").text("entity").metadata(Map.of("value", 3)).build()); vectorStore.add(docs); @@ -300,16 +299,12 @@ void shouldFilterByNumericRange() { @Test void shouldReturnEmptyResultsWhenNoDocumentsMatchFilter() { - Document doc = Document.builder() - .id("1") - .text("test") - .metadata(Map.of("type", "document")) - .build(); + Document doc = Document.builder().id("1").text("test").metadata(Map.of("type", "document")).build(); vectorStore.add(List.of(doc)); - List results = vectorStore.similaritySearch( - SearchRequest.builder().query("test").filterExpression("type == 'image'").build()); + List results = vectorStore + .similaritySearch(SearchRequest.builder().query("test").filterExpression("type == 'image'").build()); assertThat(results).isEmpty(); } @@ -318,13 +313,12 @@ void shouldReturnEmptyResultsWhenNoDocumentsMatchFilter() { void shouldFilterByBooleanValue() { List docs = Arrays.asList( Document.builder().id("1").text("instance").metadata(Map.of("enabled", true)).build(), - Document.builder().id("2").text("instance").metadata(Map.of("enabled", false)).build() - ); + Document.builder().id("2").text("instance").metadata(Map.of("enabled", false)).build()); vectorStore.add(docs); - List results = vectorStore.similaritySearch( - SearchRequest.builder().query("instance").filterExpression("enabled == true").build()); + List results = vectorStore + .similaritySearch(SearchRequest.builder().query("instance").filterExpression("enabled == true").build()); assertThat(results).hasSize(1); assertThat(results.get(0).getId()).isEqualTo("1"); @@ -334,8 +328,7 @@ void shouldFilterByBooleanValue() { void shouldFilterByNotEqual() { List docs = Arrays.asList( Document.builder().id("1").text("item").metadata(Map.of("classification", "typeA")).build(), - Document.builder().id("2").text("item").metadata(Map.of("classification", "typeB")).build() - ); + Document.builder().id("2").text("item").metadata(Map.of("classification", "typeB")).build()); vectorStore.add(docs);