From 066827f8f1dc8df47aefd79bb09299de1e04282c Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Wed, 18 Jun 2025 12:36:59 -0400 Subject: [PATCH] ssb: Deconstruct and instrument the channels unread query. --- apps/ssb.json | 2 +- apps/ssb/tf-app.js | 119 +++++++++++++++++++++++++++------------------ 2 files changed, 74 insertions(+), 47 deletions(-) diff --git a/apps/ssb.json b/apps/ssb.json index a8159a95..c58bc081 100644 --- a/apps/ssb.json +++ b/apps/ssb.json @@ -1,5 +1,5 @@ { "type": "tildefriends-app", "emoji": "🦀", - "previous": "&6gubt0zYLPpQepw+Cg/coZNek8Eem/BmHRP1G39IZcc=.sha256" + "previous": "&Rn4Eg5ev5qhrYRnwxPB0DiEwO7VdGMDGp7tL/W7bRZo=.sha256" } diff --git a/apps/ssb/tf-app.js b/apps/ssb/tf-app.js index 9d0adfa9..16099afd 100644 --- a/apps/ssb/tf-app.js +++ b/apps/ssb/tf-app.js @@ -350,55 +350,82 @@ class TfElement extends LitElement { 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) { let start_time = new Date(); let latest_private = this.get_latest_private(following); - let channels = await tfrpc.rpc.query( - ` - 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(?2) AS following ON messages.author = following.value - WHERE - messages.content ->> 'type' = 'post' AND - messages.content ->> 'root' IS NULL AND - messages.author != ?4 - GROUP by channel - UNION - SELECT channels.value AS channel, MAX(messages.rowid) AS rowid FROM messages - JOIN messages_refs ON messages.id = messages_refs.message - JOIN json_each(?1) AS channels ON messages_refs.ref = '#' || channels.value - JOIN json_each(?2) AS following ON messages.author = following.value - WHERE - messages.content ->> 'type' = 'post' AND - messages.content ->> 'root' IS NULL AND - messages.author != ?4 - GROUP by channel - UNION - 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' = 'post' AND - messages.content ->> 'root' IS NULL AND - messages.author != ?4 - UNION - 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 - UNION - 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 - `, - [ - JSON.stringify(this.channels), - JSON.stringify(following), - '"' + this.whoami.replace('"', '""') + '"', - this.whoami, - ] - ); + 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 + JOIN json_each(?1) AS channels ON messages.content ->> 'channel' = channels.value + JOIN json_each(?2) AS following ON messages.author = following.value + WHERE + messages.content ->> 'type' = 'post' AND + messages.content ->> 'root' IS NULL AND + messages.author != ?4 + GROUP by channel + `, + k_args + ), + this.query_timed( + ` + SELECT channels.value AS channel, MAX(messages.rowid) AS rowid FROM messages + JOIN messages_refs ON messages.id = messages_refs.message + JOIN json_each(?1) AS channels ON messages_refs.ref = '#' || channels.value + JOIN json_each(?2) AS following ON messages.author = following.value + WHERE + messages.content ->> 'type' = 'post' AND + messages.content ->> 'root' IS NULL AND + messages.author != ?4 + GROUP by channel + `, + 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' = 'post' AND + messages.content ->> 'root' IS NULL AND + messages.author != ?4 + `, + 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 = {}; for (let row of channels) { if (!latest[row.channel]) {