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"),
 | 
						|
	)
 | 
						|
}
 |