#![cfg(any(feature = "postgres-sync", feature = "tokio-postgres"))]
#[cfg(feature = "uuid")]
use crate::common::schema::postgres::*;
use drizzle::core::expr::*;
use drizzle::postgres::prelude::*;
#[derive(Debug, PostgresFromRow)]
struct GroupSumResult {
active: bool,
total_age: Option<i64>,
}
#[derive(Debug, PostgresFromRow)]
struct GroupCountActiveResult {
active: bool,
total_age: i64,
}
#[derive(Debug, PostgresFromRow)]
struct GroupAvgResult {
active: bool,
avg_score: Option<f64>,
}
#[cfg(feature = "uuid")]
#[drizzle::test]
fn test_group_by_with_count(db: &mut TestDb<ComplexSchema>) {
let ComplexSchema { role: _, complex } = schema;
let test_data = vec![
InsertComplex::new("alice", true, Role::User),
InsertComplex::new("bob", true, Role::Admin),
InsertComplex::new("charlie", false, Role::User),
InsertComplex::new("diana", true, Role::User),
InsertComplex::new("eve", false, Role::Admin),
];
db.insert(complex).values(test_data).execute();
let results: Vec<GroupCountActiveResult> = db
.select((complex.active, alias(count(complex.id), "total_age")))
.from(complex)
.group_by(complex.active)
.order_by(asc(complex.active))
.all();
assert_eq!(results.len(), 2);
assert!(!results[0].active);
assert_eq!(results[0].total_age, 2);
assert!(results[1].active);
assert_eq!(results[1].total_age, 3);
}
#[cfg(feature = "uuid")]
#[drizzle::test]
fn test_group_by_with_sum(db: &mut TestDb<ComplexSchema>) {
let ComplexSchema { role: _, complex } = schema;
let test_data = vec![
InsertComplex::new("alice", true, Role::User).with_age(25),
InsertComplex::new("bob", true, Role::Admin).with_age(30),
InsertComplex::new("charlie", false, Role::User).with_age(35),
InsertComplex::new("diana", false, Role::User).with_age(40),
];
db.insert(complex).values(test_data).execute();
let results: Vec<GroupSumResult> = db
.select((complex.active, alias(sum(complex.age), "total_age")))
.from(complex)
.group_by(complex.active)
.order_by(asc(complex.active))
.all();
assert_eq!(results.len(), 2);
assert!(!results[0].active);
assert_eq!(results[0].total_age, Some(75)); assert!(results[1].active);
assert_eq!(results[1].total_age, Some(55)); }
#[cfg(feature = "uuid")]
#[drizzle::test]
fn test_group_by_with_avg(db: &mut TestDb<ComplexSchema>) {
let ComplexSchema { role: _, complex } = schema;
let test_data = vec![
InsertComplex::new("alice", true, Role::User).with_score(80.0),
InsertComplex::new("bob", true, Role::Admin).with_score(90.0),
InsertComplex::new("charlie", false, Role::User).with_score(70.0),
InsertComplex::new("diana", false, Role::User).with_score(60.0),
];
db.insert(complex).values(test_data).execute();
let results: Vec<GroupAvgResult> = db
.select((complex.active, alias(avg(complex.score), "avg_score")))
.from(complex)
.group_by(complex.active)
.order_by(asc(complex.active))
.all();
assert_eq!(results.len(), 2);
assert!(!results[0].active);
assert!((results[0].avg_score.unwrap() - 65.0).abs() < 0.01);
assert!(results[1].active);
assert!((results[1].avg_score.unwrap() - 85.0).abs() < 0.01);
}
#[cfg(feature = "uuid")]
#[drizzle::test]
fn test_having_filters_groups(db: &mut TestDb<ComplexSchema>) {
let ComplexSchema { role: _, complex } = schema;
let test_data = vec![
InsertComplex::new("alice", true, Role::User),
InsertComplex::new("bob", true, Role::Admin),
InsertComplex::new("charlie", true, Role::User),
InsertComplex::new("diana", false, Role::User),
];
db.insert(complex).values(test_data).execute();
let results: Vec<GroupCountActiveResult> = db
.select((complex.active, alias(count(complex.id), "total_age")))
.from(complex)
.group_by(complex.active)
.having(gt(count(complex.id), 2_i64))
.all();
assert_eq!(results.len(), 1);
assert!(results[0].active);
assert_eq!(results[0].total_age, 3);
}
#[cfg(feature = "uuid")]
#[drizzle::test]
fn test_having_with_sum(db: &mut TestDb<ComplexSchema>) {
let ComplexSchema { role: _, complex } = schema;
let test_data = vec![
InsertComplex::new("alice", true, Role::User).with_age(25),
InsertComplex::new("bob", true, Role::Admin).with_age(30),
InsertComplex::new("charlie", false, Role::User).with_age(10),
];
db.insert(complex).values(test_data).execute();
let results: Vec<GroupSumResult> = db
.select((complex.active, alias(sum(complex.age), "total_age")))
.from(complex)
.group_by(complex.active)
.having(gt(sum(complex.age), 20_i64))
.all();
assert_eq!(results.len(), 1);
assert!(results[0].active);
assert_eq!(results[0].total_age, Some(55));
}
#[cfg(feature = "uuid")]
#[drizzle::test]
fn test_having_no_matching_groups(db: &mut TestDb<ComplexSchema>) {
let ComplexSchema { role: _, complex } = schema;
let test_data = vec![
InsertComplex::new("alice", true, Role::User),
InsertComplex::new("bob", false, Role::User),
];
db.insert(complex).values(test_data).execute();
let results: Vec<GroupCountActiveResult> = db
.select((complex.active, alias(count(complex.id), "total_age")))
.from(complex)
.group_by(complex.active)
.having(gt(count(complex.id), 10_i64))
.all();
assert_eq!(results.len(), 0);
}
#[cfg(feature = "uuid")]
#[drizzle::test]
fn test_group_by_order_by(db: &mut TestDb<ComplexSchema>) {
let ComplexSchema { role: _, complex } = schema;
let test_data = vec![
InsertComplex::new("alice", true, Role::User).with_age(25),
InsertComplex::new("bob", false, Role::Admin).with_age(30),
InsertComplex::new("charlie", true, Role::User).with_age(35),
InsertComplex::new("diana", false, Role::User).with_age(40),
InsertComplex::new("eve", true, Role::Admin).with_age(45),
];
db.insert(complex).values(test_data).execute();
let results: Vec<GroupSumResult> = db
.select((complex.active, alias(sum(complex.age), "total_age")))
.from(complex)
.group_by(complex.active)
.order_by(desc(sum(complex.age)))
.all();
assert_eq!(results.len(), 2);
assert!(results[0].active);
assert_eq!(results[0].total_age, Some(105));
assert!(!results[1].active);
assert_eq!(results[1].total_age, Some(70));
}
#[cfg(feature = "uuid")]
#[drizzle::test]
fn test_group_by_with_limit(db: &mut TestDb<ComplexSchema>) {
let ComplexSchema { role: _, complex } = schema;
let test_data = vec![
InsertComplex::new("alice", true, Role::User).with_age(10),
InsertComplex::new("bob", true, Role::Admin).with_age(20),
InsertComplex::new("charlie", true, Role::User).with_age(30),
InsertComplex::new("diana", false, Role::User).with_age(40),
InsertComplex::new("eve", false, Role::Admin).with_age(50),
];
db.insert(complex).values(test_data).execute();
let results: Vec<GroupSumResult> = db
.select((complex.active, alias(sum(complex.age), "total_age")))
.from(complex)
.group_by(complex.active)
.order_by(desc(sum(complex.age)))
.limit(1)
.all();
assert_eq!(results.len(), 1);
assert!(!results[0].active);
assert_eq!(results[0].total_age, Some(90));
}
#[cfg(feature = "uuid")]
#[drizzle::test]
fn test_group_by_limit_without_order(db: &mut TestDb<ComplexSchema>) {
let ComplexSchema { role: _, complex } = schema;
let test_data = vec![
InsertComplex::new("alice", true, Role::User),
InsertComplex::new("bob", true, Role::Admin),
InsertComplex::new("charlie", false, Role::User),
InsertComplex::new("diana", false, Role::User),
InsertComplex::new("eve", false, Role::Admin),
];
db.insert(complex).values(test_data).execute();
let results: Vec<GroupCountActiveResult> = db
.select((complex.active, alias(count(complex.id), "total_age")))
.from(complex)
.group_by(complex.active)
.limit(1)
.all();
assert_eq!(results.len(), 1);
assert!(results[0].total_age >= 2);
}
#[cfg(feature = "uuid")]
#[drizzle::test]
fn test_group_by_empty_table(db: &mut TestDb<ComplexSchema>) {
let ComplexSchema { role: _, complex } = schema;
let results: Vec<GroupCountActiveResult> = db
.select((complex.active, alias(count(complex.id), "total_age")))
.from(complex)
.group_by(complex.active)
.all();
assert_eq!(results.len(), 0);
}