diff --git a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseFilterExpressionConverter.java b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseFilterExpressionConverter.java index dd7fa8b620..a2aee0d453 100644 --- a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseFilterExpressionConverter.java +++ b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseFilterExpressionConverter.java @@ -54,9 +54,13 @@ private String getOperationSymbol(Filter.Expression exp) { } @Override - protected void doGroup(Filter.Group group, StringBuilder context) { - this.convertOperand(new Filter.Expression(Filter.ExpressionType.AND, group.content(), group.content()), - context); // trick + protected void doStartGroup(Filter.Group group, StringBuilder context) { + context.append("("); + } + + @Override + protected void doEndGroup(Filter.Group group, StringBuilder context) { + context.append(")"); } @Override diff --git a/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseFilterExpressionConverterTests.java b/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseFilterExpressionConverterTests.java index 147f3e3ee8..8594cd2722 100644 --- a/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseFilterExpressionConverterTests.java +++ b/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseFilterExpressionConverterTests.java @@ -21,6 +21,7 @@ import org.junit.jupiter.api.Test; import org.springframework.ai.vectorstore.filter.Filter.Expression; +import org.springframework.ai.vectorstore.filter.Filter.Group; import org.springframework.ai.vectorstore.filter.Filter.Key; import org.springframework.ai.vectorstore.filter.Filter.Value; import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; @@ -105,6 +106,17 @@ void testOr() { assertThat(vectorExpr).isEqualTo("metadata.country: \"BG\" || metadata.country: \"NL\""); } + @Test + void testGroupAsRightOperand() { + // city == "Sofia" AND (year >= 2020 OR country == "BG") + String vectorExpr = this.converter + .convertExpression(new Expression(AND, new Expression(EQ, new Key("city"), new Value("Sofia")), + new Group(new Expression(OR, new Expression(GTE, new Key("year"), new Value(2020)), + new Expression(EQ, new Key("country"), new Value("BG")))))); + assertThat(vectorExpr).isEqualTo( + "metadata.city: \"Sofia\" && (metadata.year: >= 2020 || metadata.country: \"BG\")"); + } + @Test void testBoolean() { String vectorExpr = this.converter