56ec36726b
This fixes #499, where a matrix strategy with only include keys ends up causing multiple builds. This bugs appears to have been introduced in #415, when extra include keys are added in the matrix strategy. The cause seems to be because the CartesianProduct function returns an item with empty keys, instead of return an empty set. Co-authored-by: Ed Tan <edtan@users.noreply.github.com>
54 lines
1 KiB
Go
54 lines
1 KiB
Go
package common
|
|
|
|
// CartesianProduct takes map of lists and returns list of unique tuples
|
|
func CartesianProduct(mapOfLists map[string][]interface{}) []map[string]interface{} {
|
|
listNames := make([]string, 0)
|
|
lists := make([][]interface{}, 0)
|
|
for k, v := range mapOfLists {
|
|
listNames = append(listNames, k)
|
|
lists = append(lists, v)
|
|
}
|
|
|
|
listCart := cartN(lists...)
|
|
|
|
rtn := make([]map[string]interface{}, 0)
|
|
for _, list := range listCart {
|
|
vMap := make(map[string]interface{})
|
|
for i, v := range list {
|
|
vMap[listNames[i]] = v
|
|
}
|
|
rtn = append(rtn, vMap)
|
|
}
|
|
return rtn
|
|
}
|
|
|
|
func cartN(a ...[]interface{}) [][]interface{} {
|
|
c := 1
|
|
for _, a := range a {
|
|
c *= len(a)
|
|
}
|
|
if c == 0 || len(a) == 0 {
|
|
return nil
|
|
}
|
|
p := make([][]interface{}, c)
|
|
b := make([]interface{}, c*len(a))
|
|
n := make([]int, len(a))
|
|
s := 0
|
|
for i := range p {
|
|
e := s + len(a)
|
|
pi := b[s:e]
|
|
p[i] = pi
|
|
s = e
|
|
for j, n := range n {
|
|
pi[j] = a[j][n]
|
|
}
|
|
for j := len(n) - 1; j >= 0; j-- {
|
|
n[j]++
|
|
if n[j] < len(a[j]) {
|
|
break
|
|
}
|
|
n[j] = 0
|
|
}
|
|
}
|
|
return p
|
|
}
|