From 37acd6b79b0e5c5815d5f9e382d4e23f37800ce0 Mon Sep 17 00:00:00 2001 From: dogwithakeyboard <128322708+dogwithakeyboard@users.noreply.github.com> Date: Wed, 21 Feb 2024 00:22:04 +0000 Subject: [PATCH] restore image performer age filter (#4601) --- graphql/schema/types/filters.graphql | 2 ++ pkg/models/image.go | 2 ++ pkg/sqlite/image.go | 17 +++++++++++++++++ ui/v2.5/src/models/list-filter/images.ts | 1 + 4 files changed, 22 insertions(+) diff --git a/graphql/schema/types/filters.graphql b/graphql/schema/types/filters.graphql index 0bc77e0ce..44a748a18 100644 --- a/graphql/schema/types/filters.graphql +++ b/graphql/schema/types/filters.graphql @@ -500,6 +500,8 @@ input ImageFilterType { performer_count: IntCriterionInput "Filter images that have performers that have been favorited" performer_favorite: Boolean + "Filter images by performer age at time of image" + performer_age: IntCriterionInput "Filter to only include images with these galleries" galleries: MultiCriterionInput "Filter by creation time" diff --git a/pkg/models/image.go b/pkg/models/image.go index d4f85e4b6..8dca73991 100644 --- a/pkg/models/image.go +++ b/pkg/models/image.go @@ -47,6 +47,8 @@ type ImageFilterType struct { PerformerCount *IntCriterionInput `json:"performer_count"` // Filter images that have performers that have been favorited PerformerFavorite *bool `json:"performer_favorite"` + // Filter images by performer age at time of image + PerformerAge *IntCriterionInput `json:"performer_age"` // Filter to only include images with these galleries Galleries *MultiCriterionInput `json:"galleries"` // Filter by created at diff --git a/pkg/sqlite/image.go b/pkg/sqlite/image.go index d32209225..0393d18ec 100644 --- a/pkg/sqlite/image.go +++ b/pkg/sqlite/image.go @@ -720,6 +720,7 @@ func (qb *ImageStore) makeFilter(ctx context.Context, imageFilter *models.ImageF query.handleCriterion(ctx, studioCriterionHandler(imageTable, imageFilter.Studios)) query.handleCriterion(ctx, imagePerformerTagsCriterionHandler(qb, imageFilter.PerformerTags)) query.handleCriterion(ctx, imagePerformerFavoriteCriterionHandler(imageFilter.PerformerFavorite)) + query.handleCriterion(ctx, imagePerformerAgeCriterionHandler(imageFilter.PerformerAge)) query.handleCriterion(ctx, timestampCriterionHandler(imageFilter.CreatedAt, "images.created_at")) query.handleCriterion(ctx, timestampCriterionHandler(imageFilter.UpdatedAt, "images.updated_at")) @@ -1025,6 +1026,22 @@ GROUP BY performers_images.image_id HAVING SUM(performers.favorite) = 0)`, "nofa } } +func imagePerformerAgeCriterionHandler(performerAge *models.IntCriterionInput) criterionHandlerFunc { + return func(ctx context.Context, f *filterBuilder) { + if performerAge != nil { + f.addInnerJoin("performers_images", "", "images.id = performers_images.image_id") + f.addInnerJoin("performers", "", "performers_images.performer_id = performers.id") + + f.addWhere("images.date != '' AND performers.birthdate != ''") + f.addWhere("images.date IS NOT NULL AND performers.birthdate IS NOT NULL") + + ageCalc := "cast(strftime('%Y.%m%d', images.date) - strftime('%Y.%m%d', performers.birthdate) as int)" + whereClause, args := getIntWhereClause(ageCalc, performerAge.Modifier, performerAge.Value, performerAge.Value2) + f.addWhere(whereClause, args...) + } + } +} + func imagePerformerTagsCriterionHandler(qb *ImageStore, tags *models.HierarchicalMultiCriterionInput) criterionHandler { return &joinedPerformerTagsHandler{ criterion: tags, diff --git a/ui/v2.5/src/models/list-filter/images.ts b/ui/v2.5/src/models/list-filter/images.ts index 9e4ace582..5a5d5f43f 100644 --- a/ui/v2.5/src/models/list-filter/images.ts +++ b/ui/v2.5/src/models/list-filter/images.ts @@ -52,6 +52,7 @@ const criterionOptions = [ PerformerTagsCriterionOption, PerformersCriterionOption, createMandatoryNumberCriterionOption("performer_count"), + createMandatoryNumberCriterionOption("performer_age"), PerformerFavoriteCriterionOption, StudiosCriterionOption, createStringCriterionOption("url"),