ssb: Deconstruct and instrument the channels unread query.
Some checks failed
Build Tilde Friends / Build-All (push) Has been cancelled

This commit is contained in:
2025-06-18 12:36:59 -04:00
parent c3b65d9cd8
commit 066827f8f1
2 changed files with 74 additions and 47 deletions

View File

@ -1,5 +1,5 @@
{ {
"type": "tildefriends-app", "type": "tildefriends-app",
"emoji": "🦀", "emoji": "🦀",
"previous": "&6gubt0zYLPpQepw+Cg/coZNek8Eem/BmHRP1G39IZcc=.sha256" "previous": "&Rn4Eg5ev5qhrYRnwxPB0DiEwO7VdGMDGp7tL/W7bRZo=.sha256"
} }

View File

@ -350,10 +350,25 @@ class TfElement extends LitElement {
return [cache.latest, cache.messages]; return [cache.latest, cache.messages];
} }
async query_timed(sql, args) {
let start = new Date();
let result = await tfrpc.rpc.query(sql, args);
let end = new Date();
console.log((end - start) / 1000, sql);
return result;
}
async load_channels_latest(following) { async load_channels_latest(following) {
let start_time = new Date(); let start_time = new Date();
let latest_private = this.get_latest_private(following); let latest_private = this.get_latest_private(following);
let channels = await tfrpc.rpc.query( const k_args = [
JSON.stringify(this.channels),
JSON.stringify(following),
'"' + this.whoami.replace('"', '""') + '"',
this.whoami,
];
let channels = (await Promise.all([
this.query_timed(
` `
SELECT channels.value AS channel, MAX(messages.rowid) AS rowid FROM messages SELECT channels.value AS channel, MAX(messages.rowid) AS rowid FROM messages
JOIN json_each(?1) AS channels ON messages.content ->> 'channel' = channels.value JOIN json_each(?1) AS channels ON messages.content ->> 'channel' = channels.value
@ -363,7 +378,11 @@ class TfElement extends LitElement {
messages.content ->> 'root' IS NULL AND messages.content ->> 'root' IS NULL AND
messages.author != ?4 messages.author != ?4
GROUP by channel GROUP by channel
UNION `,
k_args
),
this.query_timed(
`
SELECT channels.value AS channel, MAX(messages.rowid) AS rowid FROM messages SELECT channels.value AS channel, MAX(messages.rowid) AS rowid FROM messages
JOIN messages_refs ON messages.id = messages_refs.message JOIN messages_refs ON messages.id = messages_refs.message
JOIN json_each(?1) AS channels ON messages_refs.ref = '#' || channels.value JOIN json_each(?1) AS channels ON messages_refs.ref = '#' || channels.value
@ -373,32 +392,40 @@ class TfElement extends LitElement {
messages.content ->> 'root' IS NULL AND messages.content ->> 'root' IS NULL AND
messages.author != ?4 messages.author != ?4
GROUP by channel GROUP by channel
UNION `,
k_args
),
this.query_timed(
`
SELECT '' AS channel, MAX(messages.rowid) AS rowid FROM messages SELECT '' AS channel, MAX(messages.rowid) AS rowid FROM messages
JOIN json_each(?2) AS following ON messages.author = following.value JOIN json_each(?2) AS following ON messages.author = following.value
WHERE WHERE
messages.content ->> 'type' = 'post' AND messages.content ->> 'type' = 'post' AND
messages.content ->> 'root' IS NULL AND messages.content ->> 'root' IS NULL AND
messages.author != ?4 messages.author != ?4
UNION `,
k_args
),
this.query_timed(
`
SELECT '@' AS channel, MAX(messages.rowid) AS rowid FROM messages_fts(?3) SELECT '@' AS channel, MAX(messages.rowid) AS rowid FROM messages_fts(?3)
JOIN messages ON messages.rowid = messages_fts.rowid JOIN messages ON messages.rowid = messages_fts.rowid
JOIN json_each(?2) AS following ON messages.author = following.value JOIN json_each(?2) AS following ON messages.author = following.value
WHERE messages.author != ?4 WHERE messages.author != ?4
UNION `,
k_args
),
this.query_timed(
`
SELECT '👍' AS channel, MAX(messages.rowid) AS rowid FROM messages SELECT '👍' AS channel, MAX(messages.rowid) AS rowid FROM messages
JOIN json_each(?2) AS following ON messages.author = following.value JOIN json_each(?2) AS following ON messages.author = following.value
WHERE WHERE
messages.content ->> 'type' = 'vote' AND messages.content ->> 'type' = 'vote' AND
messages.author != ?4 messages.author != ?4
`, `,
[ k_args
JSON.stringify(this.channels), ),
JSON.stringify(following), ])).flat();
'"' + this.whoami.replace('"', '""') + '"',
this.whoami,
]
);
let latest = {}; let latest = {};
for (let row of channels) { for (let row of channels) {
if (!latest[row.channel]) { if (!latest[row.channel]) {