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,55 +350,82 @@ 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),
SELECT channels.value AS channel, MAX(messages.rowid) AS rowid FROM messages JSON.stringify(following),
JOIN json_each(?1) AS channels ON messages.content ->> 'channel' = channels.value '"' + this.whoami.replace('"', '""') + '"',
JOIN json_each(?2) AS following ON messages.author = following.value this.whoami,
WHERE ];
messages.content ->> 'type' = 'post' AND let channels = (await Promise.all([
messages.content ->> 'root' IS NULL AND this.query_timed(
messages.author != ?4 `
GROUP by channel SELECT channels.value AS channel, MAX(messages.rowid) AS rowid FROM messages
UNION JOIN json_each(?1) AS channels ON messages.content ->> 'channel' = channels.value
SELECT channels.value AS channel, MAX(messages.rowid) AS rowid FROM messages JOIN json_each(?2) AS following ON messages.author = following.value
JOIN messages_refs ON messages.id = messages_refs.message WHERE
JOIN json_each(?1) AS channels ON messages_refs.ref = '#' || channels.value messages.content ->> 'type' = 'post' AND
JOIN json_each(?2) AS following ON messages.author = following.value messages.content ->> 'root' IS NULL AND
WHERE messages.author != ?4
messages.content ->> 'type' = 'post' AND GROUP by channel
messages.content ->> 'root' IS NULL AND `,
messages.author != ?4 k_args
GROUP by channel ),
UNION this.query_timed(
SELECT '' AS channel, MAX(messages.rowid) AS rowid FROM messages `
JOIN json_each(?2) AS following ON messages.author = following.value SELECT channels.value AS channel, MAX(messages.rowid) AS rowid FROM messages
WHERE JOIN messages_refs ON messages.id = messages_refs.message
messages.content ->> 'type' = 'post' AND JOIN json_each(?1) AS channels ON messages_refs.ref = '#' || channels.value
messages.content ->> 'root' IS NULL AND JOIN json_each(?2) AS following ON messages.author = following.value
messages.author != ?4 WHERE
UNION messages.content ->> 'type' = 'post' AND
SELECT '@' AS channel, MAX(messages.rowid) AS rowid FROM messages_fts(?3) messages.content ->> 'root' IS NULL AND
JOIN messages ON messages.rowid = messages_fts.rowid messages.author != ?4
JOIN json_each(?2) AS following ON messages.author = following.value GROUP by channel
WHERE messages.author != ?4 `,
UNION k_args
SELECT '👍' AS channel, MAX(messages.rowid) AS rowid FROM messages ),
JOIN json_each(?2) AS following ON messages.author = following.value this.query_timed(
WHERE `
messages.content ->> 'type' = 'vote' AND SELECT '' AS channel, MAX(messages.rowid) AS rowid FROM messages
messages.author != ?4 JOIN json_each(?2) AS following ON messages.author = following.value
`, WHERE
[ messages.content ->> 'type' = 'post' AND
JSON.stringify(this.channels), messages.content ->> 'root' IS NULL AND
JSON.stringify(following), messages.author != ?4
'"' + this.whoami.replace('"', '""') + '"', `,
this.whoami, k_args
] ),
); this.query_timed(
`
SELECT '@' AS channel, MAX(messages.rowid) AS rowid FROM messages_fts(?3)
JOIN messages ON messages.rowid = messages_fts.rowid
JOIN json_each(?2) AS following ON messages.author = following.value
WHERE messages.author != ?4
`,
k_args
),
this.query_timed(
`
SELECT '👍' AS channel, MAX(messages.rowid) AS rowid FROM messages
JOIN json_each(?2) AS following ON messages.author = following.value
WHERE
messages.content ->> 'type' = 'vote' AND
messages.author != ?4
`,
k_args
),
])).flat();
let latest = {}; let latest = {};
for (let row of channels) { for (let row of channels) {
if (!latest[row.channel]) { if (!latest[row.channel]) {