Skip to content

Commit 95cdc45

Browse files
committed
feat: batch insert
1 parent 889b231 commit 95cdc45

File tree

5 files changed

+53
-38
lines changed

5 files changed

+53
-38
lines changed

.sqlx/query-7187b571969c741edbc079028bf27ae6614e9e2ce1bd97d4d75c90b97aaf3bce.json

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-bfea23a5a6ba80a5e8a52607b5741437c767c0aa8928590674d8c813a97b11d3.json

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/adapters/discord/commands/bake.rs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,13 @@ pub async fn bake(
6161
msg.build()
6262
};
6363

64-
for entry in &baked {
65-
if let Err(e) = ctx
66-
.data()
67-
.orders
68-
.record_order(&entry.user_id, &guild_id)
69-
.await
70-
{
71-
error!(
72-
user_id = %entry.user_id,
73-
guild_id = %guild_id,
74-
error = ?e,
75-
"Failed to record order"
76-
);
77-
}
64+
let user_ids: Vec<&str> = baked.iter().map(|e| e.user_id.as_str()).collect();
65+
if let Err(e) = ctx.data().orders.record_orders(&user_ids, &guild_id).await {
66+
error!(
67+
guild_id = %guild_id,
68+
error = ?e,
69+
"Failed to record orders"
70+
);
7871
}
7972

8073
ctx.say(message).await?;

src/domain/order.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#[async_trait::async_trait]
22
pub trait OrderRepository: Send + Sync {
3-
async fn record_order(&self, discord_user_id: &str, guild_id: &str) -> anyhow::Result<()>;
3+
async fn record_orders(&self, discord_user_ids: &[&str], guild_id: &str) -> anyhow::Result<()>;
44
async fn daily_stats(&self, guild_id: &str) -> anyhow::Result<DailyStats>;
55
}
66

src/infrastructure/postgres_order_repository.rs

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,43 @@ impl PostgresOrderRepository {
1515

1616
#[async_trait::async_trait]
1717
impl OrderRepository for PostgresOrderRepository {
18-
#[instrument(skip(self), fields(discord_user_id, guild_id))]
19-
async fn record_order(&self, discord_user_id: &str, guild_id: &str) -> anyhow::Result<()> {
20-
debug!(discord_user_id, guild_id, "Recording order");
18+
#[instrument(skip(self), fields(count = discord_user_ids.len(), guild_id))]
19+
async fn record_orders(&self, discord_user_ids: &[&str], guild_id: &str) -> anyhow::Result<()> {
20+
if discord_user_ids.is_empty() {
21+
debug!("No orders to record");
22+
return Ok(());
23+
}
24+
25+
debug!(
26+
count = discord_user_ids.len(),
27+
guild_id, "Recording orders in batch"
28+
);
29+
30+
let discord_user_ids_vec: Vec<String> =
31+
discord_user_ids.iter().map(|&s| s.to_string()).collect();
32+
let guild_ids: Vec<String> = vec![guild_id.to_string(); discord_user_ids.len()];
33+
2134
sqlx::query!(
22-
"INSERT INTO orders (discord_user_id, guild_id) VALUES ($1, $2)",
23-
discord_user_id,
24-
guild_id
35+
"INSERT INTO orders (discord_user_id, guild_id) SELECT * FROM UNNEST($1::text[], $2::text[])",
36+
&discord_user_ids_vec[..],
37+
&guild_ids[..]
2538
)
2639
.execute(&self.pool)
2740
.await
2841
.map_err(|e| {
29-
error!(discord_user_id, guild_id, error = ?e, "Failed to record order in database");
42+
error!(
43+
count = discord_user_ids.len(),
44+
guild_id,
45+
error = ?e,
46+
"Failed to record orders in database"
47+
);
3048
e
3149
})?;
32-
info!(discord_user_id, guild_id, "Order recorded successfully");
50+
51+
info!(
52+
count = discord_user_ids.len(),
53+
guild_id, "Orders recorded successfully"
54+
);
3355
Ok(())
3456
}
3557

0 commit comments

Comments
 (0)