diff --git a/src/message.rs b/src/message.rs index b9e42ef..8c6a290 100644 --- a/src/message.rs +++ b/src/message.rs @@ -4029,7 +4029,11 @@ impl DocumentFile { }; let mut records = RecordIter::with_names(self.docdef.get_field_names().clone()); for oid in oids.iter() { - records.insert(self.docs.get(oid).unwrap().clone()); + let record = self.docs.get(oid).unwrap().clone(); + for (field_id, index) in self.indexes.iter_mut() { + index.remove(record.get(field_id).unwrap(), oid); + } + records.insert(record); self.docs.remove(oid); } records.into() @@ -5328,6 +5332,49 @@ mod document_files { _ => unreachable!("got {:?}, should have been empty", action), } } + + #[test] + fn does_delete_return_query_errors() { + let field_name = Name::english("wrong"); + let mut doc = TestDocument::new([FieldType::Integer].to_vec()); + doc.start(); + let mut delete = Delete::new(); + let mut calc = Calculation::new(Operand::Equal); + calc.add_value(1); + let query = delete.get_query_mut(); + query.add(field_name.clone(), calc); + doc.send(delete).unwrap(); + let result = doc.get_receiver().recv_timeout(TIMEOUT).unwrap(); + let action = result.get_action(); + match action { + MsgAction::Error(err) => match err { + MTTError::NameNotFound(data) => assert_eq!(data, &field_name), + _ => unreachable!("got {:?}: should have gotten an missing field", err), + }, + _ => unreachable!("got {:?}: should have gotten an error", action), + } + } + + #[test] + fn does_delete_update_indexes() { + let fname = Name::english("field0"); + let value = 1; + let mut doc = TestDocument::new([FieldType::Integer].to_vec()); + doc.get_docdef_mut().add_index(&fname, IndexType::Unique); + doc.start(); + doc.populate([value.into()].to_vec()); + doc.send(Delete::new()); + doc.get_receiver().recv_timeout(TIMEOUT).unwrap(); + let mut addition = Addition::new(); + addition.add_field(&fname, value.clone()); + doc.send(addition).unwrap(); + let result = doc.get_receiver().recv_timeout(TIMEOUT).unwrap(); + let action = result.get_action(); + match action { + MsgAction::Records(data) => assert_eq!(data.len(), 1), + _ => unreachable!("got {:?}, should have added entry", action), + } + } } #[cfg(test)]