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 }