use welds::prelude::*;
#[derive(Debug, WeldsModel)]
#[welds(table = "products")]
#[welds(HasMany(orders, Order, "product_id"))]
pub struct Product {
#[welds(primary_key)]
#[welds(rename = "product_id")]
pub id: i32,
pub name: String,
pub description: Option<String>,
#[welds(rename = "price1")]
pub price: Option<f32>,
pub active: bool,
}
#[derive(Debug, WeldsModel)]
#[welds(table = "orders")]
#[welds(BelongsTo(product, Product, "product_id"))]
pub struct Order {
#[welds(primary_key)]
pub id: i32,
pub product_id: Option<i32>,
#[welds(rename = "price")]
pub sale_price: Option<f32>,
}
#[derive(Debug, WeldsModel)]
pub struct ProductSale {
pub product_name: String,
pub sale_price: Option<f32>,
}
#[async_std::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let connection_string = "sqlite::memory:";
let client = welds::connections::connect(connection_string).await?;
let client = client.as_ref();
let schema = include_str!("../../tests/testlib/databases/sqlite/01_create_tables.sql");
client.execute(schema, &[]).await?;
create_data(client).await?;
let q = Order::select(|o| o.sale_price)
.join(
|o| o.product,
Product::select_as(|p| p.name, "product_name"),
);
let product_sales: Vec<ProductSale> = q.run(client).await?.collect_into()?;
for product_sale in product_sales {
println!("Product Sale: {:?}", product_sale);
}
Ok(())
}
async fn create_data(conn: &dyn Client) -> Result<(), Box<dyn std::error::Error>> {
let products: Vec<_> = (0..1000)
.map(|i| Product {
id: 0,
name: format!("product #{}", i),
description: None,
price: Some(i as f32),
active: true,
})
.collect();
welds::query::insert::bulk_insert(conn, &products).await?;
let orders: Vec<_> = (0..500)
.map(|i| Order {
id: 0,
product_id: Some((i + 1) * 2), sale_price: Some((i as f32) + 0.5),
})
.collect();
welds::query::insert::bulk_insert(conn, &orders).await?;
Ok(())
}