use crate::prelude::*;
#[driver_test(requires(not(sql)))]
pub async fn limit_spans_page_boundary(t: &mut Test) -> Result<()> {
#[derive(Debug, toasty::Model)]
#[key(partition = kind, local = seq)]
struct Item {
kind: String,
seq: i64,
payload: String,
}
let mut db = t.setup_db(models!(Item)).await;
let payload = "x".repeat(10_000);
for i in 0..200_i64 {
toasty::create!(Item {
kind: "boundary",
seq: i,
payload: payload.clone(),
})
.exec(&mut db)
.await?;
}
let items: Vec<_> = Item::filter_by_kind("boundary")
.order_by(Item::fields().seq().asc())
.limit(150)
.exec(&mut db)
.await?;
assert_eq!(items.len(), 150);
assert_eq!(items[0].seq, 0);
assert_eq!(items[149].seq, 149);
Ok(())
}
#[driver_test(requires(not(sql)))]
pub async fn limit_offset_spans_page_boundary(t: &mut Test) -> Result<()> {
#[derive(Debug, toasty::Model)]
#[key(partition = kind, local = seq)]
struct Item {
kind: String,
seq: i64,
payload: String,
}
let mut db = t.setup_db(models!(Item)).await;
let payload = "x".repeat(10_000);
for i in 0..200_i64 {
toasty::create!(Item {
kind: "boundary",
seq: i,
payload: payload.clone(),
})
.exec(&mut db)
.await?;
}
let items: Vec<_> = Item::filter_by_kind("boundary")
.order_by(Item::fields().seq().asc())
.limit(100)
.offset(50)
.exec(&mut db)
.await?;
assert_eq!(items.len(), 100);
assert_eq!(items[0].seq, 50);
assert_eq!(items[99].seq, 149);
Ok(())
}
#[driver_test(requires(not(sql)))]
pub async fn limit_spans_page_boundary_gsi(t: &mut Test) -> Result<()> {
#[derive(Debug, toasty::Model)]
struct GsiItem {
#[key]
#[auto]
id: uuid::Uuid,
#[index]
category: String,
seq: i64,
payload: String,
}
let mut db = t.setup_db(models!(GsiItem)).await;
let payload = "x".repeat(10_000);
for i in 0..200_i64 {
toasty::create!(GsiItem {
category: "boundary",
seq: i,
payload: payload.clone(),
})
.exec(&mut db)
.await?;
}
let items: Vec<_> = GsiItem::filter_by_category("boundary")
.limit(150)
.exec(&mut db)
.await?;
assert_eq!(items.len(), 150);
Ok(())
}
#[driver_test(requires(not(sql)))]
pub async fn limit_offset_spans_page_boundary_gsi(t: &mut Test) -> Result<()> {
#[derive(Debug, toasty::Model)]
struct GsiItem {
#[key]
#[auto]
id: uuid::Uuid,
#[index]
category: String,
seq: i64,
payload: String,
}
let mut db = t.setup_db(models!(GsiItem)).await;
let payload = "x".repeat(10_000);
for i in 0..200_i64 {
toasty::create!(GsiItem {
category: "boundary",
seq: i,
payload: payload.clone(),
})
.exec(&mut db)
.await?;
}
let items: Vec<_> = GsiItem::filter_by_category("boundary")
.limit(100)
.offset(50)
.exec(&mut db)
.await?;
assert_eq!(items.len(), 100);
Ok(())
}