Skip to content

Commit f9c5997

Browse files
update tests
1 parent 92b4754 commit f9c5997

13 files changed

+539
-430
lines changed

Diff for: src/action/bulk_write/results.rs

+43-10
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
use std::{collections::HashMap, fmt::Debug};
44

55
use serde::Serialize;
6+
use serde_with::skip_serializing_none;
67

78
use crate::{
89
results::{DeleteResult, InsertOneResult, UpdateResult},
910
serde_util::serialize_indexed_map,
1011
};
1112

12-
#[derive(Clone, Debug, Default, Serialize)]
13+
#[skip_serializing_none]
14+
#[derive(Clone, Debug, Serialize)]
1315
#[serde(rename_all = "camelCase")]
1416
#[non_exhaustive]
1517
pub struct BulkWriteResult {
@@ -19,24 +21,43 @@ pub struct BulkWriteResult {
1921
pub modified_count: i64,
2022
pub deleted_count: i64,
2123
#[serde(serialize_with = "serialize_indexed_map")]
22-
pub insert_results: HashMap<usize, InsertOneResult>,
24+
pub insert_results: Option<HashMap<usize, InsertOneResult>>,
2325
#[serde(serialize_with = "serialize_indexed_map")]
24-
pub update_results: HashMap<usize, UpdateResult>,
26+
pub update_results: Option<HashMap<usize, UpdateResult>>,
2527
#[serde(serialize_with = "serialize_indexed_map")]
26-
pub delete_results: HashMap<usize, DeleteResult>,
28+
pub delete_results: Option<HashMap<usize, DeleteResult>>,
2729
}
2830

2931
impl BulkWriteResult {
32+
pub(crate) fn new(verbose: bool) -> Self {
33+
Self {
34+
inserted_count: 0,
35+
upserted_count: 0,
36+
matched_count: 0,
37+
modified_count: 0,
38+
deleted_count: 0,
39+
insert_results: verbose.then(HashMap::new),
40+
update_results: verbose.then(HashMap::new),
41+
delete_results: verbose.then(HashMap::new),
42+
}
43+
}
44+
3045
pub(crate) fn add_insert_result(&mut self, index: usize, insert_result: InsertOneResult) {
31-
self.insert_results.insert(index, insert_result);
46+
self.insert_results
47+
.get_or_insert_with(Default::default)
48+
.insert(index, insert_result);
3249
}
3350

3451
pub(crate) fn add_update_result(&mut self, index: usize, update_result: UpdateResult) {
35-
self.update_results.insert(index, update_result);
52+
self.update_results
53+
.get_or_insert_with(Default::default)
54+
.insert(index, update_result);
3655
}
3756

3857
pub(crate) fn add_delete_result(&mut self, index: usize, delete_result: DeleteResult) {
39-
self.delete_results.insert(index, delete_result);
58+
self.delete_results
59+
.get_or_insert_with(Default::default)
60+
.insert(index, delete_result);
4061
}
4162

4263
pub(crate) fn merge(&mut self, other: Self) {
@@ -45,8 +66,20 @@ impl BulkWriteResult {
4566
self.matched_count += other.matched_count;
4667
self.modified_count += other.modified_count;
4768
self.deleted_count += other.deleted_count;
48-
self.insert_results.extend(other.insert_results);
49-
self.update_results.extend(other.update_results);
50-
self.delete_results.extend(other.delete_results);
69+
if let Some(insert_results) = other.insert_results {
70+
self.insert_results
71+
.get_or_insert_with(Default::default)
72+
.extend(insert_results);
73+
}
74+
if let Some(update_results) = other.update_results {
75+
self.update_results
76+
.get_or_insert_with(Default::default)
77+
.extend(update_results);
78+
}
79+
if let Some(delete_results) = other.delete_results {
80+
self.delete_results
81+
.get_or_insert_with(Default::default)
82+
.extend(delete_results);
83+
}
5184
}
5285
}

Diff for: src/coll.rs

+3-11
Original file line numberDiff line numberDiff line change
@@ -781,17 +781,9 @@ impl<'de> Deserialize<'de> for Namespace {
781781
where
782782
D: Deserializer<'de>,
783783
{
784-
#[derive(Deserialize)]
785-
#[serde(untagged)]
786-
enum NamespaceHelper {
787-
String(String),
788-
Object { db: String, coll: String },
789-
}
790-
match NamespaceHelper::deserialize(deserializer)? {
791-
NamespaceHelper::String(string) => Self::from_str(&string)
792-
.ok_or_else(|| D::Error::custom("Missing one or more fields in namespace")),
793-
NamespaceHelper::Object { db, coll } => Ok(Self { db, coll }),
794-
}
784+
let s: String = Deserialize::deserialize(deserializer)?;
785+
Self::from_str(&s)
786+
.ok_or_else(|| D::Error::custom("Missing one or more fields in namespace"))
795787
}
796788
}
797789

Diff for: src/operation/bulk_write.rs

+14-5
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ impl<'a> BulkWrite<'a> {
6969
}
7070
}
7171

72+
fn is_verbose(&self) -> bool {
73+
self.options
74+
.as_ref()
75+
.and_then(|o| o.verbose_results)
76+
.unwrap_or(false)
77+
}
78+
7279
async fn iterate_results_cursor(
7380
&self,
7481
mut stream: impl TryStream<Ok = SingleOperationResponse, Error = Error> + Unpin,
@@ -90,7 +97,7 @@ impl<'a> BulkWrite<'a> {
9097
let inserted_id = self.get_inserted_id(result_index)?;
9198
let insert_result = InsertOneResult { inserted_id };
9299
result
93-
.get_or_insert_with(Default::default)
100+
.get_or_insert_with(|| BulkWriteResult::new(self.is_verbose()))
94101
.add_insert_result(result_index, insert_result);
95102
}
96103
OperationType::Update => {
@@ -106,13 +113,13 @@ impl<'a> BulkWrite<'a> {
106113
upserted_id: upserted.map(|upserted| upserted.id),
107114
};
108115
result
109-
.get_or_insert_with(Default::default)
116+
.get_or_insert_with(|| BulkWriteResult::new(self.is_verbose()))
110117
.add_update_result(result_index, update_result);
111118
}
112119
OperationType::Delete => {
113120
let delete_result = DeleteResult { deleted_count: n };
114121
result
115-
.get_or_insert_with(Default::default)
122+
.get_or_insert_with(|| BulkWriteResult::new(self.is_verbose()))
116123
.add_delete_result(result_index, delete_result);
117124
}
118125
}
@@ -283,7 +290,7 @@ impl<'a> OperationWithDefaults for BulkWrite<'a> {
283290
if response.summary.n_errors < self.n_attempted as i64 {
284291
bulk_write_error
285292
.partial_result
286-
.get_or_insert_with(Default::default)
293+
.get_or_insert_with(|| BulkWriteResult::new(self.is_verbose()))
287294
.populate_summary_info(&response.summary);
288295
}
289296

@@ -322,7 +329,9 @@ impl<'a> OperationWithDefaults for BulkWrite<'a> {
322329
if bulk_write_error.write_errors.is_empty()
323330
&& bulk_write_error.write_concern_errors.is_empty()
324331
{
325-
Ok(bulk_write_error.partial_result.unwrap_or_default())
332+
Ok(bulk_write_error
333+
.partial_result
334+
.unwrap_or_else(|| BulkWriteResult::new(self.is_verbose())))
326335
} else {
327336
let error = Error::new(
328337
ErrorKind::ClientBulkWrite(bulk_write_error),

Diff for: src/serde_util.rs

+10-6
Original file line numberDiff line numberDiff line change
@@ -196,14 +196,18 @@ where
196196
}
197197

198198
pub(crate) fn serialize_indexed_map<S: Serializer, T: Serialize>(
199-
map: &HashMap<usize, T>,
199+
map: &Option<HashMap<usize, T>>,
200200
serializer: S,
201201
) -> std::result::Result<S::Ok, S::Error> {
202-
let string_map: BTreeMap<_, _> = map
203-
.iter()
204-
.map(|(index, result)| (index.to_string(), result))
205-
.collect();
206-
string_map.serialize(serializer)
202+
if let Some(map) = map {
203+
let string_map: BTreeMap<_, _> = map
204+
.iter()
205+
.map(|(index, result)| (index.to_string(), result))
206+
.collect();
207+
string_map.serialize(serializer)
208+
} else {
209+
serializer.serialize_none()
210+
}
207211
}
208212

209213
#[cfg(test)]

Diff for: src/test/bulk_write.rs

+18-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::{sync::Arc, time::Duration};
33
use crate::{
44
action::bulk_write::write_models::WriteModel,
55
bson::doc,
6-
test::{spec::unified_runner::run_unified_tests, EventHandler},
6+
test::{log_uncaptured, spec::unified_runner::run_unified_tests, EventHandler},
77
Client,
88
Namespace,
99
};
@@ -22,6 +22,11 @@ async fn max_write_batch_size_batching() {
2222
.await;
2323
let mut subscriber = handler.subscribe();
2424

25+
if client.server_version_lt(8, 0) {
26+
log_uncaptured("skipping max_write_batch_size_batching: bulkWrite requires 8.0+");
27+
return;
28+
}
29+
2530
let max_write_batch_size = client.server_info.max_write_batch_size.unwrap() as usize;
2631

2732
let model = WriteModel::InsertOne {
@@ -57,6 +62,13 @@ async fn max_bson_object_size_with_document_sequences() {
5762
.await;
5863
let mut subscriber = handler.subscribe();
5964

65+
if client.server_version_lt(8, 0) {
66+
log_uncaptured(
67+
"skipping max_bson_object_size_with_document_sequences: bulkWrite requires 8.0+",
68+
);
69+
return;
70+
}
71+
6072
let max_bson_object_size = client.server_info.max_bson_object_size as usize;
6173

6274
let document = doc! { "a": "b".repeat(max_bson_object_size / 2) };
@@ -86,6 +98,11 @@ async fn max_message_size_bytes_batching() {
8698
.await;
8799
let mut subscriber = handler.subscribe();
88100

101+
if client.server_version_lt(8, 0) {
102+
log_uncaptured("skipping max_message_size_bytes_batching: bulkWrite requires 8.0+");
103+
return;
104+
}
105+
89106
let max_bson_object_size = client.server_info.max_bson_object_size as usize;
90107
let max_message_size_bytes = client.server_info.max_message_size_bytes as usize;
91108

0 commit comments

Comments
 (0)