1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
use std::rc::Rc; use super::super::api::*; use super::super::exec::{ExecutionError, Value}; use arrow::array::*; use arrow::datatypes::*; pub struct SqrtFunction {} impl ScalarFunction for SqrtFunction { fn name(&self) -> String { "sqrt".to_string() } fn execute(&self, args: Vec<Rc<Value>>) -> Result<Rc<Value>, ExecutionError> { match args[0].as_ref() { &Value::Column(_, ref arr) => { let field = Rc::new(Field::new(&self.name(), self.return_type(), false)); match arr.data() { &ArrayData::Float32(ref v) => Ok(Rc::new(Value::Column( field, Rc::new(Array::from( v.iter().map(|v| v.sqrt()).collect::<Vec<f32>>(), )), ))), &ArrayData::Float64(ref v) => Ok(Rc::new(Value::Column( field, Rc::new(Array::from( v.iter().map(|v| v.sqrt()).collect::<Vec<f64>>(), )), ))), &ArrayData::Int32(ref v) => Ok(Rc::new(Value::Column( field, Rc::new(Array::from( v.iter().map(|v| (v as f64).sqrt()).collect::<Vec<f64>>(), )), ))), &ArrayData::Int64(ref v) => Ok(Rc::new(Value::Column( field, Rc::new(Array::from( v.iter().map(|v| (v as f64).sqrt()).collect::<Vec<f64>>(), )), ))), _ => Err(ExecutionError::Custom("Unsupported arg type for sqrt".to_string())), } } _ => Err(ExecutionError::Custom("Unsupported arg type for sqrt".to_string())), } } fn args(&self) -> Vec<Field> { vec![ Field::new("x", DataType::Float64, false), Field::new("y", DataType::Float64, false), ] } fn return_type(&self) -> DataType { DataType::Float64 } }