Skip to content

Commit 59f2b3b

Browse files
authored
test: Add comprehensive test coverage for PgVectorFilterExpressionConverter (#3916)
Signed-off-by: Alex Klimenko <[email protected]>
1 parent 027f464 commit 59f2b3b

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed

vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/pgvector/PgVectorFilterExpressionConverterTests.java

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
import static org.assertj.core.api.Assertions.assertThat;
3030
import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.AND;
3131
import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.EQ;
32+
import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.GT;
3233
import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.GTE;
3334
import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.IN;
35+
import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.LT;
3436
import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.LTE;
3537
import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.NE;
3638
import static org.springframework.ai.vectorstore.filter.Filter.ExpressionType.NIN;
@@ -119,4 +121,126 @@ public void testComplexIdentifiers() {
119121
assertThat(vectorExpr).isEqualTo("$.\"country 1 2 3\" == \"BG\"");
120122
}
121123

124+
@Test
125+
public void testLT() {
126+
// value < 100
127+
String vectorExpr = this.converter.convertExpression(new Expression(LT, new Key("value"), new Value(100)));
128+
assertThat(vectorExpr).isEqualTo("$.value < 100");
129+
}
130+
131+
@Test
132+
public void testGT() {
133+
// score > 75
134+
String vectorExpr = this.converter.convertExpression(new Expression(GT, new Key("score"), new Value(100)));
135+
assertThat(vectorExpr).isEqualTo("$.score > 100");
136+
}
137+
138+
@Test
139+
public void testLTE() {
140+
// amount <= 100.5
141+
String vectorExpr = this.converter.convertExpression(new Expression(LTE, new Key("amount"), new Value(100.5)));
142+
assertThat(vectorExpr).isEqualTo("$.amount <= 100.5");
143+
}
144+
145+
@Test
146+
public void testNIN() {
147+
// category NOT IN ["typeA", "typeB"]
148+
String vectorExpr = this.converter
149+
.convertExpression(new Expression(NIN, new Key("category"), new Value(List.of("typeA", "typeB"))));
150+
assertThat(vectorExpr).isEqualTo("!($.category == \"typeA\" || $.category == \"typeB\")");
151+
}
152+
153+
@Test
154+
public void testSingleValueIN() {
155+
// status IN ["active"] - single value in list
156+
String vectorExpr = this.converter
157+
.convertExpression(new Expression(IN, new Key("status"), new Value(List.of("active"))));
158+
assertThat(vectorExpr).isEqualTo("($.status == \"active\")");
159+
}
160+
161+
@Test
162+
public void testSingleValueNIN() {
163+
// status NOT IN ["inactive"] - single value in list
164+
String vectorExpr = this.converter
165+
.convertExpression(new Expression(NIN, new Key("status"), new Value(List.of("inactive"))));
166+
assertThat(vectorExpr).isEqualTo("!($.status == \"inactive\")");
167+
}
168+
169+
@Test
170+
public void testNumericIN() {
171+
// priority IN [1, 2, 3]
172+
String vectorExpr = this.converter
173+
.convertExpression(new Expression(IN, new Key("priority"), new Value(List.of(1, 2, 3))));
174+
assertThat(vectorExpr).isEqualTo("($.priority == 1 || $.priority == 2 || $.priority == 3)");
175+
}
176+
177+
@Test
178+
public void testNumericNIN() {
179+
// level NOT IN [0, 10]
180+
String vectorExpr = this.converter
181+
.convertExpression(new Expression(NIN, new Key("level"), new Value(List.of(0, 10))));
182+
assertThat(vectorExpr).isEqualTo("!($.level == 0 || $.level == 10)");
183+
}
184+
185+
@Test
186+
public void testNestedGroups() {
187+
// ((score >= 80 AND type == "A") OR (score >= 90 AND type == "B")) AND status ==
188+
// "valid"
189+
String vectorExpr = this.converter.convertExpression(new Expression(AND,
190+
new Group(new Expression(OR,
191+
new Group(new Expression(AND, new Expression(GTE, new Key("score"), new Value(80)),
192+
new Expression(EQ, new Key("type"), new Value("A")))),
193+
new Group(new Expression(AND, new Expression(GTE, new Key("score"), new Value(90)),
194+
new Expression(EQ, new Key("type"), new Value("B")))))),
195+
new Expression(EQ, new Key("status"), new Value("valid"))));
196+
assertThat(vectorExpr).isEqualTo(
197+
"(($.score >= 80 && $.type == \"A\") || ($.score >= 90 && $.type == \"B\")) && $.status == \"valid\"");
198+
}
199+
200+
@Test
201+
public void testBooleanFalse() {
202+
// active == false
203+
String vectorExpr = this.converter.convertExpression(new Expression(EQ, new Key("active"), new Value(false)));
204+
assertThat(vectorExpr).isEqualTo("$.active == false");
205+
}
206+
207+
@Test
208+
public void testBooleanNE() {
209+
// active != true
210+
String vectorExpr = this.converter.convertExpression(new Expression(NE, new Key("active"), new Value(true)));
211+
assertThat(vectorExpr).isEqualTo("$.active != true");
212+
}
213+
214+
@Test
215+
public void testKeyWithDots() {
216+
// "config.setting" == "value1"
217+
String vectorExpr = this.converter
218+
.convertExpression(new Expression(EQ, new Key("\"config.setting\""), new Value("value1")));
219+
assertThat(vectorExpr).isEqualTo("$.\"config.setting\" == \"value1\"");
220+
}
221+
222+
@Test
223+
public void testEmptyString() {
224+
// description == ""
225+
String vectorExpr = this.converter.convertExpression(new Expression(EQ, new Key("description"), new Value("")));
226+
assertThat(vectorExpr).isEqualTo("$.description == \"\"");
227+
}
228+
229+
@Test
230+
public void testNullValue() {
231+
// metadata == null
232+
String vectorExpr = this.converter.convertExpression(new Expression(EQ, new Key("metadata"), new Value(null)));
233+
assertThat(vectorExpr).isEqualTo("$.metadata == null");
234+
}
235+
236+
@Test
237+
public void testComplexOrExpression() {
238+
// state == "ready" OR state == "pending" OR state == "processing"
239+
String vectorExpr = this.converter.convertExpression(new Expression(OR,
240+
new Expression(OR, new Expression(EQ, new Key("state"), new Value("ready")),
241+
new Expression(EQ, new Key("state"), new Value("pending"))),
242+
new Expression(EQ, new Key("state"), new Value("processing"))));
243+
assertThat(vectorExpr).isEqualTo("$.state == \"ready\" || $.state == \"pending\" || $.state == \"processing\"");
244+
}
245+
122246
}

0 commit comments

Comments
 (0)