summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-06-05 00:30:58 -0400
committerHazelnoot <acomputerdog@gmail.com>2025-06-05 00:30:58 -0400
commitc76a5467f6279726c0a36de8961cb66252171770 (patch)
tree8f392634ba1bd514be3d94c81c42c619abf5f712
parentadd threadId to IDX_note_for_timelines (diff)
downloadsharkey-c76a5467f6279726c0a36de8961cb66252171770.tar.gz
sharkey-c76a5467f6279726c0a36de8961cb66252171770.tar.bz2
sharkey-c76a5467f6279726c0a36de8961cb66252171770.zip
use index when checking visibleUserIds and mentions in generateVisibilityQuery
-rw-r--r--packages/backend/src/core/QueryService.ts33
1 files changed, 30 insertions, 3 deletions
diff --git a/packages/backend/src/core/QueryService.ts b/packages/backend/src/core/QueryService.ts
index bf5b0b359f..d488505afd 100644
--- a/packages/backend/src/core/QueryService.ts
+++ b/packages/backend/src/core/QueryService.ts
@@ -160,15 +160,15 @@ export class QueryService {
// Reply to me
.orWhere(':meId = note.replyUserId')
// DM to me
- .orWhere(':meId = ANY (note.visibleUserIds)')
+ .orWhere(':meIdAsList <@ note.visibleUserIds')
// Mentions me
- .orWhere(':meId = ANY (note.mentions)')
+ .orWhere(':meIdAsList <@ note.mentions')
// Followers-only post
.orWhere(new Brackets(qb => this
.andFollowingUser(qb, ':meId', 'note.userId')
.andWhere('note.visibility = \'followers\'')));
- q.setParameters({ meId: me.id });
+ q.setParameters({ meId: me.id, meIdAsList: [me.id] });
}
}));
}
@@ -284,6 +284,33 @@ export class QueryService {
};
/**
+ * Adds OR condition that followerProp (user ID) is following followeeProp (channel ID).
+ * Both props should be expressions, not raw values.
+ */
+ @bindThis
+ public orFollowingChannel<Q extends WhereExpressionBuilder>(q: Q, followerProp: string, followeeProp: string): Q {
+ return this.addFollowingChannel(q, followerProp, followeeProp, 'orWhere');
+ }
+
+ /**
+ * Adds AND condition that followerProp (user ID) is following followeeProp (channel ID).
+ * Both props should be expressions, not raw values.
+ */
+ @bindThis
+ public andFollowingChannel<Q extends WhereExpressionBuilder>(q: Q, followerProp: string, followeeProp: string): Q {
+ return this.addFollowingChannel(q, followerProp, followeeProp, 'andWhere');
+ }
+
+ private addFollowingChannel<Q extends WhereExpressionBuilder>(q: Q, followerProp: string, followeeProp: string, join: 'andWhere' | 'orWhere'): Q {
+ const followingQuery = this.channelFollowingsRepository.createQueryBuilder('following')
+ .select('1')
+ .andWhere(`following.followerId = ${followerProp}`)
+ .andWhere(`following.followeeId = ${followeeProp}`);
+
+ return q[join](`EXISTS (${followingQuery.getQuery()})`, followingQuery.getParameters());
+ }
+
+ /**
* Adds OR condition that blockerProp (user ID) is not blocking blockeeProp (user ID).
* Both props should be expressions, not raw values.
*/