mod test_db;

use agdb::DbKeyOrder;
use agdb::QueryBuilder;
use test_db::TestDb;

#[test]
fn search_elements() {
    let mut db = TestDb::new();
    db.exec_mut(QueryBuilder::insert().nodes().count(3).query(), 3);
    db.exec_ids(QueryBuilder::search().elements().query(), &[1, 2, 3]);
}

#[test]
fn search_elements_edges() {
    let mut db = TestDb::new();
    db.exec_mut(QueryBuilder::insert().nodes().count(3).query(), 3);
    db.exec_mut(QueryBuilder::insert().edges().from(1).to(3).query(), 1);
    db.exec_ids(QueryBuilder::search().elements().query(), &[1, 2, 3, -4]);
}

#[test]
fn search_elements_removed_node() {
    let mut db = TestDb::new();
    db.exec_mut(QueryBuilder::insert().nodes().count(3).query(), 3);
    db.exec_mut(QueryBuilder::insert().edges().from(1).to(3).query(), 1);
    db.exec_mut(QueryBuilder::remove().ids(2).query(), 1);
    db.exec_ids(QueryBuilder::search().elements().query(), &[1, 3, -4]);
}

#[test]
fn search_elements_removed_node_inserted_edge() {
    let mut db = TestDb::new();
    db.exec_mut(QueryBuilder::insert().nodes().count(3).query(), 3);
    db.exec_mut(QueryBuilder::insert().edges().from(1).to(3).query(), 1);
    db.exec_mut(QueryBuilder::remove().ids(2).query(), 1);
    db.exec_mut(QueryBuilder::insert().edges().from(3).to(1).query(), 1);
    db.exec_ids(QueryBuilder::search().elements().query(), &[1, -2, 3, -4]);
}

#[test]
fn search_elements_limit() {
    let mut db = TestDb::new();
    db.exec_mut(QueryBuilder::insert().nodes().count(3).query(), 3);
    db.exec_mut(QueryBuilder::insert().edges().from(1).to(3).query(), 1);
    db.exec_ids(QueryBuilder::search().elements().limit(2).query(), &[1, 2]);
}

#[test]
fn search_elements_offset() {
    let mut db = TestDb::new();
    db.exec_mut(QueryBuilder::insert().nodes().count(3).query(), 3);
    db.exec_mut(QueryBuilder::insert().edges().from(1).to(3).query(), 1);
    db.exec_ids(
        QueryBuilder::search().elements().offset(2).query(),
        &[3, -4],
    );
}

#[test]
fn search_elements_offset_limit() {
    let mut db = TestDb::new();
    db.exec_mut(QueryBuilder::insert().nodes().count(3).query(), 3);
    db.exec_mut(QueryBuilder::insert().edges().from(1).to(3).query(), 1);
    db.exec_ids(
        QueryBuilder::search().elements().offset(1).limit(2).query(),
        &[2, 3],
    );
}

#[test]
fn search_elements_order_by() {
    let mut db = TestDb::new();
    db.exec_mut(
        QueryBuilder::insert()
            .nodes()
            .values([
                [("age", 20).into()],
                [("age", 15).into()],
                [("age", 30).into()],
            ])
            .query(),
        3,
    );
    db.exec_mut(QueryBuilder::insert().edges().from(1).to(3).query(), 1);
    db.exec_ids(
        QueryBuilder::search()
            .elements()
            .order_by([DbKeyOrder::Asc("age".into())])
            .query(),
        &[2, 1, 3, -4],
    );
}

#[test]
fn search_elements_condition() {
    let mut db = TestDb::new();
    db.exec_mut(QueryBuilder::insert().nodes().count(3).query(), 3);
    db.exec_mut(QueryBuilder::insert().edges().from(1).to(3).query(), 1);
    db.exec_ids(
        QueryBuilder::search()
            .elements()
            .where_()
            .not_beyond()
            .ids(2)
            .and()
            .edge()
            .query(),
        &[-4],
    );
}
