mirror of
https://github.com/pocketbase/pocketbase.git
synced 2024-11-21 13:35:49 +02:00
71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package resolvers
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/pocketbase/dbx"
|
|
)
|
|
|
|
var _ dbx.Expression = (*multiMatchSubquery)(nil)
|
|
|
|
// join defines the specification for a single SQL JOIN clause.
|
|
type join struct {
|
|
tableName string
|
|
tableAlias string
|
|
on dbx.Expression
|
|
}
|
|
|
|
// multiMatchSubquery defines a record multi-match subquery expression.
|
|
type multiMatchSubquery struct {
|
|
baseTableAlias string
|
|
fromTableName string
|
|
fromTableAlias string
|
|
valueIdentifier string
|
|
joins []*join
|
|
params dbx.Params
|
|
}
|
|
|
|
// Build converts the expression into a SQL fragment.
|
|
//
|
|
// Implements [dbx.Expression] interface.
|
|
func (m *multiMatchSubquery) Build(db *dbx.DB, params dbx.Params) string {
|
|
if m.baseTableAlias == "" || m.fromTableName == "" || m.fromTableAlias == "" {
|
|
return "0=1"
|
|
}
|
|
|
|
if params == nil {
|
|
params = m.params
|
|
} else {
|
|
// merge by updating the parent params
|
|
for k, v := range m.params {
|
|
params[k] = v
|
|
}
|
|
}
|
|
|
|
var mergedJoins strings.Builder
|
|
for i, j := range m.joins {
|
|
if i > 0 {
|
|
mergedJoins.WriteString(" ")
|
|
}
|
|
mergedJoins.WriteString("LEFT JOIN ")
|
|
mergedJoins.WriteString(db.QuoteTableName(j.tableName))
|
|
mergedJoins.WriteString(" ")
|
|
mergedJoins.WriteString(db.QuoteTableName(j.tableAlias))
|
|
if j.on != nil {
|
|
mergedJoins.WriteString(" ON ")
|
|
mergedJoins.WriteString(j.on.Build(db, params))
|
|
}
|
|
}
|
|
|
|
return fmt.Sprintf(
|
|
`SELECT %s as [[multiMatchValue]] FROM %s %s %s WHERE %s = %s`,
|
|
db.QuoteColumnName(m.valueIdentifier),
|
|
db.QuoteTableName(m.fromTableName),
|
|
db.QuoteTableName(m.fromTableAlias),
|
|
mergedJoins.String(),
|
|
db.QuoteColumnName(m.fromTableAlias+".id"),
|
|
db.QuoteColumnName(m.baseTableAlias+".id"),
|
|
)
|
|
}
|