use nodedb_physical::physical_plan::ArrayOp;
use nodedb_wal::record::RecordType;
use crate::engine::array::wal::{
ArrayDeleteCell, ArrayDeletePayload, ArrayPutCell, ArrayPutPayload, encode_delete_with_version,
encode_put_with_version,
};
use crate::wal::RedoSubRecord;
pub(super) fn serialize_array_op(op: &ArrayOp, ops: &mut Vec<RedoSubRecord>) -> crate::Result<()> {
match op {
ArrayOp::Put {
array_id,
cells_msgpack,
wal_lsn: _,
provenance,
} => {
let cells = zerompk::from_msgpack::<Vec<ArrayPutCell>>(cells_msgpack).map_err(|e| {
crate::Error::Serialization {
format: "msgpack".into(),
detail: format!("array resolve put decode cells: {e}"),
}
})?;
let payload = ArrayPutPayload {
array_id: array_id.clone(),
cells,
provenance: provenance.clone(),
};
let bytes =
encode_put_with_version(&payload).map_err(|e| crate::Error::Serialization {
format: "msgpack".into(),
detail: format!("array resolve put encode: {e}"),
})?;
ops.push(RedoSubRecord {
record_type: RecordType::ArrayPut as u32,
payload: bytes,
});
Ok(())
}
ArrayOp::Delete {
array_id,
coords_msgpack,
wal_lsn: _,
provenance,
} => {
let cells =
zerompk::from_msgpack::<Vec<ArrayDeleteCell>>(coords_msgpack).map_err(|e| {
crate::Error::Serialization {
format: "msgpack".into(),
detail: format!("array resolve delete decode cells: {e}"),
}
})?;
let payload = ArrayDeletePayload {
array_id: array_id.clone(),
cells,
provenance: provenance.clone(),
};
let bytes =
encode_delete_with_version(&payload).map_err(|e| crate::Error::Serialization {
format: "msgpack".into(),
detail: format!("array resolve delete encode: {e}"),
})?;
ops.push(RedoSubRecord {
record_type: RecordType::ArrayDelete as u32,
payload: bytes,
});
Ok(())
}
ArrayOp::Slice { .. }
| ArrayOp::SurrogateBitmapScan { .. }
| ArrayOp::Project { .. }
| ArrayOp::Aggregate { .. }
| ArrayOp::Elementwise { .. }
| ArrayOp::Flush { .. }
| ArrayOp::Compact { .. } => Ok(()),
ArrayOp::OpenArray { .. } | ArrayOp::DropArray { .. } => Err(crate::Error::PlanError {
detail: "array OPEN/DROP (catalog DDL) is not supported in transaction resolve"
.to_string(),
}),
}
}