MCPcopy Create free account
hub / github.com/TileDB-Inc/TileDB / leaf_ast_to_binary_expr

Function leaf_ast_to_binary_expr

tiledb/oxidize/expr/src/query_condition.rs:105–205  ·  view source on GitHub ↗
(
    schema: &ArraySchema,
    ast: &ASTNode,
    op: Operator,
)

Source from the content-addressed store, hash-verified

103}
104
105fn 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 {

Callers 1

to_datafusion_implFunction · 0.85

Calls 2

field_cxxMethod · 0.80
datatypeMethod · 0.45

Tested by

no test coverage detected