| 171 | } |
| 172 | |
| 173 | pub fn append(&self, op: VectorOp) -> Result<(), BufIoError> { |
| 174 | let mut buf = Vec::new(); |
| 175 | |
| 176 | buf.extend([u8::MAX; 4]); |
| 177 | |
| 178 | match op { |
| 179 | VectorOp::Upsert(vectors) => { |
| 180 | self.records_upserted |
| 181 | .fetch_add(vectors.len() as u32, Ordering::Relaxed); |
| 182 | write_len(&mut buf, vectors.len() as u32); |
| 183 | for vector in &*vectors { |
| 184 | write_len(&mut buf, vector.id.len() as u32); |
| 185 | buf.extend(vector.id.as_bytes()); |
| 186 | if let Some(document_id) = &vector.document_id { |
| 187 | write_len(&mut buf, document_id.len() as u32); |
| 188 | buf.extend(document_id.as_bytes()); |
| 189 | } else { |
| 190 | write_len(&mut buf, 0); |
| 191 | } |
| 192 | if let Some(dense_values) = &vector.dense_values { |
| 193 | write_len(&mut buf, dense_values.len() as u32); |
| 194 | for val in dense_values { |
| 195 | buf.extend(val.to_le_bytes()); |
| 196 | } |
| 197 | } else { |
| 198 | write_len(&mut buf, 0); |
| 199 | } |
| 200 | if let Some(metadata) = &vector.metadata { |
| 201 | write_len(&mut buf, metadata.len() as u32); |
| 202 | for (field, val) in metadata { |
| 203 | write_len(&mut buf, field.len() as u32); |
| 204 | buf.extend(field.as_bytes()); |
| 205 | |
| 206 | match val { |
| 207 | FieldValue::Int(int) => { |
| 208 | buf.push(0); |
| 209 | buf.extend(int.to_le_bytes()); |
| 210 | } |
| 211 | FieldValue::String(str) => { |
| 212 | buf.push(1); |
| 213 | write_len(&mut buf, str.len() as u32); |
| 214 | buf.extend(str.as_bytes()); |
| 215 | } |
| 216 | } |
| 217 | } |
| 218 | } else { |
| 219 | write_len(&mut buf, 0); |
| 220 | } |
| 221 | |
| 222 | if let Some(sparse_values) = &vector.sparse_values { |
| 223 | write_len(&mut buf, sparse_values.len() as u32); |
| 224 | for pair in sparse_values { |
| 225 | buf.extend(pair.0.to_le_bytes()); |
| 226 | buf.extend(pair.1.to_le_bytes()); |
| 227 | } |
| 228 | } else { |
| 229 | write_len(&mut buf, 0); |
| 230 | } |