Added actor stash.
This commit is contained in:
@@ -2,7 +2,7 @@ import config from 'config';
|
||||
import util from 'util'; /* eslint-disable-line no-unused-vars */
|
||||
|
||||
import { knexOwner as knex, knexManticore } from './knex.js';
|
||||
import { searchApi, utilsApi } from './manticore.js';
|
||||
import { utilsApi } from './manticore.js';
|
||||
import { HttpError } from './errors.js';
|
||||
import { fetchActorsById, curateActor, sortActorsByGender } from './actors.js';
|
||||
import { fetchTagsById } from './tags.js';
|
||||
@@ -55,7 +55,10 @@ function curateScene(rawScene, assets) {
|
||||
type: assets.channel.network_type,
|
||||
hasLogo: assets.channel.has_logo,
|
||||
} : null,
|
||||
actors: sortActorsByGender(assets.actors.map((actor) => curateActor(actor, { sceneDate: rawScene.effective_date }))),
|
||||
actors: sortActorsByGender(assets.actors.map((actor) => curateActor(actor, {
|
||||
sceneDate: rawScene.effective_date,
|
||||
stashes: assets.actorStashes,
|
||||
}))),
|
||||
directors: assets.directors.map((director) => ({
|
||||
id: director.id,
|
||||
slug: director.slug,
|
||||
@@ -74,7 +77,7 @@ function curateScene(rawScene, assets) {
|
||||
};
|
||||
}
|
||||
|
||||
export async function fetchScenesById(sceneIds, reqUser) {
|
||||
export async function fetchScenesById(sceneIds, { reqUser, ...context } = {}) {
|
||||
const [scenes, channels, actors, directors, tags, posters, photos, stashes] = await Promise.all([
|
||||
knex('releases').whereIn('releases.id', sceneIds),
|
||||
knex('releases')
|
||||
@@ -125,6 +128,13 @@ export async function fetchScenesById(sceneIds, reqUser) {
|
||||
: [],
|
||||
]);
|
||||
|
||||
const actorStashes = reqUser && context.actorStashes
|
||||
? await knex('stashes_actors')
|
||||
.leftJoin('stashes', 'stashes.id', 'stashes_actors.stash_id')
|
||||
.where('stashes.user_id', reqUser.id)
|
||||
.whereIn('stashes_actors.actor_id', actors.map((actor) => actor.id))
|
||||
: [];
|
||||
|
||||
return sceneIds.map((sceneId) => {
|
||||
const scene = scenes.find((sceneEntry) => sceneEntry.id === sceneId);
|
||||
|
||||
@@ -139,6 +149,7 @@ export async function fetchScenesById(sceneIds, reqUser) {
|
||||
const scenePoster = posters.find((poster) => poster.release_id === sceneId);
|
||||
const scenePhotos = photos.filter((photo) => photo.release_id === sceneId);
|
||||
const sceneStashes = stashes.filter((stash) => stash.scene_id === sceneId);
|
||||
const sceneActorStashes = sceneActors.map((actor) => actorStashes.find((stash) => stash.actor_id === actor.id)).filter(Boolean);
|
||||
|
||||
return curateScene(scene, {
|
||||
channel: sceneChannel,
|
||||
@@ -148,6 +159,7 @@ export async function fetchScenesById(sceneIds, reqUser) {
|
||||
poster: scenePoster,
|
||||
photos: scenePhotos,
|
||||
stashes: sceneStashes,
|
||||
actorStashes: sceneActorStashes,
|
||||
});
|
||||
}).filter(Boolean);
|
||||
}
|
||||
@@ -171,6 +183,7 @@ function curateOptions(options) {
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
function buildQuery(filters = {}, options) {
|
||||
const query = {
|
||||
bool: {
|
||||
@@ -215,23 +228,6 @@ function buildQuery(filters = {}, options) {
|
||||
}
|
||||
|
||||
if (filters.query) {
|
||||
/*
|
||||
query.bool.must.push({
|
||||
bool: {
|
||||
should: [
|
||||
{ match: { title_filtered: filters.query } },
|
||||
{ match: { actors: filters.query } },
|
||||
{ match: { tags: filters.query } },
|
||||
{ match: { channel_name: filters.query } },
|
||||
{ match: { network_name: filters.query } },
|
||||
{ match: { channel_slug: filters.query } },
|
||||
{ match: { network_slug: filters.query } },
|
||||
{ match: { meta: filters.query } }, // date
|
||||
],
|
||||
},
|
||||
});
|
||||
*/
|
||||
|
||||
query.bool.must.push({ match: { '!title': filters.query } }); // title_filtered is matched instead of title
|
||||
}
|
||||
|
||||
@@ -262,16 +258,6 @@ function buildQuery(filters = {}, options) {
|
||||
query.bool.must.push({ equals: { stash_id: filters.stashId } });
|
||||
}
|
||||
|
||||
/* tag filter
|
||||
must_not: [
|
||||
{
|
||||
in: {
|
||||
'any(tag_ids)': [101, 180, 32],
|
||||
},
|
||||
},
|
||||
],
|
||||
*/
|
||||
|
||||
return { query, sort };
|
||||
}
|
||||
|
||||
@@ -311,14 +297,6 @@ function buildAggregates(options) {
|
||||
return aggregates;
|
||||
}
|
||||
|
||||
function countAggregations(buckets) {
|
||||
if (!buckets) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Object.fromEntries(buckets.map((bucket) => [bucket.key, { count: bucket.doc_count }]));
|
||||
}
|
||||
|
||||
async function queryManticoreJson(filters, options, _reqUser) {
|
||||
const { query, sort } = buildQuery(filters, options);
|
||||
|
||||
@@ -357,24 +335,26 @@ async function queryManticoreJson(filters, options, _reqUser) {
|
||||
aggregations: result.aggregations && Object.fromEntries(Object.entries(result.aggregations).map(([key, { buckets }]) => [key, buckets])),
|
||||
};
|
||||
}
|
||||
*/
|
||||
|
||||
async function queryManticoreSql(filters, options, _reqUser) {
|
||||
const aggSize = config.database.manticore.maxAggregateSize;
|
||||
|
||||
const sqlQuery = knexManticore.raw(`
|
||||
:query:
|
||||
OPTION field_weights=(
|
||||
title_filtered=7,
|
||||
actors=10,
|
||||
tags=9,
|
||||
meta=6,
|
||||
channel_name=2,
|
||||
channel_slug=3,
|
||||
network_name=1,
|
||||
network_slug=1
|
||||
),
|
||||
max_matches=:maxMatches:,
|
||||
max_query_time=:maxQueryTime:
|
||||
OPTION
|
||||
field_weights=(
|
||||
title_filtered=7,
|
||||
actors=10,
|
||||
tags=9,
|
||||
meta=6,
|
||||
channel_name=2,
|
||||
channel_slug=3,
|
||||
network_name=1,
|
||||
network_slug=1
|
||||
),
|
||||
max_matches=:maxMatches:,
|
||||
max_query_time=:maxQueryTime:
|
||||
:actorsFacet:
|
||||
:tagsFacet:
|
||||
:channelsFacet:;
|
||||
@@ -391,6 +371,7 @@ async function queryManticoreSql(filters, options, _reqUser) {
|
||||
scenes.channel_id as channel_id,
|
||||
scenes.network_id as network_id,
|
||||
scenes.effective_date as effective_date,
|
||||
scenes.stashed as stashed,
|
||||
scenes.created_at,
|
||||
created_at as stashed_at,
|
||||
weight() as _score
|
||||
@@ -481,7 +462,7 @@ async function queryManticoreSql(filters, options, _reqUser) {
|
||||
|
||||
const results = await utilsApi.sql(curatedSqlQuery);
|
||||
|
||||
console.log(results[0]);
|
||||
// console.log(results[0]);
|
||||
|
||||
const actorIds = results
|
||||
.find((result) => (result.columns[0].actor_ids || result.columns[0]['scenes.actor_ids']) && result.columns[1]['count(*)'])
|
||||
@@ -511,6 +492,14 @@ async function queryManticoreSql(filters, options, _reqUser) {
|
||||
};
|
||||
}
|
||||
|
||||
function countAggregations(buckets) {
|
||||
if (!buckets) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Object.fromEntries(buckets.map((bucket) => [bucket.key, { count: bucket.doc_count }]));
|
||||
}
|
||||
|
||||
export async function fetchScenes(filters, rawOptions, reqUser) {
|
||||
const options = curateOptions(rawOptions);
|
||||
|
||||
@@ -527,10 +516,6 @@ export async function fetchScenes(filters, rawOptions, reqUser) {
|
||||
const result = await queryManticoreSql(filters, options, reqUser);
|
||||
console.timeEnd('manticore sql');
|
||||
|
||||
console.time('manticore json');
|
||||
await queryManticoreJson(filters, options, reqUser);
|
||||
console.timeEnd('manticore json');
|
||||
|
||||
const actorCounts = options.aggregateActors && countAggregations(result.aggregations?.actorIds);
|
||||
const tagCounts = options.aggregateTags && countAggregations(result.aggregations?.tagIds);
|
||||
const channelCounts = options.aggregateChannels && countAggregations(result.aggregations?.channelIds);
|
||||
@@ -547,7 +532,7 @@ export async function fetchScenes(filters, rawOptions, reqUser) {
|
||||
|
||||
console.time('fetch full');
|
||||
const sceneIds = result.scenes.map((scene) => Number(scene.id));
|
||||
const scenes = await fetchScenesById(sceneIds, reqUser);
|
||||
const scenes = await fetchScenesById(sceneIds, { reqUser });
|
||||
console.timeEnd('fetch full');
|
||||
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user