Skip to content

Commit 5d20ea7

Browse files
authored
test: Add additional test coverage for OpenSearchAiSearchFilterExpressionConverter (#3950)
Signed-off-by: Alex Klimenko <[email protected]>
1 parent 0c7295f commit 5d20ea7

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

vector-stores/spring-ai-opensearch-store/src/test/java/org/springframework/ai/vectorstore/opensearch/OpenSearchAiSearchFilterExpressionConverterTest.java

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,108 @@ public void testComplexIdentifiers() {
123123
assertThat(vectorExpr).isEqualTo("metadata.country 1 2 3:BG");
124124
}
125125

126+
@Test
127+
public void testEmptyList() {
128+
// category IN []
129+
String vectorExpr = this.converter
130+
.convertExpression(new Filter.Expression(IN, new Filter.Key("category"), new Filter.Value(List.of())));
131+
assertThat(vectorExpr).isEqualTo("(metadata.category:)");
132+
}
133+
134+
@Test
135+
public void testSingleItemList() {
136+
// status IN ["active"]
137+
String vectorExpr = this.converter.convertExpression(
138+
new Filter.Expression(IN, new Filter.Key("status"), new Filter.Value(List.of("active"))));
139+
assertThat(vectorExpr).isEqualTo("(metadata.status:active)");
140+
}
141+
142+
@Test
143+
public void testNullValue() {
144+
// description == null
145+
String vectorExpr = this.converter
146+
.convertExpression(new Filter.Expression(EQ, new Filter.Key("description"), new Filter.Value(null)));
147+
assertThat(vectorExpr).isEqualTo("metadata.description:null");
148+
}
149+
150+
@Test
151+
public void testNestedJsonPath() {
152+
// entity.profile.name == "EntityA"
153+
String vectorExpr = this.converter.convertExpression(
154+
new Filter.Expression(EQ, new Filter.Key("entity.profile.name"), new Filter.Value("EntityA")));
155+
assertThat(vectorExpr).isEqualTo("metadata.entity.profile.name:EntityA");
156+
}
157+
158+
@Test
159+
public void testNumericStringValue() {
160+
// id == "1"
161+
String vectorExpr = this.converter
162+
.convertExpression(new Filter.Expression(EQ, new Filter.Key("id"), new Filter.Value("1")));
163+
assertThat(vectorExpr).isEqualTo("metadata.id:1");
164+
}
165+
166+
@Test
167+
public void testZeroValue() {
168+
// count == 0
169+
String vectorExpr = this.converter
170+
.convertExpression(new Filter.Expression(EQ, new Filter.Key("count"), new Filter.Value(0)));
171+
assertThat(vectorExpr).isEqualTo("metadata.count:0");
172+
}
173+
174+
@Test
175+
public void testComplexNestedGroups() {
176+
// ((fieldA >= 100 AND fieldB == "X1") OR (fieldA >= 50 AND fieldB == "Y2")) AND
177+
// fieldC != "inactive"
178+
String vectorExpr = this.converter.convertExpression(new Filter.Expression(AND,
179+
new Filter.Group(new Filter.Expression(OR,
180+
new Filter.Group(new Filter.Expression(AND,
181+
new Filter.Expression(GTE, new Filter.Key("fieldA"), new Filter.Value(100)),
182+
new Filter.Expression(EQ, new Filter.Key("fieldB"), new Filter.Value("X1")))),
183+
new Filter.Group(new Filter.Expression(AND,
184+
new Filter.Expression(GTE, new Filter.Key("fieldA"), new Filter.Value(50)),
185+
new Filter.Expression(EQ, new Filter.Key("fieldB"), new Filter.Value("Y2")))))),
186+
new Filter.Expression(NE, new Filter.Key("fieldC"), new Filter.Value("inactive"))));
187+
188+
assertThat(vectorExpr).isEqualTo(
189+
"((metadata.fieldA:>=100 AND metadata.fieldB:X1) OR (metadata.fieldA:>=50 AND metadata.fieldB:Y2)) AND metadata.fieldC: NOT inactive");
190+
}
191+
192+
@Test
193+
public void testMixedDataTypes() {
194+
// active == true AND score >= 1.5 AND tags IN ["featured", "premium"] AND version
195+
// == 1
196+
String vectorExpr = this.converter.convertExpression(new Filter.Expression(AND, new Filter.Expression(AND,
197+
new Filter.Expression(AND, new Filter.Expression(EQ, new Filter.Key("active"), new Filter.Value(true)),
198+
new Filter.Expression(GTE, new Filter.Key("score"), new Filter.Value(1.5))),
199+
new Filter.Expression(IN, new Filter.Key("tags"), new Filter.Value(List.of("featured", "premium")))),
200+
new Filter.Expression(EQ, new Filter.Key("version"), new Filter.Value(1))));
201+
202+
assertThat(vectorExpr).isEqualTo(
203+
"metadata.active:true AND metadata.score:>=1.5 AND (metadata.tags:featured OR premium) AND metadata.version:1");
204+
}
205+
206+
@Test
207+
public void testNinWithMixedTypes() {
208+
// status NIN ["A", "B", "C"]
209+
String vectorExpr = this.converter.convertExpression(
210+
new Filter.Expression(NIN, new Filter.Key("status"), new Filter.Value(List.of("A", "B", "C"))));
211+
assertThat(vectorExpr).isEqualTo("NOT (metadata.status:A OR B OR C)");
212+
}
213+
214+
@Test
215+
public void testEmptyStringValue() {
216+
// description != ""
217+
String vectorExpr = this.converter
218+
.convertExpression(new Filter.Expression(NE, new Filter.Key("description"), new Filter.Value("")));
219+
assertThat(vectorExpr).isEqualTo("metadata.description: NOT ");
220+
}
221+
222+
@Test
223+
public void testArrayIndexAccess() {
224+
// tags[0] == "important"
225+
String vectorExpr = this.converter
226+
.convertExpression(new Filter.Expression(EQ, new Filter.Key("tags[0]"), new Filter.Value("important")));
227+
assertThat(vectorExpr).isEqualTo("metadata.tags[0]:important");
228+
}
229+
126230
}

0 commit comments

Comments
 (0)