Files
stash/vendor/github.com/doug-martin/goqu/v9/exp/join.go
WithoutPants 5495d72849 File storage rewrite (#2676)
* 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
2022-09-06 07:03:42 +00:00

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
}