From 0282264d622198eff09ba25257ea07383438ad11 Mon Sep 17 00:00:00 2001 From: Oleksandr Klymenko Date: Wed, 24 Sep 2025 22:11:49 +0200 Subject: [PATCH] test: Add missing operator and edge case tests for AzureAiSearchFilterExpressionConverter Co-authored-by: Oleksandr Klymenko Signed-off-by: Oleksandr Klymenko --- ...iSearchFilterExpressionConverterTests.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/vector-stores/spring-ai-azure-store/src/test/java/org/springframework/ai/vectorstore/azure/AzureAiSearchFilterExpressionConverterTests.java b/vector-stores/spring-ai-azure-store/src/test/java/org/springframework/ai/vectorstore/azure/AzureAiSearchFilterExpressionConverterTests.java index ae4b3f6afb5..2ff005be0c9 100644 --- a/vector-stores/spring-ai-azure-store/src/test/java/org/springframework/ai/vectorstore/azure/AzureAiSearchFilterExpressionConverterTests.java +++ b/vector-stores/spring-ai-azure-store/src/test/java/org/springframework/ai/vectorstore/azure/AzureAiSearchFilterExpressionConverterTests.java @@ -32,8 +32,10 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.AND; import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.EQ; +import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.GT; import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.GTE; import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.IN; +import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.LT; import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.LTE; import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.NE; import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.NIN; @@ -185,4 +187,75 @@ public void testComplexIdentifiers() { assertThat(vectorExpr).isEqualTo(expected); } + @Test + public void testNullValue() { + FilterExpressionConverter converter = new AzureAiSearchFilterExpressionConverter( + List.of(MetadataField.text("value1"))); + + // value1 == null + String expected = "meta_value1 eq null"; + String vectorExpr = converter.convertExpression(new Expression(EQ, new Key("value1"), new Value(null))); + assertThat(vectorExpr).isEqualTo(expected); + } + + @Test + public void testEmptyStringValue() { + FilterExpressionConverter converter = new AzureAiSearchFilterExpressionConverter( + List.of(MetadataField.text("field1"))); + + // field1 == "" + String expected = "meta_field1 eq ''"; + String vectorExpr = converter.convertExpression(new Expression(EQ, new Key("field1"), new Value(""))); + assertThat(vectorExpr).isEqualTo(expected); + } + + @Test + public void testGtAndLt() { + FilterExpressionConverter converter = new AzureAiSearchFilterExpressionConverter( + List.of(MetadataField.int32("number1"))); + + // number1 > 100 + String expected = "meta_number1 gt 100"; + String vectorExpr = converter.convertExpression(new Expression(GT, new Key("number1"), new Value(100))); + assertThat(vectorExpr).isEqualTo(expected); + + // number1 < 500 + expected = "meta_number1 lt 500"; + vectorExpr = converter.convertExpression(new Expression(LT, new Key("number1"), new Value(500))); + assertThat(vectorExpr).isEqualTo(expected); + } + + @Test + public void testNestedGroups() { + FilterExpressionConverter converter = new AzureAiSearchFilterExpressionConverter( + List.of(MetadataField.text("type1"), MetadataField.int32("value1"), MetadataField.text("code1"), + MetadataField.bool("flag1"))); + + // ((type1 == "alpha" AND value1 <= 1000) OR (code1 == "beta")) AND flag1 == true + String expected = "((meta_type1 eq 'alpha' and meta_value1 le 1000) or meta_code1 eq 'beta') and meta_flag1 eq true"; + String vectorExpr = converter.convertExpression(new Expression(AND, + new Group(new Expression(OR, + new Group(new Expression(AND, new Expression(EQ, new Key("type1"), new Value("alpha")), + new Expression(LTE, new Key("value1"), new Value(1000)))), + new Expression(EQ, new Key("code1"), new Value("beta")))), + new Expression(EQ, new Key("flag1"), new Value(true)))); + assertThat(vectorExpr).isEqualTo(expected); + } + + @Test + public void testCaseSensitiveFieldNames() { + FilterExpressionConverter converter = new AzureAiSearchFilterExpressionConverter( + List.of(MetadataField.text("ConfigValue"), MetadataField.text("configvalue"))); + + // ConfigValue == "data1" + String expected = "meta_ConfigValue eq 'data1'"; + String vectorExpr = converter.convertExpression(new Expression(EQ, new Key("ConfigValue"), new Value("data1"))); + assertThat(vectorExpr).isEqualTo(expected); + + // configvalue == "data2" + expected = "meta_configvalue eq 'data2'"; + vectorExpr = converter.convertExpression(new Expression(EQ, new Key("configvalue"), new Value("data2"))); + assertThat(vectorExpr).isEqualTo(expected); + } + }