Skip to content

Commit 493a0d9

Browse files
authored
Fix delete task not respecting default fields (#5690)
* Add failing test for default fields * Support for config and provided default fields * Rename search_fields to search_field for consitency
1 parent 98098bb commit 493a0d9

File tree

1 file changed

+51
-6
lines changed
  • quickwit/quickwit-serve/src/delete_task_api

1 file changed

+51
-6
lines changed

quickwit/quickwit-serve/src/delete_task_api/handler.rs

+51-6
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ pub struct DeleteQueryRequest {
4545
/// Query text. The query language is that of tantivy.
4646
pub query: String,
4747
// Fields to search on
48+
#[serde(rename(deserialize = "search_field"))]
4849
#[serde(default)]
49-
pub search_fields: Vec<String>,
50+
pub search_fields: Option<Vec<String>>,
5051
/// If set, restrict delete to documents with a `timestamp >= start_timestamp`.
5152
pub start_timestamp: Option<i64>,
5253
/// If set, restrict delete to documents with a `timestamp < end_timestamp``.
@@ -149,8 +150,8 @@ pub async fn post_delete_request(
149150
.await?
150151
.deserialize_index_metadata()?;
151152
let index_uid: IndexUid = metadata.index_uid.clone();
152-
let query_ast = query_ast_from_user_text(&delete_request.query, Some(Vec::new()))
153-
.parse_user_query(&[])
153+
let query_ast = query_ast_from_user_text(&delete_request.query, delete_request.search_fields)
154+
.parse_user_query(&metadata.index_config.search_settings.default_search_fields)
154155
.map_err(|err| JanitorError::InvalidDeleteQuery(err.to_string()))?;
155156
let query_ast_json = serde_json::to_string(&query_ast).map_err(|_err| {
156157
JanitorError::Internal("failed to serialized delete query ast".to_string())
@@ -188,23 +189,26 @@ mod tests {
188189

189190
#[tokio::test]
190191
async fn test_delete_task_api() {
191-
quickwit_common::setup_logging_for_tests();
192192
let index_id = "test-delete-task-rest";
193193
let doc_mapping_yaml = r#"
194194
field_mappings:
195+
- name: title
196+
type: text
195197
- name: body
196198
type: text
197199
- name: ts
198200
type: i64
199201
fast: true
200202
mode: lenient
201203
"#;
202-
let test_sandbox = TestSandbox::create(index_id, doc_mapping_yaml, "{}", &["body"])
204+
let test_sandbox = TestSandbox::create(index_id, doc_mapping_yaml, "", &["title"])
203205
.await
204206
.unwrap();
205207
let metastore = test_sandbox.metastore();
206208
let delete_query_api_handlers =
207209
super::delete_task_api_handlers(metastore).recover(recover_fn);
210+
211+
// POST a delete query with explicit field name in query
208212
let resp = warp::test::request()
209213
.path("/test-delete-task-rest/delete-tasks")
210214
.method("POST")
@@ -224,6 +228,46 @@ mod tests {
224228
assert_eq!(created_delete_query.start_timestamp, Some(1));
225229
assert_eq!(created_delete_query.end_timestamp, Some(10));
226230

231+
// POST a delete query with specified default field
232+
let resp = warp::test::request()
233+
.path("/test-delete-task-rest/delete-tasks")
234+
.method("POST")
235+
.json(&true)
236+
.body(r#"{"query": "myterm", "start_timestamp": 1, "end_timestamp": 10, "search_field": ["body"]}"#)
237+
.reply(&delete_query_api_handlers)
238+
.await;
239+
assert_eq!(resp.status(), 200);
240+
let created_delete_task: DeleteTask = serde_json::from_slice(resp.body()).unwrap();
241+
assert_eq!(created_delete_task.opstamp, 2);
242+
let created_delete_query = created_delete_task.delete_query.unwrap();
243+
assert_eq!(created_delete_query.index_uid(), &test_sandbox.index_uid());
244+
assert_eq!(
245+
created_delete_query.query_ast,
246+
r#"{"type":"full_text","field":"body","text":"myterm","params":{"mode":{"type":"phrase_fallback_to_intersection"}},"lenient":false}"#
247+
);
248+
assert_eq!(created_delete_query.start_timestamp, Some(1));
249+
assert_eq!(created_delete_query.end_timestamp, Some(10));
250+
251+
// POST a delete query using the config default field
252+
let resp = warp::test::request()
253+
.path("/test-delete-task-rest/delete-tasks")
254+
.method("POST")
255+
.json(&true)
256+
.body(r#"{"query": "myterm", "start_timestamp": 1, "end_timestamp": 10}"#)
257+
.reply(&delete_query_api_handlers)
258+
.await;
259+
assert_eq!(resp.status(), 200);
260+
let created_delete_task: DeleteTask = serde_json::from_slice(resp.body()).unwrap();
261+
assert_eq!(created_delete_task.opstamp, 3);
262+
let created_delete_query = created_delete_task.delete_query.unwrap();
263+
assert_eq!(created_delete_query.index_uid(), &test_sandbox.index_uid());
264+
assert_eq!(
265+
created_delete_query.query_ast,
266+
r#"{"type":"full_text","field":"title","text":"myterm","params":{"mode":{"type":"phrase_fallback_to_intersection"}},"lenient":false}"#
267+
);
268+
assert_eq!(created_delete_query.start_timestamp, Some(1));
269+
assert_eq!(created_delete_query.end_timestamp, Some(10));
270+
227271
// POST an invalid delete query.
228272
let resp = warp::test::request()
229273
.path("/test-delete-task-rest/delete-tasks")
@@ -242,7 +286,8 @@ mod tests {
242286
.await;
243287
assert_eq!(resp.status(), 200);
244288
let delete_tasks: Vec<DeleteTask> = serde_json::from_slice(resp.body()).unwrap();
245-
assert_eq!(delete_tasks.len(), 1);
289+
assert_eq!(delete_tasks.len(), 3);
290+
246291
test_sandbox.assert_quit().await;
247292
}
248293
}

0 commit comments

Comments
 (0)