aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/models
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2020-02-21 14:11:11 +0100
committerChocobozzz <me@florianbigard.com>2020-02-25 16:30:09 +0100
commit1647e4effd9481203de8bd6204c54bc023b37ae6 (patch)
tree9f39b186a487826960520a5b90ccd8df9b63666e /server/models
parente962e1c3c52b77075ec7b46ed0984476684551ab (diff)
downloadPeerTube-1647e4effd9481203de8bd6204c54bc023b37ae6.tar.gz
PeerTube-1647e4effd9481203de8bd6204c54bc023b37ae6.tar.zst
PeerTube-1647e4effd9481203de8bd6204c54bc023b37ae6.zip
Fix CPU usage on PostgreSQL
Diffstat (limited to 'server/models')
-rw-r--r--server/models/video/video.ts49
1 files changed, 19 insertions, 30 deletions
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index bd4ca63ea..2e518317d 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -361,42 +361,31 @@ export type AvailableForListIDsOptions = {
361 } 361 }
362 362
363 if (options.followerActorId) { 363 if (options.followerActorId) {
364 let localVideosReq: WhereOptions = {} 364 let localVideosReq = ''
365 if (options.includeLocalVideos === true) { 365 if (options.includeLocalVideos === true) {
366 localVideosReq = { remote: false } 366 localVideosReq = ' UNION ALL SELECT "video"."id" FROM "video" WHERE remote IS FALSE'
367 } 367 }
368 368
369 // Force actorId to be a number to avoid SQL injections 369 // Force actorId to be a number to avoid SQL injections
370 const actorIdNumber = parseInt(options.followerActorId.toString(), 10) 370 const actorIdNumber = parseInt(options.followerActorId.toString(), 10)
371 whereAnd.push({ 371 whereAnd.push({
372 [Op.or]: [ 372 id: {
373 { 373 [Op.in]: Sequelize.literal(
374 id: { 374 '(' +
375 [Op.in]: Sequelize.literal( 375 'SELECT "videoShare"."videoId" AS "id" FROM "videoShare" ' +
376 '(' + 376 'INNER JOIN "actorFollow" ON "actorFollow"."targetActorId" = "videoShare"."actorId" ' +
377 'SELECT "videoShare"."videoId" AS "id" FROM "videoShare" ' + 377 'WHERE "actorFollow"."actorId" = ' + actorIdNumber +
378 'INNER JOIN "actorFollow" ON "actorFollow"."targetActorId" = "videoShare"."actorId" ' + 378 ' UNION ALL ' +
379 'WHERE "actorFollow"."actorId" = ' + actorIdNumber + 379 'SELECT "video"."id" AS "id" FROM "video" ' +
380 ')' 380 'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' +
381 ) 381 'INNER JOIN "account" ON "account"."id" = "videoChannel"."accountId" ' +
382 } 382 'INNER JOIN "actor" ON "account"."actorId" = "actor"."id" ' +
383 }, 383 'INNER JOIN "actorFollow" ON "actorFollow"."targetActorId" = "actor"."id" ' +
384 { 384 'WHERE "actorFollow"."actorId" = ' + actorIdNumber +
385 id: { 385 localVideosReq +
386 [Op.in]: Sequelize.literal( 386 ')'
387 '(' + 387 )
388 'SELECT "video"."id" AS "id" FROM "video" ' + 388 }
389 'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' +
390 'INNER JOIN "account" ON "account"."id" = "videoChannel"."accountId" ' +
391 'INNER JOIN "actor" ON "account"."actorId" = "actor"."id" ' +
392 'INNER JOIN "actorFollow" ON "actorFollow"."targetActorId" = "actor"."id" ' +
393 'WHERE "actorFollow"."actorId" = ' + actorIdNumber +
394 ')'
395 )
396 }
397 },
398 localVideosReq
399 ]
400 }) 389 })
401 } 390 }
402 391