Optimize comment RSS sql query
This commit is contained in:
parent
1c5c31a1ce
commit
1c58423f6c
2 changed files with 40 additions and 14 deletions
|
@ -129,6 +129,30 @@ function buildBlockedAccountSQL (blockerIds: number[]) {
|
|||
'WHERE "serverBlocklist"."accountId" IN (' + blockerIdsString + ')'
|
||||
}
|
||||
|
||||
function buildBlockedAccountSQLOptimized (columnNameJoin: string, blockerIds: number[]) {
|
||||
const blockerIdsString = blockerIds.join(', ')
|
||||
|
||||
return [
|
||||
literal(
|
||||
`NOT EXISTS (` +
|
||||
` SELECT 1 FROM "accountBlocklist" ` +
|
||||
` WHERE "targetAccountId" = ${columnNameJoin} ` +
|
||||
` AND "accountId" IN (${blockerIdsString})` +
|
||||
`)`
|
||||
),
|
||||
|
||||
literal(
|
||||
`NOT EXISTS (` +
|
||||
` SELECT 1 FROM "account" ` +
|
||||
` INNER JOIN "actor" ON account."actorId" = actor.id ` +
|
||||
` INNER JOIN "serverBlocklist" ON "actor"."serverId" = "serverBlocklist"."targetServerId" ` +
|
||||
` WHERE "account"."id" = ${columnNameJoin} ` +
|
||||
` AND "serverBlocklist"."accountId" IN (${blockerIdsString})` +
|
||||
`)`
|
||||
)
|
||||
]
|
||||
}
|
||||
|
||||
function buildServerIdsFollowedBy (actorId: any) {
|
||||
const actorIdNumber = parseInt(actorId + '', 10)
|
||||
|
||||
|
@ -201,6 +225,7 @@ function searchAttribute (sourceField?: string, targetField?: string) {
|
|||
|
||||
export {
|
||||
buildBlockedAccountSQL,
|
||||
buildBlockedAccountSQLOptimized,
|
||||
buildLocalActorIdsIn,
|
||||
SortType,
|
||||
buildLocalAccountIdsIn,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import * as Bluebird from 'bluebird'
|
||||
import { uniq } from 'lodash'
|
||||
import { FindOptions, Op, Order, ScopeOptions, Sequelize, Transaction } from 'sequelize'
|
||||
import { FindOptions, Op, Order, ScopeOptions, Sequelize, Transaction, WhereOptions } from 'sequelize'
|
||||
import {
|
||||
AllowNull,
|
||||
BelongsTo,
|
||||
|
@ -40,7 +40,7 @@ import {
|
|||
import { VideoCommentAbuseModel } from '../abuse/video-comment-abuse'
|
||||
import { AccountModel } from '../account/account'
|
||||
import { ActorModel, unusedActorAttributesForAPI } from '../activitypub/actor'
|
||||
import { buildBlockedAccountSQL, buildLocalAccountIdsIn, getCommentSort, throwIfNotValid } from '../utils'
|
||||
import { buildBlockedAccountSQL, buildBlockedAccountSQLOptimized, buildLocalAccountIdsIn, getCommentSort, throwIfNotValid } from '../utils'
|
||||
import { VideoModel } from './video'
|
||||
import { VideoChannelModel } from './video-channel'
|
||||
|
||||
|
@ -460,19 +460,20 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
|
|||
const serverActor = await getServerActor()
|
||||
const { start, count, videoId, accountId, videoChannelId } = parameters
|
||||
|
||||
const accountExclusion = {
|
||||
[Op.notIn]: Sequelize.literal(
|
||||
'(' + buildBlockedAccountSQL([ serverActor.Account.id, '"Video->VideoChannel"."accountId"' ]) + ')'
|
||||
)
|
||||
const whereAnd: WhereOptions[] = buildBlockedAccountSQLOptimized(
|
||||
'"VideoCommentModel"."accountId"',
|
||||
[ serverActor.Account.id, '"Video->VideoChannel"."accountId"' ]
|
||||
)
|
||||
|
||||
if (accountId) {
|
||||
whereAnd.push({
|
||||
[Op.eq]: accountId
|
||||
})
|
||||
}
|
||||
|
||||
const accountWhere = {
|
||||
[Op.and]: whereAnd
|
||||
}
|
||||
const accountWhere = accountId
|
||||
? {
|
||||
[Op.and]: {
|
||||
...accountExclusion,
|
||||
[Op.eq]: accountId
|
||||
}
|
||||
}
|
||||
: accountExclusion
|
||||
|
||||
const videoChannelWhere = videoChannelId ? { id: videoChannelId } : undefined
|
||||
|
||||
|
|
Loading…
Reference in a new issue