use crate::bridge::envelope::{ErrorCode, Response};
use crate::data::executor::core_loop::CoreLoop;
use crate::data::executor::task::ExecutionTask;
use super::super::merge::MergeParams;
impl CoreLoop {
pub(in crate::data::executor) fn execute_merge_resolve(
&mut self,
task: &ExecutionTask,
tid: u64,
params: MergeParams<'_>,
) -> Response {
let plan = match self.collect_merge_plan(
task.request.database_id.as_u64(),
tid,
task.request.txn_id,
¶ms,
) {
Ok(p) => p,
Err(e) => return self.response_error(task, e),
};
let updates: Vec<(String, Option<u32>, Vec<u8>)> = plan
.updates
.into_iter()
.map(|u| (u.doc_id, u.surrogate.map(|s| s.as_u32()), u.body))
.collect();
let deletes: Vec<(String, Option<u32>, Vec<u8>)> = plan
.deletes
.into_iter()
.map(|d| (d.doc_id, d.surrogate.map(|s| s.as_u32()), d.body))
.collect();
let inserts: Vec<(String, Vec<u8>)> = plan
.inserts
.into_iter()
.map(|i| (i.join_key, i.body))
.collect();
match zerompk::to_msgpack_vec(&(updates, deletes, inserts)) {
Ok(payload) => self.response_with_payload(task, payload),
Err(e) => self.response_error(
task,
ErrorCode::Internal {
detail: format!("merge resolve encode: {e}"),
},
),
}
}
}