use spg_engine::{Engine, QueryResult};
use std::time::Instant;
fn seed_inbox_25k(db: &mut Engine) {
db.execute("CREATE TABLE mailboxes (id BIGSERIAL PRIMARY KEY, name TEXT, user_address TEXT)")
.unwrap();
db.execute("CREATE TABLE messages (id BIGSERIAL PRIMARY KEY, mailbox_id BIGINT, thread_id TEXT, subject TEXT, sender TEXT, internal_date BIGINT, flags BIGINT, pinned BOOLEAN, archived BOOLEAN, importance_level TEXT, importance_score REAL, message_id TEXT, text_body TEXT)").unwrap();
db.execute("CREATE TABLE email_analysis (message_id BIGINT PRIMARY KEY, category TEXT, summary TEXT, requires_action BOOLEAN)").unwrap();
db.execute("CREATE INDEX idx_thread ON messages(thread_id)")
.unwrap();
for i in 0..30 {
db.execute(&format!(
"INSERT INTO mailboxes (name, user_address) VALUES ('mb{i}', 'u@x')"
))
.unwrap();
}
let body = "lorem ipsum dolor sit amet ".repeat(40);
for batch in 0..50 {
let mut vals = Vec::new();
for j in 0..500 {
let i = batch * 500 + j;
vals.push(format!(
"({}, 'th-{i}', 'subject {i}', 's{}@x', {}, {}, false, false, 'normal', 0.5, 'mid-{i}', '{body} {i}')",
(i % 30) + 1,
i % 100,
1_700_000_000 + i,
i % 8
));
}
db.execute(&format!(
"INSERT INTO messages (mailbox_id, thread_id, subject, sender, internal_date, flags, pinned, archived, importance_level, importance_score, message_id, text_body) VALUES {}",
vals.join(",")
))
.unwrap();
}
let mut vals = Vec::new();
for i in 0..6000 {
vals.push(format!(
"({}, 'cat{}', 'summary {i}', {})",
i * 4 + 1,
i % 5,
i % 2 == 0
));
if vals.len() == 500 {
db.execute(&format!(
"INSERT INTO email_analysis (message_id, category, summary, requires_action) VALUES {}",
vals.join(",")
))
.unwrap();
vals.clear();
}
}
}
fn time_query(db: &mut Engine, sql: &str, n: usize, label: &str, budget_ms: f64) {
db.execute(sql).unwrap(); let mut samples = Vec::with_capacity(n);
for _ in 0..n {
let t = Instant::now();
let r = db.execute(sql).unwrap();
let elapsed = t.elapsed();
if !matches!(r, QueryResult::Rows { .. } | QueryResult::CommandOk { .. }) {
panic!("unexpected result for {label}: {r:?}");
}
samples.push(elapsed.as_secs_f64() * 1000.0);
}
samples.sort_by(|a, b| a.partial_cmp(b).unwrap());
let p50 = samples[samples.len() / 2];
let min = samples[0];
let max = *samples.last().unwrap();
eprintln!("baseline {label} SPGE: p50={p50:.2}ms min={min:.2}ms max={max:.2}ms (n={n})");
assert!(
p50 < budget_ms,
"{label} SPGE p50={p50:.2}ms exceeded baseline budget {budget_ms} ms"
);
}
#[test]
fn baseline_select_1() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT id FROM messages WHERE id = 1",
10,
"select_1",
50.0,
);
}
#[test]
fn baseline_select_count_star() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT COUNT(*) FROM messages",
10,
"select_count_star",
100.0,
);
}
#[test]
fn baseline_proj_25k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT m.id, m.subject, m.sender, m.internal_date, mb.user_address \
FROM messages m JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x'",
10,
"proj_25k",
500.0,
);
}
#[test]
fn baseline_inbox_25k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT m.thread_id, MAX(m.subject), COUNT(DISTINCT m.id), MAX(m.internal_date), \
COALESCE((SELECT e2.category FROM email_analysis e2 JOIN messages m2 ON e2.message_id = m2.id \
WHERE m2.thread_id = m.thread_id ORDER BY m2.internal_date DESC LIMIT 1), 'general'), \
COALESCE((SELECT e3.summary FROM email_analysis e3 JOIN messages m3 ON e3.message_id = m3.id \
WHERE m3.thread_id = m.thread_id ORDER BY m3.internal_date DESC LIMIT 1), ''), \
COALESCE((SELECT LEFT(m4.text_body, 120) FROM messages m4 WHERE m4.thread_id = m.thread_id \
ORDER BY m4.internal_date DESC LIMIT 1), ''), \
BOOL_OR(m.pinned), BOOL_OR(m.archived), \
COALESCE((array_agg(m.importance_level ORDER BY m.importance_score DESC NULLS LAST))[1], 'normal'), \
COALESCE(MAX(m.importance_score), 0.0), COALESCE(BOOL_OR(ea.requires_action), false) \
FROM messages m JOIN mailboxes mb ON m.mailbox_id = mb.id \
LEFT JOIN email_analysis ea ON ea.message_id = m.id \
WHERE mb.user_address = 'u@x' AND m.thread_id != '' \
GROUP BY m.thread_id HAVING BOOL_OR(m.archived) = false \
ORDER BY MAX(m.internal_date) DESC LIMIT 50",
10,
"inbox_25k",
4000.0,
);
}
#[test]
fn baseline_exists_in_60() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT COUNT(*) FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x' \
AND EXISTS (SELECT 1 FROM email_analysis ea WHERE ea.message_id = m.id)",
10,
"exists_in_60",
500.0,
);
}
#[test]
fn baseline_exists_filter_three_forms() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
let forms: &[(&str, &str)] = &[
(
"exists_subquery",
"SELECT COUNT(*) FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x' \
AND EXISTS (SELECT 1 FROM email_analysis ea WHERE ea.message_id = m.id)",
),
(
"in_subquery",
"SELECT COUNT(*) FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x' \
AND m.id IN (SELECT message_id FROM email_analysis)",
),
(
"manual_join",
"SELECT COUNT(*) FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
JOIN email_analysis ea ON ea.message_id = m.id \
WHERE mb.user_address = 'u@x'",
),
];
for (label, sql) in forms {
time_query(&mut db, sql, 10, label, 1000.0);
}
}
#[test]
fn baseline_in_subquery_three_forms() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
let ids: Vec<i64> = match db
.execute("SELECT message_id FROM email_analysis ORDER BY message_id")
.unwrap()
{
QueryResult::Rows { rows, .. } => rows
.into_iter()
.filter_map(|r| match r.values.into_iter().next() {
Some(spg_storage::Value::BigInt(n)) => Some(n),
Some(spg_storage::Value::Int(n)) => Some(i64::from(n)),
_ => None,
})
.collect(),
_ => Vec::new(),
};
let lit_in_list = ids.iter().map(i64::to_string).collect::<Vec<_>>().join(",");
let forms: &[(&str, String)] = &[
(
"in_subquery_join",
"SELECT COUNT(*) FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x' \
AND m.id IN (SELECT message_id FROM email_analysis)"
.into(),
),
(
"in_literal_list_join",
format!(
"SELECT COUNT(*) FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x' AND m.id IN ({lit_in_list})"
),
),
(
"in_literal_list_no_join",
format!("SELECT COUNT(*) FROM messages WHERE id IN ({lit_in_list})"),
),
(
"in_literal_list_join_proj",
format!(
"SELECT m.id FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x' AND m.id IN ({lit_in_list})"
),
),
];
for (label, sql) in forms {
time_query(&mut db, sql, 10, label, 1000.0);
}
}
#[test]
fn baseline_not_exists_filter() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT m.id, m.sender FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x' \
AND NOT EXISTS (SELECT 1 FROM email_analysis ea WHERE ea.message_id = m.id) \
ORDER BY m.id DESC LIMIT 200",
10,
"not_exists_filter",
500.0,
);
}
#[test]
#[ignore = "250k-row seed runs ~40 s; run via `cargo test ... -- --ignored`"]
fn baseline_mailrs_prod_not_exists_shape() {
let _g = crate::perf_lock();
let mut db = Engine::new();
db.execute("CREATE TABLE mailboxes (id BIGSERIAL PRIMARY KEY, name TEXT, user_address TEXT)")
.unwrap();
db.execute(
"CREATE TABLE messages (id BIGSERIAL PRIMARY KEY, mailbox_id BIGINT, sender TEXT, \
maildir_id TEXT, size BIGINT, internal_date BIGINT)",
)
.unwrap();
db.execute("CREATE TABLE attachment_content (message_id BIGINT PRIMARY KEY, payload TEXT)")
.unwrap();
db.execute("CREATE INDEX idx_messages_size ON messages(size)")
.unwrap();
for i in 0..25 {
db.execute(&format!(
"INSERT INTO mailboxes (name, user_address) VALUES ('mb{i}', 'u@x')"
))
.unwrap();
}
for batch in 0..500 {
let mut vals = Vec::new();
for j in 0..500 {
let i = batch * 500 + j;
vals.push(format!(
"({}, 's{}@x', 'md-{i}', {}, {})",
(i % 25) + 1,
i % 100,
if i % 17 == 0 { 0 } else { 1024 },
1_700_000_000 + i,
));
}
db.execute(&format!(
"INSERT INTO messages (mailbox_id, sender, maildir_id, size, internal_date) VALUES {}",
vals.join(",")
))
.unwrap();
}
let mut vals = Vec::new();
let mut n = 0;
for i in (1..=250_000).step_by(17) {
vals.push(format!("({}, 'payload-{i}')", i));
n += 1;
if n % 500 == 0 {
db.execute(&format!(
"INSERT INTO attachment_content (message_id, payload) VALUES {}",
vals.join(",")
))
.unwrap();
vals.clear();
}
}
if !vals.is_empty() {
db.execute(&format!(
"INSERT INTO attachment_content (message_id, payload) VALUES {}",
vals.join(",")
))
.unwrap();
}
time_query(
&mut db,
"SELECT m.id, m.sender, m.maildir_id, mb.user_address \
FROM messages m JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE m.size > 0 \
AND NOT EXISTS (SELECT 1 FROM attachment_content ac WHERE ac.message_id = m.id) \
ORDER BY m.id DESC LIMIT 200",
10,
"mailrs_prod_not_exists",
500.0,
);
time_query(
&mut db,
"SELECT m.id, m.sender, m.maildir_id, mb.user_address \
FROM messages m JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE m.size > 0 \
AND m.id NOT IN (SELECT message_id FROM attachment_content) \
ORDER BY m.id DESC LIMIT 200",
10,
"mailrs_prod_not_in",
500.0,
);
time_query(
&mut db,
"SELECT m.id, m.sender, m.maildir_id FROM messages m \
WHERE m.size > 0 \
ORDER BY m.id DESC LIMIT 200",
10,
"mailrs_prod_plain_limit",
500.0,
);
}
#[test]
#[ignore = "250k-row seed runs ~40 s; run via `cargo test ... -- --ignored`"]
fn baseline_mailrs_prod_not_exists_real_schema() {
let _g = crate::perf_lock();
let mut db = Engine::new();
db.execute("CREATE TABLE mailboxes (id BIGSERIAL PRIMARY KEY, name TEXT, user_address TEXT)")
.unwrap();
db.execute(
"CREATE TABLE messages (id BIGSERIAL PRIMARY KEY, mailbox_id BIGINT, sender TEXT, \
maildir_id TEXT, size BIGINT, internal_date BIGINT)",
)
.unwrap();
db.execute(
"CREATE TABLE attachment_content (\
id BIGSERIAL PRIMARY KEY, \
message_id BIGINT NOT NULL, \
attachment_index SMALLINT NOT NULL, \
content_type TEXT NOT NULL, \
extracted_text TEXT, \
UNIQUE(message_id, attachment_index))",
)
.unwrap();
db.execute("CREATE INDEX idx_attachment_content_message ON attachment_content(message_id)")
.unwrap();
db.execute("CREATE INDEX idx_messages_size ON messages(size)")
.unwrap();
for i in 0..25 {
db.execute(&format!(
"INSERT INTO mailboxes (name, user_address) VALUES ('mb{i}', 'u@x')"
))
.unwrap();
}
for batch in 0..500 {
let mut vals = Vec::new();
for j in 0..500 {
let i = batch * 500 + j;
vals.push(format!(
"({}, 's{}@x', 'md-{i}', {}, {})",
(i % 25) + 1,
i % 100,
if i % 17 == 0 { 0 } else { 1024 },
1_700_000_000 + i,
));
}
db.execute(&format!(
"INSERT INTO messages (mailbox_id, sender, maildir_id, size, internal_date) VALUES {}",
vals.join(",")
))
.unwrap();
}
let mut vals = Vec::new();
let mut n = 0;
for i in (1..=250_000).step_by(17) {
vals.push(format!("({i}, 0, 'text/plain', 'payload-{i}')"));
n += 1;
if n % 500 == 0 {
db.execute(&format!(
"INSERT INTO attachment_content (message_id, attachment_index, content_type, extracted_text) VALUES {}",
vals.join(",")
))
.unwrap();
vals.clear();
}
}
if !vals.is_empty() {
db.execute(&format!(
"INSERT INTO attachment_content (message_id, attachment_index, content_type, extracted_text) VALUES {}",
vals.join(",")
))
.unwrap();
}
time_query(
&mut db,
"SELECT m.id, m.sender, m.maildir_id, mb.user_address \
FROM messages m JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE m.size > 0 \
AND NOT EXISTS (SELECT 1 FROM attachment_content ac WHERE ac.message_id = m.id) \
ORDER BY m.id DESC LIMIT 200",
10,
"mailrs_prod_real_schema_not_exists",
500.0,
);
}
#[test]
fn baseline_count_messages() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT COUNT(*) FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x'",
10,
"count_messages",
100.0,
);
}
#[test]
fn baseline_user_storage_usage() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT COALESCE(SUM(LENGTH(m.text_body)), 0) FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x'",
10,
"user_storage_usage",
100.0,
);
}
#[test]
fn baseline_user_storage_usage_fold_probe() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT COALESCE(SUM(LENGTH(text_body)), 0) FROM messages \
WHERE mailbox_id = 1",
10,
"user_storage_usage_fold_probe",
100.0,
);
}
#[test]
fn baseline_count_messages_fold_eq_qualified() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT COUNT(*) FROM messages m WHERE m.mailbox_id = 1",
10,
"fold_eq_qualified",
100.0,
);
}
#[test]
fn baseline_count_messages_fold_in1() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT COUNT(*) FROM messages m WHERE m.mailbox_id IN (1)",
10,
"fold_in1",
100.0,
);
}
#[test]
fn baseline_count_messages_fold_in25() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT COUNT(*) FROM messages m WHERE m.mailbox_id IN \
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)",
10,
"fold_in25",
100.0,
);
}
#[test]
fn baseline_count_messages_fold_probe() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT COUNT(*) FROM messages WHERE mailbox_id = 1",
10,
"count_messages_fold_probe",
100.0,
);
}
#[test]
fn baseline_list_categories() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT ea.category, COUNT(DISTINCT m.thread_id) \
FROM email_analysis ea \
JOIN messages m ON ea.message_id = m.id \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x' AND m.thread_id != '' \
GROUP BY ea.category \
ORDER BY COUNT(DISTINCT m.thread_id) DESC",
10,
"list_categories",
500.0,
);
}
#[test]
fn baseline_list_thread_messages() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT m.id, m.mailbox_id, m.sender, m.subject, m.internal_date, \
m.flags, m.message_id, m.thread_id, mb.user_address, \
COALESCE(m.importance_level, 'normal'), COALESCE(m.importance_score, 0.0) \
FROM messages m JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x' AND m.thread_id = 'th-1000' \
ORDER BY m.internal_date ASC",
10,
"list_thread_messages",
100.0,
);
}
fn seed_with_sender_cardinality_wide(
db: &mut Engine,
n_messages: usize,
distinct_senders: usize,
body_len: usize,
) {
db.execute("CREATE TABLE mailboxes (id BIGSERIAL PRIMARY KEY, name TEXT, user_address TEXT)")
.unwrap();
db.execute(
"CREATE TABLE messages (id BIGSERIAL PRIMARY KEY, mailbox_id BIGINT, thread_id TEXT, \
subject TEXT, sender TEXT, internal_date BIGINT, flags BIGINT, pinned BOOLEAN, \
archived BOOLEAN, importance_level TEXT, importance_score REAL, message_id TEXT, \
text_body TEXT)",
)
.unwrap();
db.execute("INSERT INTO mailboxes (name, user_address) VALUES ('default', 'u@x')")
.unwrap();
let body_template: String = (0..body_len)
.map(|i| char::from(b'a' + (i % 26) as u8))
.collect();
let body_sql_safe = body_template.replace('\'', "''");
let mut vals = String::new();
let mut count = 0;
for i in 0..n_messages {
if !vals.is_empty() {
vals.push(',');
}
use std::fmt::Write;
let sender_idx = i % distinct_senders;
let _ = write!(
vals,
"(1, 'thr{}', 'subj{i}', 'sender{sender_idx}@example.com', {}, 0, false, false, 'normal', 0.5, 'm{i}', '{body_sql_safe}')",
i % 1000,
1_700_000_000_i64 + i as i64
);
count += 1;
if count == 100 {
let sql = format!(
"INSERT INTO messages (mailbox_id, thread_id, subject, sender, internal_date, flags, pinned, archived, importance_level, importance_score, message_id, text_body) VALUES {vals}"
);
db.execute(&sql).unwrap();
vals.clear();
count = 0;
}
}
if !vals.is_empty() {
let sql = format!(
"INSERT INTO messages (mailbox_id, thread_id, subject, sender, internal_date, flags, pinned, archived, importance_level, importance_score, message_id, text_body) VALUES {vals}"
);
db.execute(&sql).unwrap();
}
}
fn seed_with_sender_cardinality(db: &mut Engine, n_messages: usize, distinct_senders: usize) {
db.execute("CREATE TABLE mailboxes (id BIGSERIAL PRIMARY KEY, name TEXT, user_address TEXT)")
.unwrap();
db.execute(
"CREATE TABLE messages (id BIGSERIAL PRIMARY KEY, mailbox_id BIGINT, thread_id TEXT, \
subject TEXT, sender TEXT, internal_date BIGINT, flags BIGINT, pinned BOOLEAN, \
archived BOOLEAN, importance_level TEXT, importance_score REAL, message_id TEXT, \
text_body TEXT)",
)
.unwrap();
db.execute("INSERT INTO mailboxes (name, user_address) VALUES ('default', 'u@x')")
.unwrap();
let mut vals = String::new();
let mut count = 0;
for i in 0..n_messages {
if !vals.is_empty() {
vals.push(',');
}
use std::fmt::Write;
let sender_idx = i % distinct_senders;
let _ = write!(
vals,
"(1, 'thr{}', 'subj{i}', 'sender{sender_idx}@example.com', {}, 0, false, false, 'normal', 0.5, 'm{i}', 'body {i}')",
i % 1000,
1_700_000_000_i64 + i as i64
);
count += 1;
if count == 500 {
let sql = format!(
"INSERT INTO messages (mailbox_id, thread_id, subject, sender, internal_date, flags, pinned, archived, importance_level, importance_score, message_id, text_body) VALUES {vals}"
);
db.execute(&sql).unwrap();
vals.clear();
count = 0;
}
}
if !vals.is_empty() {
let sql = format!(
"INSERT INTO messages (mailbox_id, thread_id, subject, sender, internal_date, flags, pinned, archived, importance_level, importance_score, message_id, text_body) VALUES {vals}"
);
db.execute(&sql).unwrap();
}
}
const CONTACTS_TOPN_SQL: &str = "SELECT m.sender FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x' AND m.sender ILIKE '%%' \
AND m.sender != '' \
GROUP BY m.sender \
ORDER BY MAX(m.internal_date) DESC LIMIT 20";
#[test]
fn baseline_grouped_textkey_topn_100() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_with_sender_cardinality(&mut db, 25_000, 100);
time_query(
&mut db,
CONTACTS_TOPN_SQL,
10,
"grouped_textkey_topn_100",
500.0,
);
}
#[test]
fn baseline_grouped_textkey_topn_1k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_with_sender_cardinality(&mut db, 25_000, 1_000);
time_query(
&mut db,
CONTACTS_TOPN_SQL,
10,
"grouped_textkey_topn_1k",
500.0,
);
}
#[test]
fn baseline_grouped_textkey_topn_5k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_with_sender_cardinality(&mut db, 25_000, 5_000);
time_query(
&mut db,
CONTACTS_TOPN_SQL,
10,
"grouped_textkey_topn_5k",
500.0,
);
}
#[test]
fn baseline_grouped_textkey_topn_5k_body1k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_with_sender_cardinality_wide(&mut db, 25_000, 5_000, 1024);
time_query(
&mut db,
CONTACTS_TOPN_SQL,
10,
"grouped_textkey_topn_5k_body1k",
1500.0,
);
}
#[test]
fn baseline_grouped_textkey_topn_5k_body5k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_with_sender_cardinality_wide(&mut db, 25_000, 5_000, 5120);
time_query(
&mut db,
CONTACTS_TOPN_SQL,
10,
"grouped_textkey_topn_5k_body5k",
2000.0,
);
}
#[test]
fn baseline_get_contacts() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
time_query(
&mut db,
"SELECT m.sender FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'u@x' AND m.sender ILIKE '%%' AND m.sender != '' \
GROUP BY m.sender \
ORDER BY MAX(m.internal_date) DESC LIMIT 20",
10,
"get_contacts",
500.0,
);
}
#[test]
fn baseline_get_conversations_in_60() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_inbox_25k(&mut db);
let ids: String = (0..60)
.map(|i| format!("'th-{}'", i * 400))
.collect::<Vec<_>>()
.join(",");
let sql = format!(
"SELECT m.thread_id, MAX(m.internal_date), \
COALESCE((SELECT LEFT(ea.summary, 80) FROM email_analysis ea \
JOIN messages m_snip ON ea.message_id = m_snip.id \
WHERE m_snip.thread_id = m.thread_id \
AND ea.summary IS NOT NULL AND ea.summary != '' \
ORDER BY m_snip.internal_date DESC LIMIT 1), '') \
FROM messages m \
WHERE m.thread_id IN ({ids}) \
GROUP BY m.thread_id"
);
time_query(&mut db, &sql, 10, "get_conversations_in_60", 1000.0);
}
fn seed_mailrs_inbox(db: &mut Engine, n_messages: usize) {
db.execute("CREATE TABLE mailboxes (id BIGSERIAL PRIMARY KEY, name TEXT, user_address TEXT)")
.unwrap();
db.execute(
"CREATE TABLE messages (id BIGSERIAL PRIMARY KEY, mailbox_id BIGINT, thread_id TEXT, \
subject TEXT, sender TEXT, internal_date BIGINT, flags BIGINT, pinned BOOLEAN, \
archived BOOLEAN, importance_level TEXT, importance_score REAL, message_id TEXT, \
text_body TEXT)",
)
.unwrap();
db.execute(
"CREATE TABLE email_analysis (message_id BIGINT PRIMARY KEY, category TEXT, \
summary TEXT, requires_action BOOLEAN)",
)
.unwrap();
db.execute("CREATE INDEX idx_messages_thread ON messages(thread_id)")
.unwrap();
db.execute("CREATE INDEX idx_messages_thread_date ON messages(thread_id, internal_date DESC)")
.unwrap();
db.execute("CREATE INDEX idx_messages_mailbox ON messages(mailbox_id)")
.unwrap();
db.execute("CREATE INDEX idx_mailboxes_user ON mailboxes(user_address, name)")
.unwrap();
db.execute(
"CREATE TABLE snoozed_conversations (\
thread_id TEXT NOT NULL, account_address TEXT NOT NULL, \
snoozed_until BIGINT NOT NULL, \
PRIMARY KEY (thread_id, account_address))",
)
.unwrap();
for i in 0..10 {
db.execute(&format!(
"INSERT INTO mailboxes (name, user_address) VALUES ('mb{i}', 'lihao@golia.jp')"
))
.unwrap();
}
let msgs_per_thread: usize = 5;
let n_senders: usize = 600;
let body = "lorem ipsum dolor sit amet ".repeat(20);
let batch_size: usize = 500;
let mut vals = String::new();
let mut count = 0usize;
for i in 0..n_messages {
if !vals.is_empty() {
vals.push(',');
}
use std::fmt::Write;
let mailbox_id = (i % 10) + 1;
let thread_idx = i / msgs_per_thread;
let sender_idx = i % n_senders;
let mid = if i % 5 == 0 {
String::new()
} else {
format!("mid-{i}")
};
let flags = i32::from(i % 10 >= 3);
let _ = write!(
vals,
"({}, 'th-{}', 'subj{i}', 'sender{}@example.com', {}, {}, false, false, 'normal', 0.5, '{}', '{body} {i}')",
mailbox_id,
thread_idx,
sender_idx,
1_700_000_000_i64 + i as i64,
flags,
mid
);
count += 1;
if count == batch_size {
db.execute(&format!(
"INSERT INTO messages (mailbox_id, thread_id, subject, sender, internal_date, flags, pinned, archived, importance_level, importance_score, message_id, text_body) VALUES {vals}"
)).unwrap();
vals.clear();
count = 0;
}
}
if !vals.is_empty() {
db.execute(&format!(
"INSERT INTO messages (mailbox_id, thread_id, subject, sender, internal_date, flags, pinned, archived, importance_level, importance_score, message_id, text_body) VALUES {vals}"
)).unwrap();
}
let ea_rows = n_messages / 4;
let mut vals = String::new();
let mut count = 0usize;
for k in 0..ea_rows {
let mid = (k * 4 + 1) as i64; if !vals.is_empty() {
vals.push(',');
}
use std::fmt::Write;
let _ = write!(
vals,
"({mid}, 'cat{}', 'summary {k}', {})",
k % 5,
k % 2 == 0
);
count += 1;
if count == 500 {
db.execute(&format!(
"INSERT INTO email_analysis (message_id, category, summary, requires_action) VALUES {vals}"
)).unwrap();
vals.clear();
count = 0;
}
}
if !vals.is_empty() {
db.execute(&format!(
"INSERT INTO email_analysis (message_id, category, summary, requires_action) VALUES {vals}"
)).unwrap();
}
db.execute("ANALYZE").unwrap();
}
const MAILRS_MINIMAL_SQL: &str = "\
SELECT m.thread_id, MAX(m.internal_date) \
FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'lihao@golia.jp' \
GROUP BY m.thread_id \
ORDER BY MAX(m.internal_date) DESC \
LIMIT 50";
const MAILRS_DISTINCT_AGGS_SQL: &str = "\
SELECT m.thread_id, \
MAX(m.subject), \
string_agg(DISTINCT m.sender, ','), \
COUNT(DISTINCT CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END), \
COUNT(DISTINCT CASE WHEN (m.flags & 1) = 0 \
THEN CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END \
END), \
MAX(m.internal_date) \
FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'lihao@golia.jp' \
GROUP BY m.thread_id \
ORDER BY MAX(m.internal_date) DESC \
LIMIT 50";
fn dump_explain(db: &mut Engine, label: &str, sql: &str) {
if let Ok(QueryResult::Rows { rows, .. }) = db.execute(&format!("EXPLAIN {sql}")) {
eprintln!("--- EXPLAIN {label} ---");
for row in rows {
for cell in &row.values {
eprintln!("{cell:?}");
}
}
eprintln!("--- end EXPLAIN ---");
}
}
#[test]
#[ignore = "P0 mailrs-shape reproducer; --include-ignored to run"]
fn baseline_mailrs_minimal_30k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 30_000);
dump_explain(&mut db, "mailrs_minimal_30k", MAILRS_MINIMAL_SQL);
time_query(
&mut db,
MAILRS_MINIMAL_SQL,
10,
"mailrs_minimal_30k",
1500.0,
);
}
#[test]
#[ignore = "P0 mailrs-shape reproducer; --include-ignored to run"]
fn baseline_mailrs_minimal_100k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 100_000);
dump_explain(&mut db, "mailrs_minimal_100k", MAILRS_MINIMAL_SQL);
time_query(
&mut db,
MAILRS_MINIMAL_SQL,
10,
"mailrs_minimal_100k",
10_000.0,
);
}
#[test]
#[ignore = "P0 mailrs-shape reproducer; --include-ignored to run"]
fn baseline_mailrs_distinct_aggs_30k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 30_000);
dump_explain(
&mut db,
"mailrs_distinct_aggs_30k",
MAILRS_DISTINCT_AGGS_SQL,
);
time_query(
&mut db,
MAILRS_DISTINCT_AGGS_SQL,
10,
"mailrs_distinct_aggs_30k",
2_000.0,
);
}
#[test]
#[ignore = "P0 mailrs-shape reproducer; --include-ignored to run"]
fn baseline_mailrs_distinct_aggs_100k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 100_000);
dump_explain(
&mut db,
"mailrs_distinct_aggs_100k",
MAILRS_DISTINCT_AGGS_SQL,
);
time_query(
&mut db,
MAILRS_DISTINCT_AGGS_SQL,
10,
"mailrs_distinct_aggs_100k",
20_000.0,
);
}
const MAILRS_PROD_REAL_SQL: &str = "\
SELECT m.thread_id, MAX(m.subject), string_agg(DISTINCT m.sender, ','), \
COUNT(DISTINCT CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END), \
COUNT(DISTINCT CASE WHEN (m.flags & 1) = 0 \
THEN CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END \
END), \
MAX(m.internal_date), \
COALESCE((SELECT ea.category FROM email_analysis ea \
JOIN messages m2 ON ea.message_id = m2.id \
WHERE m2.thread_id = m.thread_id \
ORDER BY m2.internal_date DESC LIMIT 1), \
'general'), \
BOOL_OR((m.flags & 4) != 0), \
COALESCE( \
(SELECT LEFT(ea_snip.summary, 80) FROM email_analysis ea_snip \
JOIN messages m_snip ON ea_snip.message_id = m_snip.id \
WHERE m_snip.thread_id = m.thread_id \
AND ea_snip.summary IS NOT NULL \
AND ea_snip.summary != '' \
ORDER BY m_snip.internal_date DESC LIMIT 1), \
(SELECT LEFT(m3.text_body, 80) FROM messages m3 \
WHERE m3.thread_id = m.thread_id \
AND m3.text_body IS NOT NULL \
AND m3.text_body != '' \
ORDER BY m3.internal_date DESC LIMIT 1), \
''), \
BOOL_OR(m.pinned), \
BOOL_OR(m.archived), \
COALESCE((array_agg(m.importance_level \
ORDER BY m.importance_score DESC NULLS LAST))[1], \
'normal'), \
COALESCE(MAX(m.importance_score), 0.0), \
COALESCE(BOOL_OR(ea.requires_action), false), \
COALESCE((array_agg(m.sender ORDER BY m.internal_date DESC))[1], ''), \
COUNT(DISTINCT CASE WHEN mb.name = 'Sent' AND m.message_id != '' \
THEN m.message_id \
WHEN mb.name = 'Sent' \
THEN CAST(m.id AS TEXT) END) \
FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
LEFT JOIN email_analysis ea ON ea.message_id = m.id \
WHERE mb.user_address = 'lihao@golia.jp' \
AND thread_id != '' \
AND NOT EXISTS (SELECT 1 FROM snoozed_conversations sc \
WHERE sc.thread_id = m.thread_id \
AND sc.account_address = mb.user_address \
AND sc.snoozed_until > 0) \
GROUP BY m.thread_id \
HAVING BOOL_OR(m.archived) = false \
AND BOOL_OR(mb.name != 'Sent') = true \
ORDER BY BOOL_OR(m.pinned) DESC, MAX(m.internal_date) DESC \
LIMIT 50";
#[test]
#[ignore = "P0 mailrs prod-real reproducer; --include-ignored to run"]
fn baseline_mailrs_prod_real_30k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 30_000);
dump_explain(&mut db, "mailrs_prod_real_30k", MAILRS_PROD_REAL_SQL);
time_query(
&mut db,
MAILRS_PROD_REAL_SQL,
10,
"mailrs_prod_real_30k",
5_000.0,
);
}
#[test]
#[ignore = "P0 mailrs prod-real reproducer; --include-ignored to run"]
fn baseline_mailrs_prod_real_100k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 100_000);
dump_explain(&mut db, "mailrs_prod_real_100k", MAILRS_PROD_REAL_SQL);
use core::sync::atomic::Ordering;
use spg_engine::{
BATCHED_SCALAR_FALL_THROUGH_COUNT, BATCHED_SCALAR_KEYED_FIRE_COUNT,
BATCHED_SCALAR_KEYED_PROBE_COUNT, EXISTS_BATCH_FALL_THROUGH_COUNT, EXISTS_BATCH_FIRE_COUNT,
EXISTS_PULLUP_FIRE_COUNT,
};
let fb = BATCHED_SCALAR_KEYED_FIRE_COUNT.load(Ordering::Relaxed);
let pb = BATCHED_SCALAR_KEYED_PROBE_COUNT.load(Ordering::Relaxed);
let tb = BATCHED_SCALAR_FALL_THROUGH_COUNT.load(Ordering::Relaxed);
let epb = EXISTS_PULLUP_FIRE_COUNT.load(Ordering::Relaxed);
let ebb = EXISTS_BATCH_FIRE_COUNT.load(Ordering::Relaxed);
let etb = EXISTS_BATCH_FALL_THROUGH_COUNT.load(Ordering::Relaxed);
time_query(
&mut db,
MAILRS_PROD_REAL_SQL,
10,
"mailrs_prod_real_100k",
20_000.0,
);
let fa = BATCHED_SCALAR_KEYED_FIRE_COUNT.load(Ordering::Relaxed);
let pa = BATCHED_SCALAR_KEYED_PROBE_COUNT.load(Ordering::Relaxed);
let ta = BATCHED_SCALAR_FALL_THROUGH_COUNT.load(Ordering::Relaxed);
let epa = EXISTS_PULLUP_FIRE_COUNT.load(Ordering::Relaxed);
let eba = EXISTS_BATCH_FIRE_COUNT.load(Ordering::Relaxed);
let eta = EXISTS_BATCH_FALL_THROUGH_COUNT.load(Ordering::Relaxed);
eprintln!(
"[A'] mailrs_prod_real_100k batched-scalar: keyed_fires={} keyed_probes={} fall_through={}",
fa - fb,
pa - pb,
ta - tb,
);
eprintln!(
"[A'] mailrs_prod_real_100k EXISTS: pullup_fires={} batch_fires={} batch_fall_through={}",
epa - epb,
eba - ebb,
eta - etb,
);
}
const MAILRS_PROD_NO_SUBQ_SQL: &str = "\
SELECT m.thread_id, MAX(m.subject), string_agg(DISTINCT m.sender, ','), \
COUNT(DISTINCT CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END), \
COUNT(DISTINCT CASE WHEN (m.flags & 1) = 0 \
THEN CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END \
END), \
MAX(m.internal_date), \
'general' AS category_stub, \
BOOL_OR((m.flags & 4) != 0), \
'' AS snippet_stub, \
BOOL_OR(m.pinned), \
BOOL_OR(m.archived), \
COALESCE((array_agg(m.importance_level \
ORDER BY m.importance_score DESC NULLS LAST))[1], \
'normal'), \
COALESCE(MAX(m.importance_score), 0.0), \
COALESCE(BOOL_OR(ea.requires_action), false), \
COALESCE((array_agg(m.sender ORDER BY m.internal_date DESC))[1], ''), \
COUNT(DISTINCT CASE WHEN mb.name = 'Sent' AND m.message_id != '' \
THEN m.message_id \
WHEN mb.name = 'Sent' \
THEN CAST(m.id AS TEXT) END) \
FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
LEFT JOIN email_analysis ea ON ea.message_id = m.id \
WHERE mb.user_address = 'lihao@golia.jp' \
AND thread_id != '' \
AND NOT EXISTS (SELECT 1 FROM snoozed_conversations sc \
WHERE sc.thread_id = m.thread_id \
AND sc.account_address = mb.user_address \
AND sc.snoozed_until > 0) \
GROUP BY m.thread_id \
HAVING BOOL_OR(m.archived) = false \
AND BOOL_OR(mb.name != 'Sent') = true \
ORDER BY BOOL_OR(m.pinned) DESC, MAX(m.internal_date) DESC \
LIMIT 50";
const MAILRS_PROD_NO_LEFTJOIN_SQL: &str = "\
SELECT m.thread_id, MAX(m.subject), string_agg(DISTINCT m.sender, ','), \
COUNT(DISTINCT CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END), \
COUNT(DISTINCT CASE WHEN (m.flags & 1) = 0 \
THEN CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END \
END), \
MAX(m.internal_date), \
COALESCE((SELECT ea.category FROM email_analysis ea \
JOIN messages m2 ON ea.message_id = m2.id \
WHERE m2.thread_id = m.thread_id \
ORDER BY m2.internal_date DESC LIMIT 1), \
'general'), \
BOOL_OR((m.flags & 4) != 0), \
'' AS snippet_stub, \
BOOL_OR(m.pinned), \
BOOL_OR(m.archived), \
COALESCE((array_agg(m.importance_level \
ORDER BY m.importance_score DESC NULLS LAST))[1], \
'normal'), \
COALESCE(MAX(m.importance_score), 0.0), \
false AS requires_action_stub, \
COALESCE((array_agg(m.sender ORDER BY m.internal_date DESC))[1], ''), \
COUNT(DISTINCT CASE WHEN mb.name = 'Sent' AND m.message_id != '' \
THEN m.message_id \
WHEN mb.name = 'Sent' \
THEN CAST(m.id AS TEXT) END) \
FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
WHERE mb.user_address = 'lihao@golia.jp' \
AND thread_id != '' \
AND NOT EXISTS (SELECT 1 FROM snoozed_conversations sc \
WHERE sc.thread_id = m.thread_id \
AND sc.account_address = mb.user_address \
AND sc.snoozed_until > 0) \
GROUP BY m.thread_id \
HAVING BOOL_OR(m.archived) = false \
AND BOOL_OR(mb.name != 'Sent') = true \
ORDER BY BOOL_OR(m.pinned) DESC, MAX(m.internal_date) DESC \
LIMIT 50";
const MAILRS_PROD_NO_ORDERED_AGG_SQL: &str = "\
SELECT m.thread_id, MAX(m.subject), string_agg(DISTINCT m.sender, ','), \
COUNT(DISTINCT CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END), \
COUNT(DISTINCT CASE WHEN (m.flags & 1) = 0 \
THEN CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END \
END), \
MAX(m.internal_date), \
'general' AS category_stub, \
BOOL_OR((m.flags & 4) != 0), \
'' AS snippet_stub, \
BOOL_OR(m.pinned), \
BOOL_OR(m.archived), \
'normal' AS importance_stub, \
COALESCE(MAX(m.importance_score), 0.0), \
COALESCE(BOOL_OR(ea.requires_action), false), \
'' AS sender_stub, \
COUNT(DISTINCT CASE WHEN mb.name = 'Sent' AND m.message_id != '' \
THEN m.message_id \
WHEN mb.name = 'Sent' \
THEN CAST(m.id AS TEXT) END) \
FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
LEFT JOIN email_analysis ea ON ea.message_id = m.id \
WHERE mb.user_address = 'lihao@golia.jp' \
AND thread_id != '' \
AND NOT EXISTS (SELECT 1 FROM snoozed_conversations sc \
WHERE sc.thread_id = m.thread_id \
AND sc.account_address = mb.user_address \
AND sc.snoozed_until > 0) \
GROUP BY m.thread_id \
HAVING BOOL_OR(m.archived) = false \
AND BOOL_OR(mb.name != 'Sent') = true \
ORDER BY BOOL_OR(m.pinned) DESC, MAX(m.internal_date) DESC \
LIMIT 50";
#[test]
#[ignore = "P0 mailrs ablation: no LEFT JOIN ea; --include-ignored"]
fn baseline_mailrs_prod_no_leftjoin_100k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 100_000);
dump_explain(
&mut db,
"mailrs_prod_no_leftjoin_100k",
MAILRS_PROD_NO_LEFTJOIN_SQL,
);
time_query(
&mut db,
MAILRS_PROD_NO_LEFTJOIN_SQL,
10,
"mailrs_prod_no_leftjoin_100k",
10_000.0,
);
}
#[test]
#[ignore = "P0 mailrs ablation: no ordered_agg; --include-ignored"]
fn baseline_mailrs_prod_no_ordered_agg_100k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 100_000);
dump_explain(
&mut db,
"mailrs_prod_no_ordered_agg_100k",
MAILRS_PROD_NO_ORDERED_AGG_SQL,
);
time_query(
&mut db,
MAILRS_PROD_NO_ORDERED_AGG_SQL,
10,
"mailrs_prod_no_ordered_agg_100k",
10_000.0,
);
}
#[test]
#[ignore = "P0 mailrs prod-real ablation; --include-ignored to run"]
fn baseline_mailrs_prod_no_subq_100k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 100_000);
dump_explain(&mut db, "mailrs_prod_no_subq_100k", MAILRS_PROD_NO_SUBQ_SQL);
time_query(
&mut db,
MAILRS_PROD_NO_SUBQ_SQL,
10,
"mailrs_prod_no_subq_100k",
10_000.0,
);
}
const MAILRS_PROD_NO_NOT_EXISTS_SQL: &str = "\
SELECT m.thread_id, MAX(m.subject), string_agg(DISTINCT m.sender, ','), \
COUNT(DISTINCT CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END), \
COUNT(DISTINCT CASE WHEN (m.flags & 1) = 0 \
THEN CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END \
END), \
MAX(m.internal_date), \
COALESCE((SELECT ea.category FROM email_analysis ea \
JOIN messages m2 ON ea.message_id = m2.id \
WHERE m2.thread_id = m.thread_id \
ORDER BY m2.internal_date DESC LIMIT 1), \
'general'), \
BOOL_OR((m.flags & 4) != 0), \
COALESCE( \
(SELECT LEFT(ea_snip.summary, 80) FROM email_analysis ea_snip \
JOIN messages m_snip ON ea_snip.message_id = m_snip.id \
WHERE m_snip.thread_id = m.thread_id \
AND ea_snip.summary IS NOT NULL \
AND ea_snip.summary != '' \
ORDER BY m_snip.internal_date DESC LIMIT 1), \
(SELECT LEFT(m3.text_body, 80) FROM messages m3 \
WHERE m3.thread_id = m.thread_id \
AND m3.text_body IS NOT NULL \
AND m3.text_body != '' \
ORDER BY m3.internal_date DESC LIMIT 1), \
''), \
BOOL_OR(m.pinned), \
BOOL_OR(m.archived), \
COALESCE((array_agg(m.importance_level \
ORDER BY m.importance_score DESC NULLS LAST))[1], \
'normal'), \
COALESCE(MAX(m.importance_score), 0.0), \
COALESCE(BOOL_OR(ea.requires_action), false), \
COALESCE((array_agg(m.sender ORDER BY m.internal_date DESC))[1], ''), \
COUNT(DISTINCT CASE WHEN mb.name = 'Sent' AND m.message_id != '' \
THEN m.message_id \
WHEN mb.name = 'Sent' \
THEN CAST(m.id AS TEXT) END) \
FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
LEFT JOIN email_analysis ea ON ea.message_id = m.id \
WHERE mb.user_address = 'lihao@golia.jp' \
AND thread_id != '' \
GROUP BY m.thread_id \
HAVING BOOL_OR(m.archived) = false \
AND BOOL_OR(mb.name != 'Sent') = true \
ORDER BY BOOL_OR(m.pinned) DESC, MAX(m.internal_date) DESC \
LIMIT 50";
const MAILRS_PROD_NO_HAVING_SQL: &str = "\
SELECT m.thread_id, MAX(m.subject), string_agg(DISTINCT m.sender, ','), \
COUNT(DISTINCT CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END), \
COUNT(DISTINCT CASE WHEN (m.flags & 1) = 0 \
THEN CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END \
END), \
MAX(m.internal_date), \
COALESCE((SELECT ea.category FROM email_analysis ea \
JOIN messages m2 ON ea.message_id = m2.id \
WHERE m2.thread_id = m.thread_id \
ORDER BY m2.internal_date DESC LIMIT 1), \
'general'), \
BOOL_OR((m.flags & 4) != 0), \
COALESCE( \
(SELECT LEFT(ea_snip.summary, 80) FROM email_analysis ea_snip \
JOIN messages m_snip ON ea_snip.message_id = m_snip.id \
WHERE m_snip.thread_id = m.thread_id \
AND ea_snip.summary IS NOT NULL \
AND ea_snip.summary != '' \
ORDER BY m_snip.internal_date DESC LIMIT 1), \
(SELECT LEFT(m3.text_body, 80) FROM messages m3 \
WHERE m3.thread_id = m.thread_id \
AND m3.text_body IS NOT NULL \
AND m3.text_body != '' \
ORDER BY m3.internal_date DESC LIMIT 1), \
''), \
BOOL_OR(m.pinned), \
BOOL_OR(m.archived), \
COALESCE((array_agg(m.importance_level \
ORDER BY m.importance_score DESC NULLS LAST))[1], \
'normal'), \
COALESCE(MAX(m.importance_score), 0.0), \
COALESCE(BOOL_OR(ea.requires_action), false), \
COALESCE((array_agg(m.sender ORDER BY m.internal_date DESC))[1], ''), \
COUNT(DISTINCT CASE WHEN mb.name = 'Sent' AND m.message_id != '' \
THEN m.message_id \
WHEN mb.name = 'Sent' \
THEN CAST(m.id AS TEXT) END) \
FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
LEFT JOIN email_analysis ea ON ea.message_id = m.id \
WHERE mb.user_address = 'lihao@golia.jp' \
AND thread_id != '' \
AND NOT EXISTS (SELECT 1 FROM snoozed_conversations sc \
WHERE sc.thread_id = m.thread_id \
AND sc.account_address = mb.user_address \
AND sc.snoozed_until > 0) \
GROUP BY m.thread_id \
ORDER BY BOOL_OR(m.pinned) DESC, MAX(m.internal_date) DESC \
LIMIT 50";
const MAILRS_PROD_NO_DISTINCT_SQL: &str = "\
SELECT m.thread_id, MAX(m.subject), string_agg(m.sender, ','), \
COUNT(CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END), \
COUNT(CASE WHEN (m.flags & 1) = 0 \
THEN CASE WHEN m.message_id != '' \
THEN m.message_id \
ELSE CAST(m.id AS TEXT) END \
END), \
MAX(m.internal_date), \
COALESCE((SELECT ea.category FROM email_analysis ea \
JOIN messages m2 ON ea.message_id = m2.id \
WHERE m2.thread_id = m.thread_id \
ORDER BY m2.internal_date DESC LIMIT 1), \
'general'), \
BOOL_OR((m.flags & 4) != 0), \
COALESCE( \
(SELECT LEFT(ea_snip.summary, 80) FROM email_analysis ea_snip \
JOIN messages m_snip ON ea_snip.message_id = m_snip.id \
WHERE m_snip.thread_id = m.thread_id \
AND ea_snip.summary IS NOT NULL \
AND ea_snip.summary != '' \
ORDER BY m_snip.internal_date DESC LIMIT 1), \
(SELECT LEFT(m3.text_body, 80) FROM messages m3 \
WHERE m3.thread_id = m.thread_id \
AND m3.text_body IS NOT NULL \
AND m3.text_body != '' \
ORDER BY m3.internal_date DESC LIMIT 1), \
''), \
BOOL_OR(m.pinned), \
BOOL_OR(m.archived), \
COALESCE((array_agg(m.importance_level \
ORDER BY m.importance_score DESC NULLS LAST))[1], \
'normal'), \
COALESCE(MAX(m.importance_score), 0.0), \
COALESCE(BOOL_OR(ea.requires_action), false), \
COALESCE((array_agg(m.sender ORDER BY m.internal_date DESC))[1], ''), \
COUNT(CASE WHEN mb.name = 'Sent' AND m.message_id != '' \
THEN m.message_id \
WHEN mb.name = 'Sent' \
THEN CAST(m.id AS TEXT) END) \
FROM messages m \
JOIN mailboxes mb ON m.mailbox_id = mb.id \
LEFT JOIN email_analysis ea ON ea.message_id = m.id \
WHERE mb.user_address = 'lihao@golia.jp' \
AND thread_id != '' \
AND NOT EXISTS (SELECT 1 FROM snoozed_conversations sc \
WHERE sc.thread_id = m.thread_id \
AND sc.account_address = mb.user_address \
AND sc.snoozed_until > 0) \
GROUP BY m.thread_id \
HAVING BOOL_OR(m.archived) = false \
AND BOOL_OR(mb.name != 'Sent') = true \
ORDER BY BOOL_OR(m.pinned) DESC, MAX(m.internal_date) DESC \
LIMIT 50";
#[test]
#[ignore = "P0 mailrs A' ablation; --include-ignored to run"]
fn baseline_mailrs_prod_no_not_exists_100k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 100_000);
time_query(
&mut db,
MAILRS_PROD_NO_NOT_EXISTS_SQL,
10,
"mailrs_prod_no_not_exists_100k",
20_000.0,
);
}
#[test]
#[ignore = "P0 mailrs A' ablation; --include-ignored to run"]
fn baseline_mailrs_prod_no_having_100k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 100_000);
time_query(
&mut db,
MAILRS_PROD_NO_HAVING_SQL,
10,
"mailrs_prod_no_having_100k",
20_000.0,
);
}
#[test]
#[ignore = "P0 mailrs A' ablation; --include-ignored to run"]
fn baseline_mailrs_prod_no_distinct_100k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 100_000);
time_query(
&mut db,
MAILRS_PROD_NO_DISTINCT_SQL,
10,
"mailrs_prod_no_distinct_100k",
20_000.0,
);
}
#[test]
#[ignore = "P0 mailrs prod-real reproducer; --include-ignored to run"]
fn baseline_mailrs_prod_real_300k() {
let _g = crate::perf_lock();
let mut db = Engine::new();
seed_mailrs_inbox(&mut db, 300_000);
dump_explain(&mut db, "mailrs_prod_real_300k", MAILRS_PROD_REAL_SQL);
time_query(
&mut db,
MAILRS_PROD_REAL_SQL,
10,
"mailrs_prod_real_300k",
120_000.0,
);
}