This commit is contained in:
Slick Daddy 2026-05-05 13:22:32 +09:00 committed by GitHub
commit 22e6e7b78a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 81 additions and 0 deletions

View file

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

View file

@ -26,6 +26,7 @@ type Gallery {
scenes: [Scene!]!
studio: Studio
image_count: Int!
o_counter: Int # Resolver
tags: [Tag!]!
performers: [Performer!]!

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -8,6 +8,7 @@ fragment SlimGalleryData on Gallery {
photographer
rating100
organized
o_counter
files {
...GalleryFileData
}

View file

@ -10,6 +10,7 @@ fragment GalleryData on Gallery {
photographer
rating100
organized
o_counter
paths {
cover

View file

@ -69,6 +69,7 @@ const criterionOptions = [
PerformerAgeCriterionOption,
PerformerFavoriteCriterionOption,
createMandatoryNumberCriterionOption("image_count"),
createMandatoryNumberCriterionOption("o_counter", "o_count"),
// StudioTagsCriterionOption,
ScenesCriterionOption,
StudiosCriterionOption,