concurrent preloads
This commit is contained in:
		
							parent
							
								
									3324ab2063
								
							
						
					
					
						commit
						9757e285ad
					
				@ -5,6 +5,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// preloadCallback used to preload associations
 | 
			
		||||
@ -16,7 +17,9 @@ func preloadCallback(scope *Scope) {
 | 
			
		||||
	var (
 | 
			
		||||
		preloadedMap = map[string]bool{}
 | 
			
		||||
		fields       = scope.Fields()
 | 
			
		||||
		wg           = &sync.WaitGroup{}
 | 
			
		||||
	)
 | 
			
		||||
	defer wg.Wait()
 | 
			
		||||
 | 
			
		||||
	for _, preload := range scope.Search.preload {
 | 
			
		||||
		var (
 | 
			
		||||
@ -45,16 +48,18 @@ func preloadCallback(scope *Scope) {
 | 
			
		||||
						continue
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					wg.Add(1)
 | 
			
		||||
					switch field.Relationship.Kind {
 | 
			
		||||
					case "has_one":
 | 
			
		||||
						currentScope.handleHasOnePreload(field, currentPreloadConditions)
 | 
			
		||||
						go currentScope.handleHasOnePreload(field, currentPreloadConditions, wg)
 | 
			
		||||
					case "has_many":
 | 
			
		||||
						currentScope.handleHasManyPreload(field, currentPreloadConditions)
 | 
			
		||||
						go currentScope.handleHasManyPreload(field, currentPreloadConditions, wg)
 | 
			
		||||
					case "belongs_to":
 | 
			
		||||
						currentScope.handleBelongsToPreload(field, currentPreloadConditions)
 | 
			
		||||
						go currentScope.handleBelongsToPreload(field, currentPreloadConditions, wg)
 | 
			
		||||
					case "many_to_many":
 | 
			
		||||
						currentScope.handleManyToManyPreload(field, currentPreloadConditions)
 | 
			
		||||
						go currentScope.handleManyToManyPreload(field, currentPreloadConditions, wg)
 | 
			
		||||
					default:
 | 
			
		||||
						wg.Done()
 | 
			
		||||
						scope.Err(errors.New("unsupported relation"))
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
@ -77,6 +82,7 @@ func preloadCallback(scope *Scope) {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (scope *Scope) generatePreloadDBWithConditions(conditions []interface{}) (*DB, []interface{}) {
 | 
			
		||||
@ -97,7 +103,8 @@ func (scope *Scope) generatePreloadDBWithConditions(conditions []interface{}) (*
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// handleHasOnePreload used to preload has one associations
 | 
			
		||||
func (scope *Scope) handleHasOnePreload(field *Field, conditions []interface{}) {
 | 
			
		||||
func (scope *Scope) handleHasOnePreload(field *Field, conditions []interface{}, wg *sync.WaitGroup) {
 | 
			
		||||
	defer wg.Done()
 | 
			
		||||
	relation := field.Relationship
 | 
			
		||||
 | 
			
		||||
	// get relations's primary keys
 | 
			
		||||
@ -146,7 +153,8 @@ func (scope *Scope) handleHasOnePreload(field *Field, conditions []interface{})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// handleHasManyPreload used to preload has many associations
 | 
			
		||||
func (scope *Scope) handleHasManyPreload(field *Field, conditions []interface{}) {
 | 
			
		||||
func (scope *Scope) handleHasManyPreload(field *Field, conditions []interface{}, wg *sync.WaitGroup) {
 | 
			
		||||
	defer wg.Done()
 | 
			
		||||
	relation := field.Relationship
 | 
			
		||||
 | 
			
		||||
	// get relations's primary keys
 | 
			
		||||
@ -197,7 +205,8 @@ func (scope *Scope) handleHasManyPreload(field *Field, conditions []interface{})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// handleBelongsToPreload used to preload belongs to associations
 | 
			
		||||
func (scope *Scope) handleBelongsToPreload(field *Field, conditions []interface{}) {
 | 
			
		||||
func (scope *Scope) handleBelongsToPreload(field *Field, conditions []interface{}, wg *sync.WaitGroup) {
 | 
			
		||||
	defer wg.Done()
 | 
			
		||||
	relation := field.Relationship
 | 
			
		||||
 | 
			
		||||
	// preload conditions
 | 
			
		||||
@ -236,7 +245,8 @@ func (scope *Scope) handleBelongsToPreload(field *Field, conditions []interface{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// handleManyToManyPreload used to preload many to many associations
 | 
			
		||||
func (scope *Scope) handleManyToManyPreload(field *Field, conditions []interface{}) {
 | 
			
		||||
func (scope *Scope) handleManyToManyPreload(field *Field, conditions []interface{}, wg *sync.WaitGroup) {
 | 
			
		||||
	defer wg.Done()
 | 
			
		||||
	var (
 | 
			
		||||
		relation         = field.Relationship
 | 
			
		||||
		joinTableHandler = relation.JoinTableHandler
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user