(
schema: &ArraySchema,
ast: &ASTNode,
op: Operator,
)
| 103 | } |
| 104 | |
| 105 | fn leaf_ast_to_binary_expr( |
| 106 | schema: &ArraySchema, |
| 107 | ast: &ASTNode, |
| 108 | op: Operator, |
| 109 | ) -> Result<Expr, Error> { |
| 110 | let Some(field) = schema.field_cxx(ast.get_field_name()) else { |
| 111 | return Err( |
| 112 | UserError::UnknownField(ast.get_field_name().to_string_lossy().into_owned()).into(), |
| 113 | ); |
| 114 | }; |
| 115 | |
| 116 | fn apply<T>(field: &Field, ast: &ASTNode, operator: Operator) -> Result<Expr, Error> |
| 117 | where |
| 118 | T: FromBytes, |
| 119 | <T as FromBytes>::Bytes: for<'a> TryFrom<&'a [u8]>, |
| 120 | ScalarValue: From<T> + From<Option<T>>, |
| 121 | { |
| 122 | let column = Expr::Column(Column::from_name( |
| 123 | field.name().map_err(UserError::FieldNameNotUtf8)?, |
| 124 | )); |
| 125 | |
| 126 | let mut values = values_iter::<T>(field.datatype(), ast.get_data())? |
| 127 | .map(ScalarValue::from) |
| 128 | .peekable(); |
| 129 | |
| 130 | let expect_datatype = tiledb_arrow::schema::field_arrow_datatype(field).map_err(|e| { |
| 131 | InternalError::SchemaField(field.name_cxx().to_string_lossy().into_owned(), e) |
| 132 | })?; |
| 133 | |
| 134 | let right = match field.cell_val_num() { |
| 135 | CellValNum::Single => { |
| 136 | let Some(r) = values.next() else { |
| 137 | return Err(UserError::CellValNumMismatch(field.cell_val_num(), 0).into()); |
| 138 | }; |
| 139 | if values.peek().is_some() { |
| 140 | return Err(UserError::CellValNumMismatch( |
| 141 | field.cell_val_num(), |
| 142 | 1 + values.count(), |
| 143 | ) |
| 144 | .into()); |
| 145 | } else { |
| 146 | r |
| 147 | } |
| 148 | } |
| 149 | CellValNum::Fixed(nz) => { |
| 150 | let values = if values.peek().is_none() { |
| 151 | aa::make_array(ArrayData::new_empty(&expect_datatype)) |
| 152 | } else { |
| 153 | // SAFETY: `values` produces a static type, so all will match. |
| 154 | // `values` is also non-empty per `peek`. |
| 155 | ScalarValue::iter_to_array(values).unwrap() |
| 156 | }; |
| 157 | if values.len() != nz.get() as usize { |
| 158 | return Err( |
| 159 | UserError::CellValNumMismatch(field.cell_val_num(), values.len()).into(), |
| 160 | ); |
| 161 | } |
| 162 | let Ok(fixed_size) = i32::try_from(nz.get()) else { |
no test coverage detected