Fix performer filters and sort keys (#1413)

* Fix "performer is missing image" filter
* Fix `scene_count` sort
* Add unit tests

Co-authored-by: bnkai <48220860+bnkai@users.noreply.github.com>
Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
This commit is contained in:
peolic 2021-05-24 10:45:51 +03:00 committed by GitHub
parent c08e0c0f60
commit 0472cd9996
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 72 additions and 2 deletions

View File

@ -12,6 +12,7 @@ import (
const performerTable = "performers"
const performerIDColumn = "performer_id"
const performersTagsTable = "performers_tags"
const performersImageTable = "performers_image" // performer cover image
var countPerformersForTagQuery = `
SELECT tag_id AS id FROM performers_tags
@ -339,8 +340,8 @@ func performerIsMissingCriterionHandler(qb *performerQueryBuilder, isMissing *st
f.addJoin(performersScenesTable, "scenes_join", "scenes_join.performer_id = performers.id")
f.addWhere("scenes_join.scene_id IS NULL")
case "image":
f.addJoin(performersImagesTable, "", "performers_image.performer_id = performers.id")
f.addWhere("performers_image.performer_id IS NULL")
f.addJoin(performersImageTable, "image_join", "image_join.performer_id = performers.id")
f.addWhere("image_join.performer_id IS NULL")
default:
f.addWhere("(performers." + *isMissing + " IS NULL OR TRIM(performers." + *isMissing + ") = '')")
}
@ -508,6 +509,9 @@ func (qb *performerQueryBuilder) getPerformerSort(findFilter *models.FindFilterT
if sort == "tag_count" {
return getCountSort(performerTable, performersTagsTable, performerIDColumn, direction)
}
if sort == "scenes_count" {
return getCountSort(performerTable, performersScenesTable, performerIDColumn, direction)
}
return getSort(sort, direction, "performers")
}

View File

@ -868,6 +868,72 @@ func TestPerformerQueryIsMissingRating(t *testing.T) {
})
}
func TestPerformerQueryIsMissingImage(t *testing.T) {
withTxn(func(r models.Repository) error {
isMissing := "image"
performerFilter := &models.PerformerFilterType{
IsMissing: &isMissing,
}
// ensure query does not error
performers, _, err := r.Performer().Query(performerFilter, nil)
if err != nil {
t.Errorf("Error querying performers: %s", err.Error())
}
assert.True(t, len(performers) > 0)
for _, performer := range performers {
img, err := r.Performer().GetImage(performer.ID)
if err != nil {
t.Errorf("error getting performer image: %s", err.Error())
}
assert.Nil(t, img)
}
return nil
})
}
func TestPerformerQuerySortScenesCount(t *testing.T) {
sort := "scenes_count"
direction := models.SortDirectionEnumDesc
findFilter := &models.FindFilterType{
Sort: &sort,
Direction: &direction,
}
withTxn(func(r models.Repository) error {
// just ensure it queries without error
performers, _, err := r.Performer().Query(nil, findFilter)
if err != nil {
t.Errorf("Error querying performers: %s", err.Error())
}
assert.True(t, len(performers) > 0)
// first performer should be performerIdxWithTwoScenes
firstPerformer := performers[0]
assert.Equal(t, performerIDs[performerIdxWithTwoScenes], firstPerformer.ID)
// sort in ascending order
direction = models.SortDirectionEnumAsc
performers, _, err = r.Performer().Query(nil, findFilter)
if err != nil {
t.Errorf("Error querying performers: %s", err.Error())
}
assert.True(t, len(performers) > 0)
lastPerformer := performers[len(performers)-1]
assert.Equal(t, performerIDs[performerIdxWithTwoScenes], lastPerformer.ID)
return nil
})
}
// TODO Update
// TODO Destroy
// TODO Find