partiql 0.14.0

PartiQL in Rust
Documentation
use crate::common::{eval_query_with_catalog, TestError};
use assert_matches::assert_matches;
use partiql_catalog::catalog::PartiqlCatalog;
use partiql_catalog::extension::Extension;
use partiql_common::pretty::ToPretty;
use partiql_eval::eval::Evaluated;
use partiql_eval::plan::EvaluationMode;
use partiql_extension_ion::boxed_ion::BoxedIonType;
use partiql_extension_value_functions::PartiqlValueFnExtension;
use partiql_value::boxed_variant::DynBoxedVariantTypeFactory;
use partiql_value::{Value, Variant};

mod common;

#[track_caller]
#[inline]
pub fn eval(statement: &str, mode: EvaluationMode) -> Result<Evaluated, TestError<'_>> {
    let mut catalog = PartiqlCatalog::default();
    let ext = PartiqlValueFnExtension::default();
    ext.load(&mut catalog)?;
    let catalog = catalog.to_shared_catalog();

    eval_query_with_catalog(statement, &catalog, mode)
}

#[test]
fn ion_simple() {
    let query = "select x from `(1 hi::2)` as x";
    // << {x: `1`}, {x: `hi::2`}>>

    let res = eval(query, EvaluationMode::Permissive);
    assert_matches!(res, Ok(_));
    let result = res.unwrap().result;

    insta::assert_snapshot!(result.to_pretty_string(25).expect("pretty"));
}

#[test]
fn ion_in_struct() {
    let query =
        "select x.data from <<{'data': `annot1::(1 hi::2)`}, {'data': `annot2::{data: 3}`}>> as x";

    let res = eval(query, EvaluationMode::Permissive);
    assert_matches!(res, Ok(_));
    let result = res.unwrap().result;

    insta::assert_snapshot!(result.to_pretty_string(25).expect("pretty"));
}

#[test]
fn ion_structs() {
    let query =
        "select x.data from <<`{data: annot1::(1 hi::2)}`, `{data: annot2::{data: 3}}`>> as x";

    let res = eval(query, EvaluationMode::Permissive);
    assert_matches!(res, Ok(_));
    let result = res.unwrap().result;

    insta::assert_snapshot!(result.to_pretty_string(25).expect("pretty"));
}

#[test]
fn ion_paths() {
    let query = "select x[1].foo from `([{foo:1}, {foo: 2}] ({foo: hi::1} {foo: world::2}))` as x";
    // << {x: `{foo: 2}`}, {x: `{foo: world::2}`}>>

    let res = eval(query, EvaluationMode::Permissive);
    assert_matches!(res, Ok(_));
    let result = res.unwrap().result;

    insta::assert_snapshot!(result.to_pretty_string(25).expect("pretty"));
}

#[test]
fn ion_iter() {
    let contents = "[1,2,3,4]";
    let ion_typ = BoxedIonType::default().to_dyn_type_tag();
    let value = Value::Variant(Box::new(Variant::new(contents, ion_typ).expect("doc ctor")));

    let items: Vec<_> = value.into_iter().collect();
    dbg!(&items);
    assert_eq!(items.len(), 4);
}

#[test]
fn ion_cmp() {
    let queries = [
        ["struct", "{ 'ion_lt_pql': `1` < 2, 'pql_lt_ion': 1 < `2`}"],
        [
            "ORDER BY",
            "SELECT x from <<`1`, 2, `3`, 4, `5`, 3+`3`>> as x ORDER BY x",
        ],
        ["ORed", "`foo` < `bar` OR `1.2` > `1`"],
    ];
    for [name, query] in queries {
        let res = eval(query, EvaluationMode::Permissive);
        assert_matches!(res, Ok(_));
        let result = res.unwrap().result;

        insta::assert_snapshot!(
            format!("ion_cmp_{name}"),
            result.to_pretty_string(25).expect("pretty")
        );
    }
}