querydown 0.0.1

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

use crate::syntax_tree::*;
use crate::tokens::*;

use super::transformation::transformation;
use super::utils::*;
use super::values::*;

pub fn query() -> impl QdParser<Query> {
    let base_table = db_identifier().then_ignore(whitespace());
    let transformations = transformation().separated_by(
        whitespace()
            .then(exactly(TRANSFORMATION_DELIMITER))
            .then(whitespace()),
    );
    base_table
        .then(transformations)
        .then_ignore(whitespace().then(end()))
        .map(|(base_table, transformations)| Query {
            base_table,
            transformations,
        })
}

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

    #[test]
    fn test_query() {
        assert_eq!(
            query().parse("foo a:8 $bar"),
            Ok(Query {
                base_table: "foo".to_string(),
                transformations: vec![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("bar".to_string())]),
                                compositions: vec![],
                            },
                            alias: None,
                        }]
                    }
                }],
            })
        );
    }
}