Fix SQL error when querying performers with missing aliases (#4894)

This commit is contained in:
WithoutPants
2024-05-29 07:48:35 +10:00
committed by GitHub
parent 0ff0f9c8ec
commit 2ca53714a6
3 changed files with 41 additions and 17 deletions

View File

@@ -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 + ") = '')")
}

View File

@@ -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

View File

@@ -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),