common_function/system/
build.rs

1// Copyright 2023 Greptime Team
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use std::sync::Arc;
16
17use datafusion::arrow::array::StringViewArray;
18use datafusion::arrow::datatypes::DataType;
19use datafusion::logical_expr::ColumnarValue;
20use datafusion_expr::{ScalarFunctionArgs, Signature, Volatility};
21
22use crate::function::Function;
23use crate::system::define_nullary_udf;
24
25define_nullary_udf!(
26/// Generates build information
27BuildFunction);
28
29impl Function for BuildFunction {
30    fn name(&self) -> &str {
31        "build"
32    }
33
34    fn return_type(&self, _: &[DataType]) -> datafusion_common::Result<DataType> {
35        Ok(DataType::Utf8View)
36    }
37
38    fn signature(&self) -> &Signature {
39        &self.signature
40    }
41
42    fn invoke_with_args(&self, _: ScalarFunctionArgs) -> datafusion_common::Result<ColumnarValue> {
43        let build_info = common_version::build_info().to_string();
44        Ok(ColumnarValue::Array(Arc::new(StringViewArray::from(vec![
45            build_info,
46        ]))))
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use std::sync::Arc;
53
54    use arrow_schema::Field;
55    use datafusion::arrow::array::ArrayRef;
56    use datafusion_common::config::ConfigOptions;
57
58    use super::*;
59    #[test]
60    fn test_build_function() {
61        let build = BuildFunction::default();
62        assert_eq!("build", build.name());
63        assert_eq!(DataType::Utf8View, build.return_type(&[]).unwrap());
64        let build_info = common_version::build_info().to_string();
65        let actual = build
66            .invoke_with_args(ScalarFunctionArgs {
67                args: vec![],
68                arg_fields: vec![],
69                number_rows: 0,
70                return_field: Arc::new(Field::new("x", DataType::Utf8View, false)),
71                config_options: Arc::new(ConfigOptions::new()),
72            })
73            .unwrap();
74        let actual = ColumnarValue::values_to_arrays(&[actual]).unwrap();
75        let expect = vec![Arc::new(StringViewArray::from(vec![build_info])) as ArrayRef];
76        assert_eq!(actual, expect);
77    }
78}