mirror of
https://github.com/stashapp/stash.git
synced 2026-05-09 05:05:29 +02:00
Merge 985bc926a8 into 46f72e5574
This commit is contained in:
commit
22e6e7b78a
11 changed files with 81 additions and 0 deletions
|
|
@ -576,6 +576,8 @@ input GalleryFilterType {
|
|||
performer_age: IntCriterionInput
|
||||
"Filter by number of images in this gallery"
|
||||
image_count: IntCriterionInput
|
||||
"Filter by o-counter"
|
||||
o_counter: IntCriterionInput
|
||||
"Filter by url"
|
||||
url: StringCriterionInput
|
||||
"Filter by date"
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ type Gallery {
|
|||
scenes: [Scene!]!
|
||||
studio: Studio
|
||||
image_count: Int!
|
||||
o_counter: Int # Resolver
|
||||
tags: [Tag!]!
|
||||
performers: [Performer!]!
|
||||
|
||||
|
|
|
|||
|
|
@ -152,6 +152,18 @@ func (r *galleryResolver) ImageCount(ctx context.Context, obj *models.Gallery) (
|
|||
return ret, nil
|
||||
}
|
||||
|
||||
func (r *galleryResolver) OCounter(ctx context.Context, obj *models.Gallery) (ret *int, err error) {
|
||||
var count int
|
||||
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
||||
count, err = r.repository.Image.OCountByGalleryID(ctx, obj.ID)
|
||||
return err
|
||||
}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &count, nil
|
||||
}
|
||||
|
||||
func (r *galleryResolver) Chapters(ctx context.Context, obj *models.Gallery) (ret []*models.GalleryChapter, err error) {
|
||||
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
||||
ret, err = r.repository.GalleryChapter.FindByGalleryID(ctx, obj.ID)
|
||||
|
|
|
|||
|
|
@ -47,6 +47,8 @@ type GalleryFilterType struct {
|
|||
PerformerAge *IntCriterionInput `json:"performer_age"`
|
||||
// Filter by number of images in this gallery
|
||||
ImageCount *IntCriterionInput `json:"image_count"`
|
||||
// Filter by o-counter
|
||||
OCounter *IntCriterionInput `json:"o_counter"`
|
||||
// Filter by url
|
||||
URL *StringCriterionInput `json:"url"`
|
||||
// Filter by date
|
||||
|
|
|
|||
|
|
@ -619,6 +619,34 @@ func (_m *ImageReaderWriter) OCount(ctx context.Context) (int, error) {
|
|||
return r0, r1
|
||||
}
|
||||
|
||||
// OCountByGalleryID provides a mock function with given fields: ctx, galleryID
|
||||
func (_m *ImageReaderWriter) OCountByGalleryID(ctx context.Context, galleryID int) (int, error) {
|
||||
ret := _m.Called(ctx, galleryID)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for OCountByGalleryID")
|
||||
}
|
||||
|
||||
var r0 int
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(context.Context, int) (int, error)); ok {
|
||||
return rf(ctx, galleryID)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(context.Context, int) int); ok {
|
||||
r0 = rf(ctx, galleryID)
|
||||
} else {
|
||||
r0 = ret.Get(0).(int)
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(context.Context, int) error); ok {
|
||||
r1 = rf(ctx, galleryID)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// OCountByPerformerID provides a mock function with given fields: ctx, performerID
|
||||
func (_m *ImageReaderWriter) OCountByPerformerID(ctx context.Context, performerID int) (int, error) {
|
||||
ret := _m.Called(ctx, performerID)
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ type ImageCounter interface {
|
|||
CountByFileID(ctx context.Context, fileID FileID) (int, error)
|
||||
CountByGalleryID(ctx context.Context, galleryID int) (int, error)
|
||||
OCount(ctx context.Context) (int, error)
|
||||
OCountByGalleryID(ctx context.Context, galleryID int) (int, error)
|
||||
OCountByPerformerID(ctx context.Context, performerID int) (int, error)
|
||||
OCountByStudioID(ctx context.Context, studioID int) (int, error)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,6 +100,7 @@ func (qb *galleryFilterHandler) criterionHandler() criterionHandler {
|
|||
qb.performerTagsCriterionHandler(filter.PerformerTags),
|
||||
qb.averageResolutionCriterionHandler(filter.AverageResolution),
|
||||
qb.imageCountCriterionHandler(filter.ImageCount),
|
||||
qb.galleryOCounterCriterionHandler(filter.OCounter),
|
||||
qb.performerFavoriteCriterionHandler(filter.PerformerFavorite),
|
||||
qb.performerAgeCriterionHandler(filter.PerformerAge),
|
||||
&dateCriterionHandler{filter.Date, "galleries.date", nil},
|
||||
|
|
@ -187,6 +188,24 @@ func (qb *galleryFilterHandler) criterionHandler() criterionHandler {
|
|||
}
|
||||
}
|
||||
|
||||
var selectGalleryOCountSQL = `SELECT COALESCE(SUM(images.o_counter), 0)
|
||||
FROM galleries_images
|
||||
LEFT JOIN images ON images.id = galleries_images.image_id
|
||||
WHERE galleries_images.gallery_id = galleries.id`
|
||||
|
||||
func (qb *galleryFilterHandler) galleryOCounterCriterionHandler(count *models.IntCriterionInput) criterionHandlerFunc {
|
||||
return func(ctx context.Context, f *filterBuilder) {
|
||||
if count == nil {
|
||||
return
|
||||
}
|
||||
|
||||
lhs := "(" + selectGalleryOCountSQL + ")"
|
||||
clause, args := getIntCriterionWhereClause(lhs, *count)
|
||||
|
||||
f.addWhere(clause, args...)
|
||||
}
|
||||
}
|
||||
|
||||
func (qb *galleryFilterHandler) urlsCriterionHandler(url *models.StringCriterionInput) criterionHandlerFunc {
|
||||
h := stringListCriterionHandlerBuilder{
|
||||
primaryTable: galleryTable,
|
||||
|
|
|
|||
|
|
@ -687,6 +687,19 @@ func (qb *ImageStore) CountByGalleryID(ctx context.Context, galleryID int) (int,
|
|||
return count(ctx, q)
|
||||
}
|
||||
|
||||
func (qb *ImageStore) OCountByGalleryID(ctx context.Context, galleryID int) (int, error) {
|
||||
table := qb.table()
|
||||
joinTable := galleriesImagesJoinTable
|
||||
q := dialect.Select(goqu.COALESCE(goqu.SUM("o_counter"), 0)).From(table).InnerJoin(joinTable, goqu.On(table.Col(idColumn).Eq(joinTable.Col(imageIDColumn)))).Where(joinTable.Col(galleryIDColumn).Eq(galleryID))
|
||||
|
||||
var ret int
|
||||
if err := querySimple(ctx, q, &ret); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func (qb *ImageStore) OCountByPerformerID(ctx context.Context, performerID int) (int, error) {
|
||||
table := qb.table()
|
||||
joinTable := performersImagesJoinTable
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ fragment SlimGalleryData on Gallery {
|
|||
photographer
|
||||
rating100
|
||||
organized
|
||||
o_counter
|
||||
files {
|
||||
...GalleryFileData
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ fragment GalleryData on Gallery {
|
|||
photographer
|
||||
rating100
|
||||
organized
|
||||
o_counter
|
||||
|
||||
paths {
|
||||
cover
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ const criterionOptions = [
|
|||
PerformerAgeCriterionOption,
|
||||
PerformerFavoriteCriterionOption,
|
||||
createMandatoryNumberCriterionOption("image_count"),
|
||||
createMandatoryNumberCriterionOption("o_counter", "o_count"),
|
||||
// StudioTagsCriterionOption,
|
||||
ScenesCriterionOption,
|
||||
StudiosCriterionOption,
|
||||
|
|
|
|||
Loading…
Reference in a new issue