From 8be354fc4919d90eadd7264fd4a3e0f1bb7e0f05 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Sat, 5 Apr 2025 18:40:00 -0400 Subject: [PATCH] ssb: It is troubling to me that querying like this is so much faster. --- apps/ssb.json | 2 +- apps/ssb/tf-tab-news-feed.js | 38 +++++++++++++++++++++++++----------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/apps/ssb.json b/apps/ssb.json index 1ba99a0c..15464f38 100644 --- a/apps/ssb.json +++ b/apps/ssb.json @@ -1,5 +1,5 @@ { "type": "tildefriends-app", "emoji": "🦀", - "previous": "&R0bGxjJq3G2eJzuKfUrQP4ioSn75QlwvaS39Q9LzMto=.sha256" + "previous": "&lGTfidaEuVfuFbpQD9WGizMpC6OwYr1AqM+AH0yaVsc=.sha256" } diff --git a/apps/ssb/tf-tab-news-feed.js b/apps/ssb/tf-tab-news-feed.js index a93f220a..5471593f 100644 --- a/apps/ssb/tf-tab-news-feed.js +++ b/apps/ssb/tf-tab-news-feed.js @@ -159,7 +159,7 @@ class TfTabNewsFeedElement extends LitElement { ); result = (await this.decrypt(result)).filter((x) => x.decrypted); } else { - let st = new Date(); + let t0 = new Date(); result = await tfrpc.rpc.query( ` WITH @@ -172,22 +172,38 @@ class TfTabNewsFeedElement extends LitElement { SELECT * FROM all_news WHERE all_news.timestamp < ?3 AND (?2 IS NULL OR all_news.timestamp >= ?2) ORDER BY timestamp DESC LIMIT 20 - ), - refs AS ( - SELECT refs_out.ref AS ref FROM messages_refs refs_out JOIN news ON refs_out.message = news.id - UNION - SELECT refs_in.message AS ref FROM messages_refs refs_in JOIN news ON refs_in.ref = news.id ) SELECT TRUE AS is_primary, news.* FROM news - UNION - SELECT FALSE AS is_primary, all_news.rowid, all_news.id, all_news.previous, all_news.author, all_news.sequence, all_news.timestamp, all_news.hash, json(all_news.content) AS content, all_news.signature - FROM all_news JOIN refs ON all_news.id = refs.ref `, [JSON.stringify(this.following), start_time, end_time] ); - let et = new Date(); + let news_length = result.length; + let t1 = new Date(); + let refs = await tfrpc.rpc.query( + ` + WITH + news AS ( + SELECT value AS id FROM json_each(?) + ) + SELECT refs_out.ref AS ref FROM messages_refs refs_out JOIN news ON refs_out.message = news.id + UNION + SELECT refs_in.message AS ref FROM messages_refs refs_in JOIN news ON refs_in.ref = news.id + `, + [JSON.stringify(result.map(x => x.id))] + ); + let t2 = new Date(); + let related_messages = await tfrpc.rpc.query( + ` + SELECT FALSE AS is_primary, messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature + FROM messages + JOIN json_each(?2) refs ON messages.id = refs.value + JOIN json_each(?1) AS following ON messages.author = following.value + `, + [JSON.stringify(this.following), JSON.stringify(refs.map(x => x.ref))]); + result = [].concat(result, related_messages); + let t3 = new Date(); console.log( - `just the load of ${result.length} rows = ${(et - st) / 1000} following=${this.following.length} st=${start_time} et=${end_time}` + `load of ${result.length} rows took ${(t3 - t0) / 1000} (${(t1 - t0) / 1000} to find ${news_length} messages, ${(t2 - t1) / 1000} to find ${refs.length} refs, and ${(t3 - t2) / 1000} to find ${related_messages.length} related messages) following=${this.following.length} st=${start_time} et=${end_time}` ); } this.time_loading = undefined;