github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/scheduler/algorithm/resolver.go (about)

     1  package algorithm
     2  
     3  import (
     4  	"github.com/pf-qiu/concourse/v6/atc/db"
     5  )
     6  
     7  type NameToIDMap map[string]int
     8  
     9  type relatedInputConfigs struct {
    10  	passedJobs   map[int]bool
    11  	inputConfigs db.InputConfigs
    12  }
    13  
    14  func constructResolvers(
    15  	versions db.VersionsDB,
    16  	inputs db.InputConfigs,
    17  ) ([]Resolver, error) {
    18  	resolvers := []Resolver{}
    19  	inputConfigsWithPassed := db.InputConfigs{}
    20  	for _, input := range inputs {
    21  		if len(input.Passed) == 0 {
    22  			if input.PinnedVersion != nil {
    23  				resolvers = append(resolvers, NewPinnedResolver(versions, input))
    24  			} else {
    25  				resolvers = append(resolvers, NewIndividualResolver(versions, input))
    26  			}
    27  		} else {
    28  			inputConfigsWithPassed = append(inputConfigsWithPassed, input)
    29  		}
    30  	}
    31  
    32  	groupedInputConfigs := groupInputsConfigsByPassedJobs(inputConfigsWithPassed)
    33  
    34  	for _, group := range groupedInputConfigs {
    35  		resolvers = append(resolvers, NewGroupResolver(versions, group.inputConfigs))
    36  	}
    37  
    38  	return resolvers, nil
    39  }
    40  
    41  func groupInputsConfigsByPassedJobs(passedInputConfigs db.InputConfigs) []relatedInputConfigs {
    42  	groupedPassedInputConfigs := []relatedInputConfigs{}
    43  	for _, inputConfig := range passedInputConfigs {
    44  		var index int
    45  		var found bool
    46  
    47  		for passedJob, _ := range inputConfig.Passed {
    48  			for groupIndex, group := range groupedPassedInputConfigs {
    49  				if group.passedJobs[passedJob] {
    50  					found = true
    51  					index = groupIndex
    52  				}
    53  			}
    54  		}
    55  
    56  		if found {
    57  			groupedPassedInputConfigs[index].inputConfigs = append(groupedPassedInputConfigs[index].inputConfigs, inputConfig)
    58  
    59  			for inputPassedJob, _ := range inputConfig.Passed {
    60  				if !groupedPassedInputConfigs[index].passedJobs[inputPassedJob] {
    61  					groupedPassedInputConfigs[index].passedJobs[inputPassedJob] = true
    62  				}
    63  			}
    64  		} else {
    65  			passedJobs := map[int]bool{}
    66  			for jobID, _ := range inputConfig.Passed {
    67  				passedJobs[jobID] = true
    68  			}
    69  
    70  			groupedPassedInputConfigs = append(groupedPassedInputConfigs, relatedInputConfigs{
    71  				passedJobs:   passedJobs,
    72  				inputConfigs: db.InputConfigs{inputConfig},
    73  			})
    74  		}
    75  	}
    76  
    77  	return groupedPassedInputConfigs
    78  }