From 01d8f720e8aa7bb0f7747c93e5e72d72e79bc87d Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Tue, 21 Jan 2025 21:07:37 -0500 Subject: [PATCH] ssb: Treat timestamps of related messages separately from those of the primary queried messages. --- apps/ssb.json | 2 +- apps/ssb/tf-tab-news-feed.js | 91 +++++++++++++++++------------------- 2 files changed, 44 insertions(+), 49 deletions(-) diff --git a/apps/ssb.json b/apps/ssb.json index 55e1eb14..95ff40ac 100644 --- a/apps/ssb.json +++ b/apps/ssb.json @@ -1,5 +1,5 @@ { "type": "tildefriends-app", "emoji": "🦀", - "previous": "&QQhMV7DY8GfmrAfjLFhOA2VScoGXlSA0MW520Pigrjg=.sha256" + "previous": "&0nbuLC0KYS8PwAN9MMUbKQjHxjk+m68Kzw8qEw6/TBI=.sha256" } diff --git a/apps/ssb/tf-tab-news-feed.js b/apps/ssb/tf-tab-news-feed.js index db8a3197..d08b0677 100644 --- a/apps/ssb/tf-tab-news-feed.js +++ b/apps/ssb/tf-tab-news-feed.js @@ -46,6 +46,7 @@ class TfTabNewsFeedElement extends LitElement { } async fetch_messages(start_time, end_time) { + console.log('fetch_messages', this.hash, start_time, end_time); this.time_loading = [start_time, end_time]; let result; if (this.hash == '#@') { @@ -59,12 +60,12 @@ class TfTabNewsFeedElement extends LitElement { messages.author != ?1 AND ?3 IS NULL OR (messages.timestamp >= ?3 AND messages.timestamp < ?4) ORDER BY timestamp DESC limit 20) - SELECT messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature + 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 mentions JOIN messages_refs ON mentions.id = messages_refs.ref JOIN messages ON messages_refs.message = messages.id UNION - SELECT * FROM mentions + SELECT TRUE AS is_primary, * FROM mentions `, [ '"' + this.whoami.replace('"', '""') + '"', @@ -85,23 +86,23 @@ class TfTabNewsFeedElement extends LitElement { WHERE ?2 IS NULL OR (mine.timestamp >= 2 AND mine.timestamp < ?3) ORDER BY sequence DESC LIMIT 20 ) - SELECT messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature + 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 selected JOIN messages_refs ON selected.id = messages_refs.ref JOIN messages ON messages_refs.message = messages.id UNION - SELECT * FROM selected + SELECT TRUE AS is_primary, * FROM selected `, [this.hash.substring(1), start_time, end_time] ); } else if (this.hash.startsWith('#%')) { result = await tfrpc.rpc.query( ` - SELECT id, previous, author, sequence, timestamp, hash, json(content) AS content, signature + SELECT TRUE AS is_primary, id, previous, author, sequence, timestamp, hash, json(content) AS content, signature FROM messages WHERE messages.id = ?1 UNION - SELECT id, previous, author, sequence, timestamp, hash, json(content) AS content, signature + SELECT FALSE AS is_primary, id, previous, author, sequence, timestamp, hash, json(content) AS content, signature FROM messages JOIN messages_refs ON messages.id = messages_refs.message WHERE messages_refs.ref = ?1 @@ -130,17 +131,17 @@ class TfTabNewsFeedElement extends LitElement { news AS (SELECT * FROM all_news WHERE ?2 IS NULL OR (all_news.timestamp >= ?2 AND all_news.timestamp < ?3) ORDER BY all_news.timestamp DESC LIMIT 20) - SELECT messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature + 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 news JOIN messages_refs ON news.id = messages_refs.ref JOIN messages ON messages_refs.message = messages.id UNION - SELECT messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature + 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 news JOIN messages_refs ON news.id = messages_refs.message JOIN messages ON messages_refs.ref = messages.id UNION - SELECT news.* FROM news + SELECT TRUE AS is_primary, news.* FROM news `, [ JSON.stringify(this.following.slice(i, i + k_following_limit)), @@ -156,7 +157,7 @@ class TfTabNewsFeedElement extends LitElement { } else if (this.hash == '#🔐') { result = await tfrpc.rpc.query( ` - SELECT messages.rowid, messages.id, previous, author, sequence, timestamp, hash, json(content) AS content, signature + SELECT TRUE AS is_primary, messages.rowid, messages.id, previous, author, sequence, timestamp, hash, json(content) AS content, signature FROM messages JOIN json_each(?1) AS following ON messages.author = following.value WHERE @@ -168,56 +169,50 @@ class TfTabNewsFeedElement extends LitElement { ); result = (await this.decrypt(result)).filter((x) => x.decrypted); } else { - let promises = []; - const k_following_limit = 256; - for (let i = 0; i < this.following.length; i += k_following_limit) { - promises.push( - tfrpc.rpc.query( - ` - WITH - all_news AS ( - SELECT 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(?) AS following ON messages.author = following.value - WHERE timestamp >= 0 AND timestamp < ?3), - news AS ( - SELECT * FROM all_news - WHERE ?2 IS NULL or (all_news.timestamp >= ?2 AND all_news.timestamp < ?3) - ORDER BY timestamp DESC LIMIT 20 - ) + result = await tfrpc.rpc.query( + ` + WITH + all_news AS ( SELECT messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature - FROM news - JOIN messages_refs ON news.id = messages_refs.ref - JOIN messages ON messages_refs.message = messages.id - UNION - SELECT messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature - FROM news - JOIN messages_refs ON news.id = messages_refs.message - JOIN messages ON messages_refs.ref = messages.id - UNION - SELECT news.* FROM news - `, - [ - JSON.stringify(this.following.slice(i, i + k_following_limit)), - start_time, - end_time, - ] + FROM messages + JOIN json_each(?) AS following ON messages.author = following.value + WHERE timestamp >= 0 AND timestamp < ?3), + news AS ( + SELECT * FROM all_news + WHERE ?2 IS NULL or (all_news.timestamp >= ?2 AND all_news.timestamp < ?3) + ORDER BY timestamp DESC LIMIT 20 ) - ); - } - result = [].concat(...(await Promise.all(promises))); + 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 news + JOIN messages_refs ON news.id = messages_refs.ref + JOIN messages ON messages_refs.message = messages.id + UNION + 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 news + JOIN messages_refs ON news.id = messages_refs.message + JOIN messages ON messages_refs.ref = messages.id + UNION + SELECT TRUE AS is_primary, news.* FROM news + `, + [ + JSON.stringify(this.following), + start_time, + end_time, + ] + ); } this.time_loading = undefined; return result; } update_time_range_from_messages(messages) { + let only_primary = messages.filter((x) => x.is_primary); this.time_range = [ - messages.reduce( + only_primary.reduce( (accumulator, current) => Math.min(accumulator, current.timestamp), this.time_range[0] ), - messages.reduce( + only_primary.reduce( (accumulator, current) => Math.max(accumulator, current.timestamp), this.time_range[1] ),