mirror of
https://github.com/stashapp/stash.git
synced 2025-12-18 04:44:37 +03:00
* Restructure data layer part 2 (#2599) * Refactor and separate image model * Refactor image query builder * Handle relationships in image query builder * Remove relationship management methods * Refactor gallery model/query builder * Add scenes to gallery model * Convert scene model * Refactor scene models * Remove unused methods * Add unit tests for gallery * Add image tests * Add scene tests * Convert unnecessary scene value pointers to values * Convert unnecessary pointer values to values * Refactor scene partial * Add scene partial tests * Refactor ImagePartial * Add image partial tests * Refactor gallery partial update * Add partial gallery update tests * Use zero/null package for null values * Add files and scan system * Add sqlite implementation for files/folders * Add unit tests for files/folders * Image refactors * Update image data layer * Refactor gallery model and creation * Refactor scene model * Refactor scenes * Don't set title from filename * Allow galleries to freely add/remove images * Add multiple scene file support to graphql and UI * Add multiple file support for images in graphql/UI * Add multiple file for galleries in graphql/UI * Remove use of some deprecated fields * Remove scene path usage * Remove gallery path usage * Remove path from image * Move funscript to video file * Refactor caption detection * Migrate existing data * Add post commit/rollback hook system * Lint. Comment out import/export tests * Add WithDatabase read only wrapper * Prepend tasks to list * Add 32 pre-migration * Add warnings in release and migration notes
140 lines
3.0 KiB
Go
140 lines
3.0 KiB
Go
package exp
|
|
|
|
type (
|
|
joinExpression struct {
|
|
isConditioned bool
|
|
// The JoinType
|
|
joinType JoinType
|
|
// The table expressions (e.g. LEFT JOIN "my_table", ON (....))
|
|
table Expression
|
|
}
|
|
// Container for all joins within a dataset
|
|
conditionedJoin struct {
|
|
joinExpression
|
|
// The condition to join (e.g. USING("a", "b"), ON("my_table"."fkey" = "other_table"."id")
|
|
condition JoinCondition
|
|
}
|
|
JoinExpressions []JoinExpression
|
|
)
|
|
|
|
func NewUnConditionedJoinExpression(joinType JoinType, table Expression) JoinExpression {
|
|
return joinExpression{
|
|
joinType: joinType,
|
|
table: table,
|
|
isConditioned: false,
|
|
}
|
|
}
|
|
|
|
func (je joinExpression) Clone() Expression {
|
|
return je
|
|
}
|
|
|
|
func (je joinExpression) Expression() Expression {
|
|
return je
|
|
}
|
|
|
|
func (je joinExpression) IsConditioned() bool {
|
|
return je.isConditioned
|
|
}
|
|
|
|
func (je joinExpression) JoinType() JoinType {
|
|
return je.joinType
|
|
}
|
|
|
|
func (je joinExpression) Table() Expression {
|
|
return je.table
|
|
}
|
|
|
|
func NewConditionedJoinExpression(joinType JoinType, table Expression, condition JoinCondition) ConditionedJoinExpression {
|
|
return conditionedJoin{
|
|
joinExpression: joinExpression{
|
|
joinType: joinType,
|
|
table: table,
|
|
isConditioned: true,
|
|
},
|
|
condition: condition,
|
|
}
|
|
}
|
|
|
|
func (je conditionedJoin) Clone() Expression {
|
|
return je
|
|
}
|
|
|
|
func (je conditionedJoin) Expression() Expression {
|
|
return je
|
|
}
|
|
|
|
func (je conditionedJoin) Condition() JoinCondition {
|
|
return je.condition
|
|
}
|
|
|
|
func (je conditionedJoin) IsConditionEmpty() bool {
|
|
return je.condition == nil || je.condition.IsEmpty()
|
|
}
|
|
|
|
func (jes JoinExpressions) Clone() JoinExpressions {
|
|
ret := make(JoinExpressions, 0, len(jes))
|
|
for _, jc := range jes {
|
|
ret = append(ret, jc.Clone().(JoinExpression))
|
|
}
|
|
return ret
|
|
}
|
|
|
|
type (
|
|
JoinConditionType int
|
|
JoinCondition interface {
|
|
Type() JoinConditionType
|
|
IsEmpty() bool
|
|
}
|
|
JoinOnCondition interface {
|
|
JoinCondition
|
|
On() ExpressionList
|
|
}
|
|
JoinUsingCondition interface {
|
|
JoinCondition
|
|
Using() ColumnListExpression
|
|
}
|
|
joinOnCondition struct {
|
|
on ExpressionList
|
|
}
|
|
|
|
joinUsingCondition struct {
|
|
using ColumnListExpression
|
|
}
|
|
)
|
|
|
|
// Creates a new ON clause to be used within a join
|
|
// ds.Join(I("my_table"), On(I("my_table.fkey").Eq(I("other_table.id")))
|
|
func NewJoinOnCondition(expressions ...Expression) JoinCondition {
|
|
return joinOnCondition{on: NewExpressionList(AndType, expressions...)}
|
|
}
|
|
|
|
func (joc joinOnCondition) Type() JoinConditionType {
|
|
return OnJoinCondType
|
|
}
|
|
|
|
func (joc joinOnCondition) On() ExpressionList {
|
|
return joc.on
|
|
}
|
|
|
|
func (joc joinOnCondition) IsEmpty() bool {
|
|
return len(joc.on.Expressions()) == 0
|
|
}
|
|
|
|
// Creates a new USING clause to be used within a join
|
|
func NewJoinUsingCondition(expressions ...interface{}) JoinCondition {
|
|
return joinUsingCondition{using: NewColumnListExpression(expressions...)}
|
|
}
|
|
|
|
func (juc joinUsingCondition) Type() JoinConditionType {
|
|
return UsingJoinCondType
|
|
}
|
|
|
|
func (juc joinUsingCondition) Using() ColumnListExpression {
|
|
return juc.using
|
|
}
|
|
|
|
func (juc joinUsingCondition) IsEmpty() bool {
|
|
return len(juc.using.Columns()) == 0
|
|
}
|