added details, deathdate, hair color, weight to performers and added details to studios (#1274)

* added details to performers and studios
* added deathdate, hair_color and weight to performers
* Simplify performer/studio create mutations
* Add changelog and recategorised

Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
This commit is contained in:
julien0221
2021-04-16 07:06:35 +01:00
committed by GitHub
parent cd6b6b74eb
commit d673c4ce03
62 changed files with 748 additions and 132 deletions

View File

@@ -4,7 +4,6 @@ import (
"database/sql"
"fmt"
"strconv"
"time"
"github.com/stashapp/stash/pkg/models"
)
@@ -209,7 +208,13 @@ func (qb *performerQueryBuilder) Query(performerFilter *models.PerformerFilterTy
}
if birthYear := performerFilter.BirthYear; birthYear != nil {
clauses, thisArgs := getBirthYearFilterClause(birthYear.Modifier, birthYear.Value)
clauses, thisArgs := getYearFilterClause(birthYear.Modifier, birthYear.Value, "birthdate")
query.addWhere(clauses...)
query.addArg(thisArgs...)
}
if deathYear := performerFilter.DeathYear; deathYear != nil {
clauses, thisArgs := getYearFilterClause(deathYear.Modifier, deathYear.Value, "death_date")
query.addWhere(clauses...)
query.addArg(thisArgs...)
}
@@ -254,6 +259,8 @@ func (qb *performerQueryBuilder) Query(performerFilter *models.PerformerFilterTy
query.handleStringCriterionInput(performerFilter.CareerLength, tableName+".career_length")
query.handleStringCriterionInput(performerFilter.Tattoos, tableName+".tattoos")
query.handleStringCriterionInput(performerFilter.Piercings, tableName+".piercings")
query.handleStringCriterionInput(performerFilter.HairColor, tableName+".hair_color")
query.handleStringCriterionInput(performerFilter.Weight, tableName+".weight")
query.handleStringCriterionInput(performerFilter.URL, tableName+".url")
// TODO - need better handling of aliases
@@ -294,7 +301,7 @@ func (qb *performerQueryBuilder) Query(performerFilter *models.PerformerFilterTy
return performers, countResult, nil
}
func getBirthYearFilterClause(criterionModifier models.CriterionModifier, value int) ([]string, []interface{}) {
func getYearFilterClause(criterionModifier models.CriterionModifier, value int, col string) ([]string, []interface{}) {
var clauses []string
var args []interface{}
@@ -306,22 +313,22 @@ func getBirthYearFilterClause(criterionModifier models.CriterionModifier, value
switch modifier {
case "EQUALS":
// between yyyy-01-01 and yyyy-12-31
clauses = append(clauses, "performers.birthdate >= ?")
clauses = append(clauses, "performers.birthdate <= ?")
clauses = append(clauses, "performers."+col+" >= ?")
clauses = append(clauses, "performers."+col+" <= ?")
args = append(args, startOfYear)
args = append(args, endOfYear)
case "NOT_EQUALS":
// outside of yyyy-01-01 to yyyy-12-31
clauses = append(clauses, "performers.birthdate < ? OR performers.birthdate > ?")
clauses = append(clauses, "performers."+col+" < ? OR performers."+col+" > ?")
args = append(args, startOfYear)
args = append(args, endOfYear)
case "GREATER_THAN":
// > yyyy-12-31
clauses = append(clauses, "performers.birthdate > ?")
clauses = append(clauses, "performers."+col+" > ?")
args = append(args, endOfYear)
case "LESS_THAN":
// < yyyy-01-01
clauses = append(clauses, "performers.birthdate < ?")
clauses = append(clauses, "performers."+col+" < ?")
args = append(args, startOfYear)
}
}
@@ -332,33 +339,23 @@ func getBirthYearFilterClause(criterionModifier models.CriterionModifier, value
func getAgeFilterClause(criterionModifier models.CriterionModifier, value int) ([]string, []interface{}) {
var clauses []string
var args []interface{}
var clause string
// get the date at which performer would turn the age specified
dt := time.Now()
birthDate := dt.AddDate(-value-1, 0, 0)
yearAfter := birthDate.AddDate(1, 0, 0)
if criterionModifier.IsValid() {
switch criterionModifier {
case models.CriterionModifierEquals:
clause = " == ?"
case models.CriterionModifierNotEquals:
clause = " != ?"
case models.CriterionModifierGreaterThan:
clause = " > ?"
case models.CriterionModifierLessThan:
clause = " < ?"
}
if modifier := criterionModifier.String(); criterionModifier.IsValid() {
switch modifier {
case "EQUALS":
// between birthDate and yearAfter
clauses = append(clauses, "performers.birthdate >= ?")
clauses = append(clauses, "performers.birthdate < ?")
args = append(args, birthDate)
args = append(args, yearAfter)
case "NOT_EQUALS":
// outside of birthDate and yearAfter
clauses = append(clauses, "performers.birthdate < ? OR performers.birthdate >= ?")
args = append(args, birthDate)
args = append(args, yearAfter)
case "GREATER_THAN":
// < birthDate
clauses = append(clauses, "performers.birthdate < ?")
args = append(args, birthDate)
case "LESS_THAN":
// > yearAfter
clauses = append(clauses, "performers.birthdate >= ?")
args = append(args, yearAfter)
if clause != "" {
clauses = append(clauses, "cast(IFNULL(strftime('%Y.%m%d', performers.death_date), strftime('%Y.%m%d', 'now')) - strftime('%Y.%m%d', performers.birthdate) as int)"+clause)
args = append(args, value)
}
}

View File

@@ -214,10 +214,16 @@ func verifyPerformerAge(t *testing.T, ageCriterion models.IntCriterionInput) {
now := time.Now()
for _, performer := range performers {
cd := now
if performer.DeathDate.Valid {
cd, _ = time.Parse("2006-01-02", performer.DeathDate.String)
}
bd := performer.Birthdate.String
d, _ := time.Parse("2006-01-02", bd)
age := now.Year() - d.Year()
if now.YearDay() < d.YearDay() {
age := cd.Year() - d.Year()
if cd.YearDay() < d.YearDay() {
age = age - 1
}

View File

@@ -558,10 +558,10 @@ func verifyInt(t *testing.T, value int, criterion models.IntCriterionInput) {
assert.NotEqual(criterion.Value, value)
}
if criterion.Modifier == models.CriterionModifierGreaterThan {
assert.True(value > criterion.Value)
assert.Greater(value, criterion.Value)
}
if criterion.Modifier == models.CriterionModifierLessThan {
assert.True(value < criterion.Value)
assert.Less(value, criterion.Value)
}
}

View File

@@ -657,6 +657,19 @@ func getPerformerBirthdate(index int) string {
return birthdate.Format("2006-01-02")
}
func getPerformerDeathDate(index int) models.SQLiteDate {
if index != 5 {
return models.SQLiteDate{}
}
deathDate := time.Now()
deathDate = deathDate.AddDate(-index+1, -1, -1)
return models.SQLiteDate{
String: deathDate.Format("2006-01-02"),
Valid: true,
}
}
func getPerformerCareerLength(index int) *string {
if index%5 == 0 {
return nil
@@ -691,6 +704,8 @@ func createPerformers(pqb models.PerformerReaderWriter, n int, o int) error {
String: getPerformerBirthdate(i),
Valid: true,
},
DeathDate: getPerformerDeathDate(i),
Details: sql.NullString{String: getPerformerStringValue(i, "Details"), Valid: true},
}
careerLength := getPerformerCareerLength(i)