querydown 0.0.1

An expressive DSL for writing relational database queries that compile to SQL
Documentation
use chumsky::prelude::*;
use chumsky::text::whitespace;

use crate::syntax_tree::*;

use super::column_layout::column_layout;
use super::molecule::*;
use super::utils::QdParser;

pub fn transformation() -> impl QdParser<Transformation> {
    top_level_condition_set()
        .or_not()
        .then_ignore(whitespace())
        .then(column_layout().or_not())
        .map(|(cs, cl)| Transformation {
            condition_set: cs.unwrap_or_default(),
            column_layout: cl.unwrap_or_default(),
        })
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_transformation() {
        assert_eq!(
            transformation().then_ignore(end()).parse("{a:8} $foo"),
            Ok(Transformation {
                condition_set: ConditionSet {
                    conjunction: Conjunction::And,
                    entries: vec![ConditionSetEntry::Comparison(Comparison {
                        left: ComparisonPart::Expression(Expression {
                            base: Value::Path(vec![PathPart::Column("a".to_string())]),
                            compositions: vec![],
                        }),
                        operator: Operator::Eq,
                        right: ComparisonPart::Expression(Expression {
                            base: Value::Literal(Literal::Number("8".to_string())),
                            compositions: vec![],
                        })
                    })]
                },
                column_layout: ColumnLayout {
                    column_specs: vec![ColumnSpec {
                        column_control: ColumnControl::default(),
                        expression: Expression {
                            base: Value::Path(vec![PathPart::Column("foo".to_string())]),
                            compositions: vec![],
                        },
                        alias: None,
                    }]
                }
            })
        );
    }
}