diff --git a/pkg/sqlite/performer.go b/pkg/sqlite/performer.go index 5463a6a8d..dcdc92f0f 100644 --- a/pkg/sqlite/performer.go +++ b/pkg/sqlite/performer.go @@ -744,6 +744,7 @@ func (qb *PerformerStore) QueryCount(ctx context.Context, performerFilter *model return query.executeCount(ctx) } +// TODO - we need to provide a whitelist of possible values func performerIsMissingCriterionHandler(qb *PerformerStore, isMissing *string) criterionHandlerFunc { return func(ctx context.Context, f *filterBuilder) { if isMissing != nil && *isMissing != "" { @@ -756,6 +757,9 @@ func performerIsMissingCriterionHandler(qb *PerformerStore, isMissing *string) c case "stash_id": performersStashIDsTableMgr.join(f, "performer_stash_ids", "performers.id") f.addWhere("performer_stash_ids.performer_id IS NULL") + case "aliases": + performersAliasesTableMgr.join(f, "", "performers.id") + f.addWhere("performer_aliases.alias IS NULL") default: f.addWhere("(performers." + *isMissing + " IS NULL OR TRIM(performers." + *isMissing + ") = '')") } diff --git a/pkg/sqlite/performer_test.go b/pkg/sqlite/performer_test.go index 1951d4eb7..8ba32964b 100644 --- a/pkg/sqlite/performer_test.go +++ b/pkg/sqlite/performer_test.go @@ -1760,14 +1760,17 @@ func verifyPerformersRating100(t *testing.T, ratingCriterion models.IntCriterion }) } +func performerQueryIsMissing(ctx context.Context, t *testing.T, m string) []*models.Performer { + performerFilter := models.PerformerFilterType{ + IsMissing: &m, + } + + return queryPerformers(ctx, t, &performerFilter, nil) +} + func TestPerformerQueryIsMissingRating(t *testing.T) { withTxn(func(ctx context.Context) error { - isMissing := "rating" - performerFilter := models.PerformerFilterType{ - IsMissing: &isMissing, - } - - performers := queryPerformers(ctx, t, &performerFilter, nil) + performers := performerQueryIsMissing(ctx, t, "rating") assert.True(t, len(performers) > 0) @@ -1781,16 +1784,7 @@ func TestPerformerQueryIsMissingRating(t *testing.T) { func TestPerformerQueryIsMissingImage(t *testing.T) { withTxn(func(ctx context.Context) error { - isMissing := "image" - performerFilter := &models.PerformerFilterType{ - IsMissing: &isMissing, - } - - // ensure query does not error - performers, _, err := db.Performer.Query(ctx, performerFilter, nil) - if err != nil { - t.Errorf("Error querying performers: %s", err.Error()) - } + performers := performerQueryIsMissing(ctx, t, "image") assert.True(t, len(performers) > 0) @@ -1806,6 +1800,24 @@ func TestPerformerQueryIsMissingImage(t *testing.T) { }) } +func TestPerformerQueryIsMissingAlias(t *testing.T) { + withTxn(func(ctx context.Context) error { + performers := performerQueryIsMissing(ctx, t, "aliases") + + assert.True(t, len(performers) > 0) + + for _, performer := range performers { + a, err := db.Performer.GetAliases(ctx, performer.ID) + if err != nil { + t.Errorf("error getting performer aliases: %s", err.Error()) + } + assert.Nil(t, a) + } + + return nil + }) +} + func TestPerformerQuerySortScenesCount(t *testing.T) { sort := "scenes_count" direction := models.SortDirectionEnumDesc diff --git a/pkg/sqlite/setup_test.go b/pkg/sqlite/setup_test.go index 6dbcefba2..91b2b49fb 100644 --- a/pkg/sqlite/setup_test.go +++ b/pkg/sqlite/setup_test.go @@ -1420,6 +1420,14 @@ func performerStashID(i int) models.StashID { } } +func performerAliases(i int) []string { + if i%5 == 0 { + return []string{} + } + + return []string{getPerformerStringValue(i, "alias")} +} + // createPerformers creates n performers with plain Name and o performers with camel cased NaMe included func createPerformers(ctx context.Context, n int, o int) error { pqb := db.Performer @@ -1443,7 +1451,7 @@ func createPerformers(ctx context.Context, n int, o int) error { performer := models.Performer{ Name: getPerformerStringValue(index, name), Disambiguation: getPerformerStringValue(index, "disambiguation"), - Aliases: models.NewRelatedStrings([]string{getPerformerStringValue(index, "alias")}), + Aliases: models.NewRelatedStrings(performerAliases(index)), URL: getPerformerNullStringValue(i, urlField), Favorite: getPerformerBoolValue(i), Birthdate: getPerformerBirthdate(i),