Skip to main content

linkrs_query/executor/expression/functions/registry/
table.rs

1use super::super::TableFunction;
2use super::FunctionRegistry;
3use crate::executor::expression::{ExpressionError, ExpressionErrorType};
4use linkrs_core::Value;
5
6impl FunctionRegistry {
7    /// Register a table function
8    pub fn register_table_function(&mut self, func: Box<dyn TableFunction>) {
9        let upper_name = func.name().to_uppercase();
10        self.table_functions.insert(upper_name, func);
11    }
12
13    /// Check if a table function exists
14    pub fn contains_table_function(&self, name: &str) -> bool {
15        self.table_functions.contains_key(&name.to_uppercase())
16    }
17
18    /// Execute a table function by name
19    pub fn execute_table_function(
20        &self,
21        name: &str,
22        args: &[Value],
23    ) -> Result<Vec<Vec<Value>>, ExpressionError> {
24        let upper_name = name.to_uppercase();
25        if let Some(func) = self.table_functions.get(&upper_name) {
26            return func.execute(args);
27        }
28        Err(ExpressionError::new(
29            ExpressionErrorType::UndefinedFunction,
30            format!("Undefined table function: {}", name),
31        ))
32    }
33
34    /// Get all table function names
35    pub fn table_function_names(&self) -> Vec<&str> {
36        self.table_functions.keys().map(|s| s.as_str()).collect()
37    }
38
39    /// Register built-in table functions
40    pub(super) fn register_builtin_table_functions(&mut self) {
41        use super::super::BuiltinTableFunction;
42        self.register_table_function(Box::new(BuiltinTableFunction::ReadCsv));
43    }
44}