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::fmt;
16use std::sync::Arc;
17
18use common_query::error::Result;
19use datafusion::arrow::array::StringViewArray;
20use datafusion::arrow::datatypes::DataType;
21use datafusion::logical_expr::ColumnarValue;
22use datafusion_expr::{ScalarFunctionArgs, Signature, Volatility};
23
24use crate::function::Function;
25
26/// Generates build information
27#[derive(Clone, Debug, Default)]
28pub struct BuildFunction;
29
30impl fmt::Display for BuildFunction {
31    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
32        write!(f, "BUILD")
33    }
34}
35
36impl Function for BuildFunction {
37    fn name(&self) -> &str {
38        "build"
39    }
40
41    fn return_type(&self, _: &[DataType]) -> Result<DataType> {
42        Ok(DataType::Utf8View)
43    }
44
45    fn signature(&self) -> Signature {
46        Signature::nullary(Volatility::Immutable)
47    }
48
49    fn invoke_with_args(&self, _: ScalarFunctionArgs) -> datafusion_common::Result<ColumnarValue> {
50        let build_info = common_version::build_info().to_string();
51        Ok(ColumnarValue::Array(Arc::new(StringViewArray::from(vec![
52            build_info,
53        ]))))
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use std::sync::Arc;
60
61    use arrow_schema::Field;
62    use datafusion::arrow::array::ArrayRef;
63    use datafusion_common::config::ConfigOptions;
64
65    use super::*;
66    #[test]
67    fn test_build_function() {
68        let build = BuildFunction;
69        assert_eq!("build", build.name());
70        assert_eq!(DataType::Utf8View, build.return_type(&[]).unwrap());
71        assert_eq!(build.signature(), Signature::nullary(Volatility::Immutable));
72        let build_info = common_version::build_info().to_string();
73        let actual = build
74            .invoke_with_args(ScalarFunctionArgs {
75                args: vec![],
76                arg_fields: vec![],
77                number_rows: 0,
78                return_field: Arc::new(Field::new("x", DataType::Utf8View, false)),
79                config_options: Arc::new(ConfigOptions::new()),
80            })
81            .unwrap();
82        let actual = ColumnarValue::values_to_arrays(&[actual]).unwrap();
83        let expect = vec![Arc::new(StringViewArray::from(vec![build_info])) as ArrayRef];
84        assert_eq!(actual, expect);
85    }
86}