Skip to content

Commit 5b55d59

Browse files
committed
Fix escaping issue in filterExpression for RedisVectorStore file name filtering
Signed-off-by: Minu Kim <[email protected]>
1 parent 2c18332 commit 5b55d59

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/filter/SearchRequestTests.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,61 @@ public void filterExpression() {
138138

139139
}
140140

141+
@Test
142+
public void filterExpressionWithDotAndBackslashIsEscaped() {
143+
var request = SearchRequest.builder()
144+
.query("Test")
145+
.filterExpression("file_name == 'clean.code.pdf' && path == 'C:\\docs\\files'")
146+
.build();
147+
148+
var expression = request.getFilterExpression();
149+
150+
assertThat(expression.toString()).contains("clean\\.code\\.pdf");
151+
assertThat(expression.toString()).contains("C:\\\\docs\\\\files");
152+
}
153+
154+
@Test
155+
public void filterExpressionWithMultipleLiteralsIsEscapedIndependently() {
156+
var request = SearchRequest.builder()
157+
.query("Test")
158+
.filterExpression("file_name == 'a.b.c' && author == 'me.you'")
159+
.build();
160+
161+
var expression = request.getFilterExpression();
162+
163+
assertThat(expression.toString()).contains("a\\.b\\.c");
164+
assertThat(expression.toString()).contains("me\\.you");
165+
}
166+
167+
@Test
168+
public void filterExpressionWithVariousFileExtensionsIsEscaped() {
169+
var request = SearchRequest.builder()
170+
.query("Test")
171+
.filterExpression(
172+
"file_name == 'summary.epub' || file_name == 'lecture_notes.md' || file_name == 'slides.pptx'")
173+
.build();
174+
175+
String expression = request.getFilterExpression().toString();
176+
177+
assertThat(expression).contains("summary\\.epub");
178+
assertThat(expression).contains("lecture_notes\\.md");
179+
assertThat(expression).contains("slides\\.pptx");
180+
}
181+
182+
@Test
183+
public void filterExpressionWithInListIsEscaped() {
184+
var request = SearchRequest.builder()
185+
.query("Test")
186+
.filterExpression("file_name IN ['a.pdf', 'b.txt', 'final.report.docx']")
187+
.build();
188+
189+
String expression = request.getFilterExpression().toString();
190+
191+
assertThat(expression).contains("a\\.pdf");
192+
assertThat(expression).contains("b\\.txt");
193+
assertThat(expression).contains("final\\.report\\.docx");
194+
}
195+
141196
private void checkDefaults(SearchRequest request) {
142197
assertThat(request.getFilterExpression()).isNull();
143198
assertThat(request.getSimilarityThreshold()).isEqualTo(SearchRequest.SIMILARITY_THRESHOLD_ACCEPT_ALL);

0 commit comments

Comments
 (0)