ssb: Treat timestamps of related messages separately from those of the primary queried messages.
All checks were successful
Build Tilde Friends / Build-All (push) Successful in 21m49s

This commit is contained in:
Cory McWilliams 2025-01-21 21:07:37 -05:00
parent 18cf058af3
commit 01d8f720e8
2 changed files with 44 additions and 49 deletions

View File

@ -1,5 +1,5 @@
{ {
"type": "tildefriends-app", "type": "tildefriends-app",
"emoji": "🦀", "emoji": "🦀",
"previous": "&QQhMV7DY8GfmrAfjLFhOA2VScoGXlSA0MW520Pigrjg=.sha256" "previous": "&0nbuLC0KYS8PwAN9MMUbKQjHxjk+m68Kzw8qEw6/TBI=.sha256"
} }

View File

@ -46,6 +46,7 @@ class TfTabNewsFeedElement extends LitElement {
} }
async fetch_messages(start_time, end_time) { async fetch_messages(start_time, end_time) {
console.log('fetch_messages', this.hash, start_time, end_time);
this.time_loading = [start_time, end_time]; this.time_loading = [start_time, end_time];
let result; let result;
if (this.hash == '#@') { if (this.hash == '#@') {
@ -59,12 +60,12 @@ class TfTabNewsFeedElement extends LitElement {
messages.author != ?1 AND messages.author != ?1 AND
?3 IS NULL OR (messages.timestamp >= ?3 AND messages.timestamp < ?4) ?3 IS NULL OR (messages.timestamp >= ?3 AND messages.timestamp < ?4)
ORDER BY timestamp DESC limit 20) 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 FROM mentions
JOIN messages_refs ON mentions.id = messages_refs.ref JOIN messages_refs ON mentions.id = messages_refs.ref
JOIN messages ON messages_refs.message = messages.id JOIN messages ON messages_refs.message = messages.id
UNION UNION
SELECT * FROM mentions SELECT TRUE AS is_primary, * FROM mentions
`, `,
[ [
'"' + this.whoami.replace('"', '""') + '"', '"' + this.whoami.replace('"', '""') + '"',
@ -85,23 +86,23 @@ class TfTabNewsFeedElement extends LitElement {
WHERE ?2 IS NULL OR (mine.timestamp >= 2 AND mine.timestamp < ?3) WHERE ?2 IS NULL OR (mine.timestamp >= 2 AND mine.timestamp < ?3)
ORDER BY sequence DESC LIMIT 20 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 FROM selected
JOIN messages_refs ON selected.id = messages_refs.ref JOIN messages_refs ON selected.id = messages_refs.ref
JOIN messages ON messages_refs.message = messages.id JOIN messages ON messages_refs.message = messages.id
UNION UNION
SELECT * FROM selected SELECT TRUE AS is_primary, * FROM selected
`, `,
[this.hash.substring(1), start_time, end_time] [this.hash.substring(1), start_time, end_time]
); );
} else if (this.hash.startsWith('#%')) { } else if (this.hash.startsWith('#%')) {
result = await tfrpc.rpc.query( 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 FROM messages
WHERE messages.id = ?1 WHERE messages.id = ?1
UNION 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 FROM messages JOIN messages_refs
ON messages.id = messages_refs.message ON messages.id = messages_refs.message
WHERE messages_refs.ref = ?1 WHERE messages_refs.ref = ?1
@ -130,17 +131,17 @@ class TfTabNewsFeedElement extends LitElement {
news AS (SELECT * FROM all_news news AS (SELECT * FROM all_news
WHERE ?2 IS NULL OR (all_news.timestamp >= ?2 AND all_news.timestamp < ?3) WHERE ?2 IS NULL OR (all_news.timestamp >= ?2 AND all_news.timestamp < ?3)
ORDER BY all_news.timestamp DESC LIMIT 20) 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 FROM news
JOIN messages_refs ON news.id = messages_refs.ref JOIN messages_refs ON news.id = messages_refs.ref
JOIN messages ON messages_refs.message = messages.id JOIN messages ON messages_refs.message = messages.id
UNION 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 FROM news
JOIN messages_refs ON news.id = messages_refs.message JOIN messages_refs ON news.id = messages_refs.message
JOIN messages ON messages_refs.ref = messages.id JOIN messages ON messages_refs.ref = messages.id
UNION UNION
SELECT news.* FROM news SELECT TRUE AS is_primary, news.* FROM news
`, `,
[ [
JSON.stringify(this.following.slice(i, i + k_following_limit)), JSON.stringify(this.following.slice(i, i + k_following_limit)),
@ -156,7 +157,7 @@ class TfTabNewsFeedElement extends LitElement {
} else if (this.hash == '#🔐') { } else if (this.hash == '#🔐') {
result = await tfrpc.rpc.query( 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 FROM messages
JOIN json_each(?1) AS following ON messages.author = following.value JOIN json_each(?1) AS following ON messages.author = following.value
WHERE WHERE
@ -168,56 +169,50 @@ class TfTabNewsFeedElement extends LitElement {
); );
result = (await this.decrypt(result)).filter((x) => x.decrypted); result = (await this.decrypt(result)).filter((x) => x.decrypted);
} else { } else {
let promises = []; result = await tfrpc.rpc.query(
const k_following_limit = 256; `
for (let i = 0; i < this.following.length; i += k_following_limit) { WITH
promises.push( all_news AS (
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
)
SELECT messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature SELECT messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature
FROM news FROM messages
JOIN messages_refs ON news.id = messages_refs.ref JOIN json_each(?) AS following ON messages.author = following.value
JOIN messages ON messages_refs.message = messages.id WHERE timestamp >= 0 AND timestamp < ?3),
UNION news AS (
SELECT messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature SELECT * FROM all_news
FROM news WHERE ?2 IS NULL or (all_news.timestamp >= ?2 AND all_news.timestamp < ?3)
JOIN messages_refs ON news.id = messages_refs.message ORDER BY timestamp DESC LIMIT 20
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,
]
) )
); 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
result = [].concat(...(await Promise.all(promises))); 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; this.time_loading = undefined;
return result; return result;
} }
update_time_range_from_messages(messages) { update_time_range_from_messages(messages) {
let only_primary = messages.filter((x) => x.is_primary);
this.time_range = [ this.time_range = [
messages.reduce( only_primary.reduce(
(accumulator, current) => Math.min(accumulator, current.timestamp), (accumulator, current) => Math.min(accumulator, current.timestamp),
this.time_range[0] this.time_range[0]
), ),
messages.reduce( only_primary.reduce(
(accumulator, current) => Math.max(accumulator, current.timestamp), (accumulator, current) => Math.max(accumulator, current.timestamp),
this.time_range[1] this.time_range[1]
), ),