cartel-sqlite 0.26.0

SQLite driver for the dope runtime
Documentation
use crate::{
    common::schema::Comment, common::schema::Post, common::schema::Tag, common::schema::User,
};

#[cartel_sqlite::query]
pub fn user_with_posts() -> Vec<(User, Post)> {
    User::join::<Post>(|u, p| u.id == p.author_id)
        .filter(|_u, _p| true)
        .order_by(|_u, p| p.id)
        .all()
}

#[cartel_sqlite::query]
pub fn user_left_join_posts() -> i64 {
    User::left_join::<Post>(|u, p| u.id == p.author_id)
        .filter(|_u, _p| true)
        .count()
}

#[cartel_sqlite::query]
pub fn user_post_comment() -> Vec<(User, Post, Comment)> {
    User::join::<Post>(|u, p| u.id == p.author_id)
        .join::<Comment>(|_u, p, c| p.id == c.post_id)
        .filter(|_u, _p, _c| true)
        .order_by(|_u, _p, c| c.id)
        .all()
}

#[cartel_sqlite::query]
pub fn user_post_comment_tag() -> Vec<(User, Post, Comment, Tag)> {
    User::join::<Post>(|u, p| u.id == p.author_id)
        .join::<Comment>(|_u, p, c| p.id == c.post_id)
        .join::<Tag>(|_u, p, _c, t| p.id == t.post_id)
        .filter(|_u, _p, _c, _t| true)
        .order_by(|_u, _p, c, _t| c.id)
        .all()
}

#[cartel_sqlite::query]
pub fn count_user_posts() -> i64 {
    User::join::<Post>(|u, p| u.id == p.author_id)
        .filter(|_u, _p| true)
        .count()
}

#[cartel_sqlite::query]
pub fn post_titles_by_user(uid: i64) -> Vec<String> {
    User::join::<Post>(|u, p| u.id == p.author_id)
        .filter(|u, _p| u.id == uid)
        .select(|_u, p| p.title)
        .all()
}

#[cartel_sqlite::query]
pub fn users_union() -> Vec<User> {
    User::filter(|u| u.id <= 1)
        .union(User::filter(|u| u.id >= 4))
        .rows()
        .order_by(|u| u.id)
        .all()
}

#[cartel_sqlite::query]
pub fn users_union_all() -> Vec<User> {
    User::filter(|u| u.id <= 1)
        .union_all(User::filter(|u| u.id == 1))
        .rows()
        .order_by(|u| u.id)
        .all()
}

#[cartel_sqlite::query]
pub fn users_intersect() -> Vec<User> {
    User::filter(|u| u.age >= 25)
        .intersect(User::filter(|u| u.active))
        .rows()
        .order_by(|u| u.id)
        .all()
}

#[cartel_sqlite::query]
pub fn users_except() -> Vec<User> {
    User::filter(|_u| true)
        .except(User::filter(|u| !u.active))
        .rows()
        .order_by(|u| u.id)
        .all()
}

#[cartel_sqlite::query]
pub fn cte_active_users() -> Vec<User> {
    let active = User::filter(User::active).cte();
    active
        .filter(|u| u.age >= 25)
        .rows()
        .order_by(|u| u.id)
        .all()
}

#[cartel_sqlite::query]
pub fn cte_union(min_age: i32) -> Vec<User> {
    let young = User::filter(User::age < 30).cte();
    let actives = User::filter(User::active).cte();
    young
        .filter(|u| u.age >= min_age)
        .union(actives.filter(|u| u.age >= min_age))
        .rows()
        .order_by(|u| u.id)
        .all()
}

#[cartel_sqlite::query]
pub fn users_with_any_post() -> Vec<User> {
    User::filter(|u| Dialect::exists(Post::filter(|p| p.author_id == u.id)))
        .rows()
        .order_by(|u| u.id)
        .all()
}

#[cartel_sqlite::query]
pub fn users_without_post() -> Vec<User> {
    User::filter(|u| Dialect::not_exists(Post::filter(|p| p.author_id == u.id)))
        .rows()
        .order_by(|u| u.id)
        .all()
}

#[cartel_sqlite::query]
pub fn user_post_counts() -> Vec<(i64, i64, Option<i64>)> {
    User::filter(|_u| true)
        .rows()
        .order_by(|u| u.id)
        .select(|u| {
            (
                u.id,
                Post::filter(|p| p.author_id == u.id).count(),
                Post::filter(|p| p.author_id == u.id).max(|p| p.id),
            )
        })
        .all()
}