use nodedb_physical::physical_plan::VectorOp;
use nodedb_wal::record::RecordType;
use crate::control::server::wal_dispatch::{
VectorDirectUpsertPayload, encode_multi_vector_delete_payload, encode_multi_vector_put_payload,
encode_sparse_vector_delete_payload, encode_sparse_vector_put_payload,
encode_vector_batch_put_payload, encode_vector_delete_by_surrogate_payload,
encode_vector_delete_payload, encode_vector_direct_upsert_payload, encode_vector_put_payload,
};
use crate::wal::RedoSubRecord;
pub(super) fn serialize_vector_op(
op: &VectorOp,
ops: &mut Vec<RedoSubRecord>,
) -> crate::Result<()> {
match op {
VectorOp::Insert {
collection,
vector,
dim,
field_name,
surrogate,
pk_bytes: _,
provenance,
} => {
let payload = encode_vector_put_payload(
collection,
vector,
*dim,
field_name,
*surrogate,
provenance.as_ref(),
)?;
ops.push(RedoSubRecord {
record_type: RecordType::VectorPut as u32,
payload,
});
Ok(())
}
VectorOp::BatchInsert {
collection,
vectors,
dim,
surrogates: _,
} => {
let payload = encode_vector_batch_put_payload(collection, vectors, *dim)?;
ops.push(RedoSubRecord {
record_type: RecordType::VectorPut as u32,
payload,
});
Ok(())
}
VectorOp::Delete {
collection,
vector_id,
} => {
let payload = encode_vector_delete_payload(collection, *vector_id)?;
ops.push(RedoSubRecord {
record_type: RecordType::VectorDelete as u32,
payload,
});
Ok(())
}
VectorOp::DeleteBySurrogate {
collection,
surrogate,
field_name,
provenance,
} => {
let payload = encode_vector_delete_by_surrogate_payload(
collection,
*surrogate,
field_name,
provenance.as_ref(),
)?;
ops.push(RedoSubRecord {
record_type: RecordType::VectorDelete as u32,
payload,
});
Ok(())
}
VectorOp::Search { .. }
| VectorOp::MultiSearch { .. }
| VectorOp::MultiVectorScoreSearch { .. }
| VectorOp::SparseSearch { .. }
| VectorOp::QueryStats { .. } => Ok(()),
VectorOp::Seal { .. } | VectorOp::CompactIndex { .. } | VectorOp::Rebuild { .. } => Ok(()),
VectorOp::SetParams { .. } => Err(crate::Error::PlanError {
detail: "vector SetParams (index DDL) is not supported in transaction resolve"
.to_string(),
}),
VectorOp::DirectUpsert {
collection,
field,
surrogate,
vector,
payload,
quantization,
storage_dtype,
payload_indexes,
} => {
let payload = encode_vector_direct_upsert_payload(VectorDirectUpsertPayload {
collection,
field,
surrogate: *surrogate,
vector,
payload,
quantization: *quantization,
storage_dtype: *storage_dtype,
payload_indexes,
})?;
ops.push(RedoSubRecord {
record_type: RecordType::VectorDirectUpsert as u32,
payload,
});
Ok(())
}
VectorOp::MultiVectorInsert {
collection,
field_name,
document_surrogate,
vectors,
count,
dim,
} => {
let payload = encode_multi_vector_put_payload(
collection,
field_name,
*document_surrogate,
vectors,
*count,
*dim,
)?;
ops.push(RedoSubRecord {
record_type: RecordType::MultiVectorPut as u32,
payload,
});
Ok(())
}
VectorOp::MultiVectorDelete {
collection,
field_name,
document_surrogate,
} => {
let payload =
encode_multi_vector_delete_payload(collection, field_name, *document_surrogate)?;
ops.push(RedoSubRecord {
record_type: RecordType::MultiVectorDelete as u32,
payload,
});
Ok(())
}
VectorOp::SparseInsert {
collection,
field_name,
doc_id,
entries,
} => {
let payload =
encode_sparse_vector_put_payload(collection, field_name, doc_id, entries)?;
ops.push(RedoSubRecord {
record_type: RecordType::SparseVectorPut as u32,
payload,
});
Ok(())
}
VectorOp::SparseDelete {
collection,
field_name,
doc_id,
} => {
let payload = encode_sparse_vector_delete_payload(collection, field_name, doc_id)?;
ops.push(RedoSubRecord {
record_type: RecordType::SparseVectorDelete as u32,
payload,
});
Ok(())
}
}
}