versatile-data 0.117.0

A library for databases that has convenient datasets that group together commonly used fields and gives you the flexibility to create your own fields.
Documentation
use versatile_data::*;

fn new_data(name: &str, option: DataOption) -> Data {
    let dir = std::env::temp_dir().join(format!("versatile-data-search-{name}"));
    let _ = std::fs::remove_dir_all(&dir);
    Data::new(&dir, option)
}

async fn insert_n(data: &mut Data, n: u32) {
    let name = FieldName::new("n".into());
    for i in 0..n {
        let fields = [(name.clone(), i.to_string().into_bytes())].into();
        data.insert(Activity::Active, Term::Default, Term::Default, fields)
            .await;
    }
}

#[test]
fn empty_narrow_condition_returns_all_rows() {
    let mut data = new_data("empty-narrow", DataOption::default());
    futures::executor::block_on(async {
        insert_n(&mut data, 3).await;
        let empty = vec![];
        let rows = data
            .begin_search()
            .search(Condition::Narrow(&empty))
            .result()
            .await;
        assert_eq!(rows.len(), 3);
    });
}

#[test]
fn search_row_with_out_of_range_numbers() {
    let mut data = new_data("row-range", DataOption::default());
    futures::executor::block_on(async {
        insert_n(&mut data, 3).await;

        let huge = search::Number::In(vec![-1, 0, 2, 1 << 32, (1 << 32) + 1]);
        let rows = data.begin_search().search_row(&huge).result().await;
        assert_eq!(rows.into_iter().map(|r| r.get()).collect::<Vec<_>>(), [2]);

        let range = search::Number::Range(-10..=isize::MAX);
        let rows = data.begin_search().search_row(&range).result().await;
        assert_eq!(rows.len(), 3);
    });
}

#[test]
fn search_by_disabled_index_returns_nothing() {
    let option = DataOption {
        uuid: false,
        activity: false,
        term: false,
        last_updated: false,
        allocation_lot: 1,
    };
    let mut data = new_data("disabled", option);
    futures::executor::block_on(async {
        insert_n(&mut data, 2).await;

        let uuids = [1u128];
        let uuid = Condition::Uuid(&uuids);
        assert!(data.begin_search().search(uuid).result().await.is_empty());

        let term = Condition::Term(search::Term::default());
        assert!(data.begin_search().search(term).result().await.is_empty());

        let n = search::Number::Min(0);
        let last_updated = Condition::LastUpdated(&n);
        assert!(
            data.begin_search()
                .search(last_updated)
                .result()
                .await
                .is_empty()
        );

        // the default search does not add conditions for disabled indexes.
        assert_eq!(data.search_default().result().await.len(), 2);
    });
}