Append a row of values. Validates types and nullability.
(&mut self, values: &[Value])
| 56 | |
| 57 | /// Append a row of values. Validates types and nullability. |
| 58 | pub fn append_row(&mut self, values: &[Value]) -> Result<(), ColumnarError> { |
| 59 | if values.len() != self.schema.columns.len() { |
| 60 | return Err(ColumnarError::SchemaMismatch { |
| 61 | expected: self.schema.columns.len(), |
| 62 | got: values.len(), |
| 63 | }); |
| 64 | } |
| 65 | |
| 66 | for (i, (col_def, value)) in self.schema.columns.iter().zip(values.iter()).enumerate() { |
| 67 | if matches!(value, Value::Null) && !col_def.nullable { |
| 68 | return Err(ColumnarError::NullViolation(col_def.name.clone())); |
| 69 | } |
| 70 | self.columns[i].push(value, &col_def.name, &col_def.column_type)?; |
| 71 | } |
| 72 | |
| 73 | self.row_count += 1; |
| 74 | debug_assert!( |
| 75 | self.columns.iter().all(|c| c.len() == self.row_count), |
| 76 | "column lengths must stay aligned with row_count" |
| 77 | ); |
| 78 | Ok(()) |
| 79 | } |
| 80 | |
| 81 | /// Number of rows currently buffered. |
| 82 | pub fn row_count(&self) -> usize { |