worktable 0.9.0-alpha9

WorkTable is in-memory storage
Documentation
use worktable::prelude::PersistedWorkTable;
use worktable::prelude::*;
use worktable_codegen::worktable;

use crate::remove_dir_if_exists;

worktable! (
    name: TestSync,
    persist: true,
    columns: {
        id: String primary_key,
        field: String,
        another: u64,
    },
    queries: {
        update: {
            FieldAnotherById(field, another) by id,
        },
    }
);

#[test]
fn test_space_update_query_pk_sync() {
    let config = DiskConfig::new_with_table_name(
        "tests/data/unsized_primary_and_other_sync/update_query_pk",
        TestSyncWorkTable::name_snake_case(),
    );

    let runtime = tokio::runtime::Builder::new_multi_thread()
        .worker_threads(2)
        .enable_io()
        .enable_time()
        .build()
        .unwrap();

    runtime.block_on(async {
        remove_dir_if_exists(
            "tests/data/unsized_primary_and_other_sync/update_query_pk".to_string(),
        )
        .await;

        let pk = {
            let engine = TestSyncPersistenceEngine::new(config.clone())
                .await
                .unwrap();
            let table = TestSyncWorkTable::load(engine).await.unwrap();
            let row = TestSyncRow {
                another: 42,
                field: "".to_string(),
                id: "Some string before".to_string(),
            };
            table.insert(row.clone()).unwrap();
            let row = TestSyncRow {
                another: 43,
                field: "".to_string(),
                id: "Some string before 2".to_string(),
            };
            table.insert(row.clone()).unwrap();
            table.wait_for_ops().await;
            row.id
        };
        {
            let engine = TestSyncPersistenceEngine::new(config.clone())
                .await
                .unwrap();
            let table = TestSyncWorkTable::load(engine).await.unwrap();
            assert!(table.select(pk.clone()).is_some());
            assert_eq!(table.select(pk.clone()).unwrap().another, 43);
            let q = FieldAnotherByIdQuery {
                field: "Some field value".to_string(),
                another: 0,
            };
            table
                .update_field_another_by_id(q, pk.clone())
                .await
                .unwrap();
            table.wait_for_ops().await;
        }
        {
            let engine = TestSyncPersistenceEngine::new(config.clone())
                .await
                .unwrap();
            let table = TestSyncWorkTable::load(engine).await.unwrap();
            assert!(table.select(pk.clone()).is_some());
            assert_eq!(table.select(pk.clone()).unwrap().another, 0);
            assert_eq!(
                table.select(pk).unwrap().field,
                "Some field value".to_string()
            );
        }
    });
}

#[test]
fn test_space_update_query_pk_many_times_sync() {
    let config = DiskConfig::new_with_table_name(
        "tests/data/unsized_primary_and_other_sync/update_query_pk_many",
        TestSyncWorkTable::name_snake_case(),
    );

    let runtime = tokio::runtime::Builder::new_multi_thread()
        .worker_threads(2)
        .enable_io()
        .enable_time()
        .build()
        .unwrap();

    runtime.block_on(async {
        remove_dir_if_exists(
            "tests/data/unsized_primary_and_other_sync/update_query_pk_many".to_string(),
        )
        .await;

        let pk = {
            let engine = TestSyncPersistenceEngine::new(config.clone())
                .await
                .unwrap();
            let table = TestSyncWorkTable::load(engine).await.unwrap();
            let row = TestSyncRow {
                another: 42,
                field: "".to_string(),
                id: "Some string before".to_string(),
            };
            table.insert(row.clone()).unwrap();
            let row = TestSyncRow {
                another: 43,
                field: "".to_string(),
                id: "Some string before 2".to_string(),
            };
            table.insert(row.clone()).unwrap();
            table.wait_for_ops().await;
            row.id
        };
        {
            let engine = TestSyncPersistenceEngine::new(config.clone())
                .await
                .unwrap();
            let table = TestSyncWorkTable::load(engine).await.unwrap();
            assert!(table.select(pk.clone()).is_some());
            assert_eq!(table.select(pk.clone()).unwrap().another, 43);
            for i in 0..512 {
                let q = FieldAnotherByIdQuery {
                    field: "Some field value".to_string(),
                    another: i,
                };
                table
                    .update_field_another_by_id(q, pk.clone())
                    .await
                    .unwrap();
            }

            table.wait_for_ops().await;
        }
        {
            let engine = TestSyncPersistenceEngine::new(config.clone())
                .await
                .unwrap();
            let table = TestSyncWorkTable::load(engine).await.unwrap();
            assert!(table.select(pk.clone()).is_some());
            assert_eq!(table.select(pk.clone()).unwrap().another, 511);
            assert_eq!(
                table.select(pk).unwrap().field,
                "Some field value".to_string()
            );
        }
    });
}