use ormer::Model;
#[derive(Debug, Model, Clone)]
#[table = "test_agg_users"]
struct TestAggUser {
#[primary(auto)]
id: i32,
name: String,
age: i32,
score: i32,
}
#[tokio::test]
async fn test_count_aggregate() -> Result<(), Box<dyn std::error::Error>> {
let db = ormer::Database::connect(ormer::DbType::Turso, ":memory:").await?;
db.create_table::<TestAggUser>().await?;
db.insert(&TestAggUser {
id: 1,
name: "Alice".to_string(),
age: 20,
score: 85,
})
.await?;
db.insert(&TestAggUser {
id: 2,
name: "Bob".to_string(),
age: 25,
score: 92,
})
.await?;
db.insert(&TestAggUser {
id: 3,
name: "Charlie".to_string(),
age: 22,
score: 78,
})
.await?;
let count: usize = db.select::<TestAggUser>().count(|p| p.id).await?;
println!("COUNT result: {:?}", count);
assert_eq!(count, 3);
Ok(())
}
#[tokio::test]
async fn test_sum_aggregate() -> Result<(), Box<dyn std::error::Error>> {
let db = ormer::Database::connect(ormer::DbType::Turso, ":memory:").await?;
db.create_table::<TestAggUser>().await?;
db.insert(&TestAggUser {
id: 1,
name: "Alice".to_string(),
age: 20,
score: 85,
})
.await?;
db.insert(&TestAggUser {
id: 2,
name: "Bob".to_string(),
age: 25,
score: 92,
})
.await?;
db.insert(&TestAggUser {
id: 3,
name: "Charlie".to_string(),
age: 22,
score: 78,
})
.await?;
let sum: Option<i32> = db.select::<TestAggUser>().sum(|p| p.age).await?;
println!("SUM result: {:?}", sum);
assert_eq!(sum, Some(67));
Ok(())
}
#[tokio::test]
async fn test_avg_aggregate() -> Result<(), Box<dyn std::error::Error>> {
let db = ormer::Database::connect(ormer::DbType::Turso, ":memory:").await?;
db.create_table::<TestAggUser>().await?;
db.insert(&TestAggUser {
id: 1,
name: "Alice".to_string(),
age: 20,
score: 85,
})
.await?;
db.insert(&TestAggUser {
id: 2,
name: "Bob".to_string(),
age: 25,
score: 92,
})
.await?;
db.insert(&TestAggUser {
id: 3,
name: "Charlie".to_string(),
age: 22,
score: 78,
})
.await?;
let avg: Option<f64> = db.select::<TestAggUser>().avg(|p| p.score).await?;
println!("AVG result: {:?}", avg);
assert!((avg.unwrap() - 85.0).abs() < 0.01);
Ok(())
}
#[tokio::test]
async fn test_max_aggregate() -> Result<(), Box<dyn std::error::Error>> {
let db = ormer::Database::connect(ormer::DbType::Turso, ":memory:").await?;
db.create_table::<TestAggUser>().await?;
db.insert(&TestAggUser {
id: 1,
name: "Alice".to_string(),
age: 20,
score: 85,
})
.await?;
db.insert(&TestAggUser {
id: 2,
name: "Bob".to_string(),
age: 25,
score: 92,
})
.await?;
db.insert(&TestAggUser {
id: 3,
name: "Charlie".to_string(),
age: 22,
score: 78,
})
.await?;
let max: Option<i32> = db.select::<TestAggUser>().max(|p| p.age).await?;
println!("MAX result: {:?}", max);
assert_eq!(max, Some(25));
Ok(())
}
#[tokio::test]
async fn test_min_aggregate() -> Result<(), Box<dyn std::error::Error>> {
let db = ormer::Database::connect(ormer::DbType::Turso, ":memory:").await?;
db.create_table::<TestAggUser>().await?;
db.insert(&TestAggUser {
id: 1,
name: "Alice".to_string(),
age: 20,
score: 85,
})
.await?;
db.insert(&TestAggUser {
id: 2,
name: "Bob".to_string(),
age: 25,
score: 92,
})
.await?;
db.insert(&TestAggUser {
id: 3,
name: "Charlie".to_string(),
age: 22,
score: 78,
})
.await?;
let min: Option<i32> = db.select::<TestAggUser>().min(|p| p.age).await?;
println!("MIN result: {:?}", min);
assert_eq!(min, Some(20));
Ok(())
}
#[tokio::test]
async fn test_aggregate_with_filter() -> Result<(), Box<dyn std::error::Error>> {
let db = ormer::Database::connect(ormer::DbType::Turso, ":memory:").await?;
db.create_table::<TestAggUser>().await?;
db.insert(&TestAggUser {
id: 1,
name: "Alice".to_string(),
age: 20,
score: 85,
})
.await?;
db.insert(&TestAggUser {
id: 2,
name: "Bob".to_string(),
age: 25,
score: 92,
})
.await?;
db.insert(&TestAggUser {
id: 3,
name: "Charlie".to_string(),
age: 22,
score: 78,
})
.await?;
let count: usize = db
.select::<TestAggUser>()
.filter(|p| p.age.ge(22))
.count(|p| p.id)
.await?;
println!("COUNT with filter result: {:?}", count);
assert_eq!(count, 2);
let max: Option<i32> = db
.select::<TestAggUser>()
.filter(|p| p.age.ge(22))
.max(|p| p.score)
.await?;
println!("MAX with filter result: {:?}", max);
assert_eq!(max, Some(92));
Ok(())
}