| 67 | } |
| 68 | |
| 69 | pub fn append(&mut self, op: VectorOp) -> Result<(), BufIoError> { |
| 70 | let mut buf = Vec::new(); |
| 71 | |
| 72 | buf.extend([u8::MAX; 4]); |
| 73 | |
| 74 | match op { |
| 75 | VectorOp::Upsert(vectors) => { |
| 76 | self.records_upserted += vectors.len() as u32; |
| 77 | write_len(&mut buf, vectors.len() as u32); |
| 78 | for vector in &*vectors { |
| 79 | write_len(&mut buf, vector.id.len() as u32); |
| 80 | buf.extend(vector.id.as_bytes()); |
| 81 | if let Some(document_id) = &vector.document_id { |
| 82 | write_len(&mut buf, document_id.len() as u32); |
| 83 | buf.extend(document_id.as_bytes()); |
| 84 | } else { |
| 85 | write_len(&mut buf, 0); |
| 86 | } |
| 87 | if let Some(dense_values) = &vector.dense_values { |
| 88 | write_len(&mut buf, dense_values.len() as u32); |
| 89 | for val in dense_values { |
| 90 | buf.extend(val.to_le_bytes()); |
| 91 | } |
| 92 | } else { |
| 93 | write_len(&mut buf, 0); |
| 94 | } |
| 95 | if let Some(metadata) = &vector.metadata { |
| 96 | write_len(&mut buf, metadata.len() as u32); |
| 97 | for (field, val) in metadata { |
| 98 | write_len(&mut buf, field.len() as u32); |
| 99 | buf.extend(field.as_bytes()); |
| 100 | |
| 101 | match val { |
| 102 | FieldValue::Int(int) => { |
| 103 | buf.push(0); |
| 104 | buf.extend(int.to_le_bytes()); |
| 105 | } |
| 106 | FieldValue::String(str) => { |
| 107 | buf.push(1); |
| 108 | write_len(&mut buf, str.len() as u32); |
| 109 | buf.extend(str.as_bytes()); |
| 110 | } |
| 111 | } |
| 112 | } |
| 113 | } else { |
| 114 | write_len(&mut buf, 0); |
| 115 | } |
| 116 | |
| 117 | if let Some(sparse_values) = &vector.sparse_values { |
| 118 | write_len(&mut buf, sparse_values.len() as u32); |
| 119 | for pair in sparse_values { |
| 120 | buf.extend(pair.0.to_le_bytes()); |
| 121 | buf.extend(pair.1.to_le_bytes()); |
| 122 | } |
| 123 | } else { |
| 124 | write_len(&mut buf, 0); |
| 125 | } |
| 126 | |