mirror of https://github.com/Chocobozzz/PeerTube
Optimize sql requests on broadcast
parent
34450e1e55
commit
891a819661
|
@ -2,12 +2,10 @@ import * as Bluebird from 'bluebird'
|
||||||
import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
|
import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
|
||||||
import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
|
import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
|
||||||
import { CONSTRAINTS_FIELDS } from '../../initializers/constants'
|
import { CONSTRAINTS_FIELDS } from '../../initializers/constants'
|
||||||
import { AccountModel } from '../account/account'
|
|
||||||
import { ActorModel } from '../activitypub/actor'
|
import { ActorModel } from '../activitypub/actor'
|
||||||
import { buildLocalActorIdsIn, throwIfNotValid } from '../utils'
|
import { buildLocalActorIdsIn, throwIfNotValid } from '../utils'
|
||||||
import { VideoModel } from './video'
|
import { VideoModel } from './video'
|
||||||
import { VideoChannelModel } from './video-channel'
|
import { literal, Op, Transaction } from 'sequelize'
|
||||||
import { Op, Transaction } from 'sequelize'
|
|
||||||
import { MVideoShareActor, MVideoShareFull } from '../../typings/models/video'
|
import { MVideoShareActor, MVideoShareFull } from '../../typings/models/video'
|
||||||
import { MActorDefault } from '../../typings/models'
|
import { MActorDefault } from '../../typings/models'
|
||||||
|
|
||||||
|
@ -124,70 +122,55 @@ export class VideoShareModel extends Model<VideoShareModel> {
|
||||||
}
|
}
|
||||||
|
|
||||||
return VideoShareModel.scope(ScopeNames.FULL).findAll(query)
|
return VideoShareModel.scope(ScopeNames.FULL).findAll(query)
|
||||||
.then((res: MVideoShareFull[]) => res.map(r => r.Actor))
|
.then((res: MVideoShareFull[]) => res.map(r => r.Actor))
|
||||||
}
|
}
|
||||||
|
|
||||||
static loadActorsWhoSharedVideosOf (actorOwnerId: number, t: Transaction): Bluebird<MActorDefault[]> {
|
static loadActorsWhoSharedVideosOf (actorOwnerId: number, t: Transaction): Bluebird<MActorDefault[]> {
|
||||||
|
const safeOwnerId = parseInt(actorOwnerId + '', 10)
|
||||||
|
|
||||||
|
// /!\ On actor model
|
||||||
const query = {
|
const query = {
|
||||||
attributes: [],
|
where: {
|
||||||
include: [
|
[Op.and]: [
|
||||||
{
|
literal(
|
||||||
model: ActorModel,
|
`EXISTS (` +
|
||||||
required: true
|
` SELECT 1 FROM "videoShare" ` +
|
||||||
},
|
` INNER JOIN "video" ON "videoShare"."videoId" = "video"."id" ` +
|
||||||
{
|
` INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ` +
|
||||||
attributes: [],
|
` INNER JOIN "account" ON "account"."id" = "videoChannel"."accountId" ` +
|
||||||
model: VideoModel,
|
` WHERE "videoShare"."actorId" = "ActorModel"."id" AND "account"."actorId" = ${safeOwnerId} ` +
|
||||||
required: true,
|
` LIMIT 1` +
|
||||||
include: [
|
`)`
|
||||||
{
|
)
|
||||||
attributes: [],
|
]
|
||||||
model: VideoChannelModel.unscoped(),
|
},
|
||||||
required: true,
|
|
||||||
include: [
|
|
||||||
{
|
|
||||||
attributes: [],
|
|
||||||
model: AccountModel.unscoped(),
|
|
||||||
required: true,
|
|
||||||
where: {
|
|
||||||
actorId: actorOwnerId
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
transaction: t
|
transaction: t
|
||||||
}
|
}
|
||||||
|
|
||||||
return VideoShareModel.scope(ScopeNames.FULL).findAll(query)
|
return ActorModel.findAll(query)
|
||||||
.then(res => res.map(r => r.Actor))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static loadActorsByVideoChannel (videoChannelId: number, t: Transaction): Bluebird<MActorDefault[]> {
|
static loadActorsByVideoChannel (videoChannelId: number, t: Transaction): Bluebird<MActorDefault[]> {
|
||||||
|
const safeChannelId = parseInt(videoChannelId + '', 10)
|
||||||
|
|
||||||
|
// /!\ On actor model
|
||||||
const query = {
|
const query = {
|
||||||
attributes: [],
|
where: {
|
||||||
include: [
|
[Op.and]: [
|
||||||
{
|
literal(
|
||||||
model: ActorModel,
|
`EXISTS (` +
|
||||||
required: true
|
` SELECT 1 FROM "videoShare" ` +
|
||||||
},
|
` INNER JOIN "video" ON "videoShare"."videoId" = "video"."id" ` +
|
||||||
{
|
` WHERE "videoShare"."actorId" = "ActorModel"."id" AND "video"."channelId" = ${safeChannelId} ` +
|
||||||
attributes: [],
|
` LIMIT 1` +
|
||||||
model: VideoModel,
|
`)`
|
||||||
required: true,
|
)
|
||||||
where: {
|
]
|
||||||
channelId: videoChannelId
|
},
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
transaction: t
|
transaction: t
|
||||||
}
|
}
|
||||||
|
|
||||||
return VideoShareModel.scope(ScopeNames.FULL)
|
return ActorModel.findAll(query)
|
||||||
.findAll(query)
|
|
||||||
.then(res => res.map(r => r.Actor))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static listAndCountByVideoId (videoId: number, start: number, count: number, t?: Transaction) {
|
static listAndCountByVideoId (videoId: number, start: number, count: number, t?: Transaction) {
|
||||||
|
|
Loading…
Reference in New Issue