From 0472cd99968597d3ff86738235844837fff2c164 Mon Sep 17 00:00:00 2001 From: peolic <66393006+peolic@users.noreply.github.com> Date: Mon, 24 May 2021 10:45:51 +0300 Subject: [PATCH] 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> --- pkg/sqlite/performer.go | 8 +++-- pkg/sqlite/performer_test.go | 66 ++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/pkg/sqlite/performer.go b/pkg/sqlite/performer.go index 2df2b195a..3c298c536 100644 --- a/pkg/sqlite/performer.go +++ b/pkg/sqlite/performer.go @@ -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") } diff --git a/pkg/sqlite/performer_test.go b/pkg/sqlite/performer_test.go index d50bc959f..128bcdfab 100644 --- a/pkg/sqlite/performer_test.go +++ b/pkg/sqlite/performer_test.go @@ -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