linkrs-query 0.1.0

Query engine, parser, and executor for Linkrs
Documentation
mod arithmetic;
mod constructors;
mod epoch;
mod extraction;
mod formatting;
mod generate;
mod interval;
mod truncation;

use arithmetic::*;
use constructors::*;
use epoch::*;
use extraction::*;
use formatting::*;
use generate::*;
use interval::*;
use truncation::*;

use crate::executor::expression::ExpressionError;
use linkrs_core::Value;

define_function_enum! {
    pub enum DateTimeFunction {
        Now => {
            name: "now",
            arity: 0,
            variadic: false,
            description: "current timestamp",
            handler: execute_now
        },
        Date => {
            name: "date",
            arity: 1,
            variadic: true,
            description: "Date of creation",
            handler: execute_date
        },
        Time => {
            name: "time",
            arity: 1,
            variadic: true,
            description: "Creation time",
            handler: execute_time
        },
        DateTime => {
            name: "datetime",
            arity: 0,
            variadic: true,
            description: "Creation date and time",
            handler: execute_datetime
        },
        Year => {
            name: "year",
            arity: 1,
            variadic: false,
            description: "Year of extraction",
            handler: execute_year
        },
        Month => {
            name: "month",
            arity: 1,
            variadic: false,
            description: "Month of withdrawal",
            handler: execute_month
        },
        Day => {
            name: "day",
            arity: 1,
            variadic: false,
            description: "Withdrawal date",
            handler: execute_day
        },
        Hour => {
            name: "hour",
            arity: 1,
            variadic: false,
            description: "Withdrawal hours",
            handler: execute_hour
        },
        Minute => {
            name: "minute",
            arity: 1,
            variadic: false,
            description: "Extraction minutes",
            handler: execute_minute
        },
        Second => {
            name: "second",
            arity: 1,
            variadic: false,
            description: "withdrawal second",
            handler: execute_second
        },
        TimeStamp => {
            name: "timestamp",
            arity: 0,
            variadic: true,
            description: "Get current timestamp or convert datetime to timestamp",
            handler: execute_timestamp
        },
        DateAdd => {
            name: "date_add",
            arity: 2,
            variadic: false,
            description: "Add interval to date/datetime",
            handler: execute_date_add
        },
        DateSub => {
            name: "date_sub",
            arity: 2,
            variadic: false,
            description: "Subtract interval from date/datetime",
            handler: execute_date_sub
        },
        DateDiff => {
            name: "date_diff",
            arity: 2,
            variadic: false,
            description: "Calculate difference between two dates/datetimes",
            handler: execute_date_diff
        },
        DateTrunc => {
            name: "date_trunc",
            arity: 2,
            variadic: false,
            description: "Truncate date/datetime to specified precision",
            handler: execute_date_trunc
        },
        CurrentDate => {
            name: "current_date",
            arity: 0,
            variadic: false,
            description: "Get current date",
            handler: execute_current_date
        },
        CurrentTimestamp => {
            name: "current_timestamp",
            arity: 0,
            variadic: false,
            description: "Get current timestamp",
            handler: execute_current_timestamp
        },
        ToChar => {
            name: "to_char",
            arity: 2,
            variadic: false,
            description: "Format datetime as string",
            handler: execute_to_char
        },
        ToDate => {
            name: "to_date",
            arity: 1,
            variadic: false,
            description: "Convert string to date",
            handler: execute_to_date
        },
        Age => {
            name: "age",
            arity: 1,
            variadic: false,
            description: "Calculate age/interval from date/datetime to now",
            handler: execute_age
        },
        LastDay => {
            name: "last_day",
            arity: 1,
            variadic: false,
            description: "Get last day of the month",
            handler: execute_last_day
        },
        GenerateSeries => {
            name: "generate_series",
            arity: 2,
            variadic: true,
            description: "Generate a series of timestamps",
            handler: execute_generate_series
        },
        ToYears => {
            name: "to_years",
            arity: 1,
            variadic: false,
            description: "Convert number to years interval",
            handler: execute_to_years
        },
        ToMonths => {
            name: "to_months",
            arity: 1,
            variadic: false,
            description: "Convert number to months interval",
            handler: execute_to_months
        },
        ToDays => {
            name: "to_days",
            arity: 1,
            variadic: false,
            description: "Convert number to days interval",
            handler: execute_to_days
        },
        ToHours => {
            name: "to_hours",
            arity: 1,
            variadic: false,
            description: "Convert number to hours interval",
            handler: execute_to_hours
        },
        ToMinutes => {
            name: "to_minutes",
            arity: 1,
            variadic: false,
            description: "Convert number to minutes interval",
            handler: execute_to_minutes
        },
        ToSeconds => {
            name: "to_seconds",
            arity: 1,
            variadic: false,
            description: "Convert number to seconds interval",
            handler: execute_to_seconds
        },
        ToMilliseconds => {
            name: "to_milliseconds",
            arity: 1,
            variadic: false,
            description: "Convert number to milliseconds interval",
            handler: execute_to_milliseconds
        },
        ToMicroseconds => {
            name: "to_microseconds",
            arity: 1,
            variadic: false,
            description: "Convert number to microseconds interval",
            handler: execute_to_microseconds
        },
        Century => {
            name: "century",
            arity: 1,
            variadic: false,
            description: "Extract century from date/datetime",
            handler: execute_century
        },
        EpochMs => {
            name: "epoch_ms",
            arity: 1,
            variadic: false,
            description: "Convert date/datetime to epoch milliseconds",
            handler: execute_epoch_ms
        },
        ToTimestamp => {
            name: "to_timestamp",
            arity: 1,
            variadic: false,
            description: "Convert epoch seconds to timestamp",
            handler: execute_to_timestamp
        },
        ToEpochMs => {
            name: "to_epoch_ms",
            arity: 1,
            variadic: false,
            description: "Convert date/datetime to epoch milliseconds",
            handler: execute_to_epoch_ms
        },
        DatePart => {
            name: "date_part",
            arity: 2,
            variadic: false,
            description: "Extract date part (year, month, day, hour, minute, second, dow, doy, quarter)",
            handler: execute_date_part
        },
        DayName => {
            name: "day_name",
            arity: 1,
            variadic: false,
            description: "Get day name from date/datetime",
            handler: execute_day_name
        },
        MonthName => {
            name: "month_name",
            arity: 1,
            variadic: false,
            description: "Get month name from date/datetime",
            handler: execute_month_name
        },
    }
}

impl DateTimeFunction {
    pub fn execute_with_cache(
        &self,
        args: &[Value],
        _cache: &mut (),
    ) -> Result<Value, ExpressionError> {
        self.execute(args)
    }
}

#[cfg(test)]
mod tests;