@@ -45,8 +45,9 @@ pub struct DeleteQueryRequest {
45
45
/// Query text. The query language is that of tantivy.
46
46
pub query : String ,
47
47
// Fields to search on
48
+ #[ serde( rename( deserialize = "search_field" ) ) ]
48
49
#[ serde( default ) ]
49
- pub search_fields : Vec < String > ,
50
+ pub search_fields : Option < Vec < String > > ,
50
51
/// If set, restrict delete to documents with a `timestamp >= start_timestamp`.
51
52
pub start_timestamp : Option < i64 > ,
52
53
/// If set, restrict delete to documents with a `timestamp < end_timestamp``.
@@ -149,8 +150,8 @@ pub async fn post_delete_request(
149
150
. await ?
150
151
. deserialize_index_metadata ( ) ?;
151
152
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 )
154
155
. map_err ( |err| JanitorError :: InvalidDeleteQuery ( err. to_string ( ) ) ) ?;
155
156
let query_ast_json = serde_json:: to_string ( & query_ast) . map_err ( |_err| {
156
157
JanitorError :: Internal ( "failed to serialized delete query ast" . to_string ( ) )
@@ -188,23 +189,26 @@ mod tests {
188
189
189
190
#[ tokio:: test]
190
191
async fn test_delete_task_api ( ) {
191
- quickwit_common:: setup_logging_for_tests ( ) ;
192
192
let index_id = "test-delete-task-rest" ;
193
193
let doc_mapping_yaml = r#"
194
194
field_mappings:
195
+ - name: title
196
+ type: text
195
197
- name: body
196
198
type: text
197
199
- name: ts
198
200
type: i64
199
201
fast: true
200
202
mode: lenient
201
203
"# ;
202
- let test_sandbox = TestSandbox :: create ( index_id, doc_mapping_yaml, "{} " , & [ "body " ] )
204
+ let test_sandbox = TestSandbox :: create ( index_id, doc_mapping_yaml, "" , & [ "title " ] )
203
205
. await
204
206
. unwrap ( ) ;
205
207
let metastore = test_sandbox. metastore ( ) ;
206
208
let delete_query_api_handlers =
207
209
super :: delete_task_api_handlers ( metastore) . recover ( recover_fn) ;
210
+
211
+ // POST a delete query with explicit field name in query
208
212
let resp = warp:: test:: request ( )
209
213
. path ( "/test-delete-task-rest/delete-tasks" )
210
214
. method ( "POST" )
@@ -224,6 +228,46 @@ mod tests {
224
228
assert_eq ! ( created_delete_query. start_timestamp, Some ( 1 ) ) ;
225
229
assert_eq ! ( created_delete_query. end_timestamp, Some ( 10 ) ) ;
226
230
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
+
227
271
// POST an invalid delete query.
228
272
let resp = warp:: test:: request ( )
229
273
. path ( "/test-delete-task-rest/delete-tasks" )
@@ -242,7 +286,8 @@ mod tests {
242
286
. await ;
243
287
assert_eq ! ( resp. status( ) , 200 ) ;
244
288
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
+
246
291
test_sandbox. assert_quit ( ) . await ;
247
292
}
248
293
}
0 commit comments