@@ -394,46 +394,78 @@ func FindIdentityParams(rids []ResourceIdentifier) []ResourceIdentifier {
394394 segmentsList [i ] = cleanSegments
395395 }
396396
397- if len (segmentsList [0 ]) == 0 {
398- return rids
397+ segmentsList = removeSharedElements (segmentsList )
398+
399+ for i , segments := range segmentsList {
400+ if len (segments ) == 0 {
401+ rids [i ].IdentityParam = ""
402+ } else {
403+ rids [i ].IdentityParam = segments [0 ]
404+ }
399405 }
400- expectedLength := len (segmentsList [0 ])
401406
402- for i := 1 ; i < len (segmentsList ); i ++ {
403- if len (segmentsList [i ]) != expectedLength {
404- return rids
407+ // Move the id with empty IdentityParam to the end of the list
408+ for i , ids := range rids {
409+ if ids .IdentityParam == "" {
410+ temp := ids
411+ lastIndex := len (rids ) - 1
412+ if i != lastIndex {
413+ rids [i ] = rids [lastIndex ]
414+ rids [lastIndex ] = temp
415+ }
416+ break
405417 }
406418 }
407419
408- varyingIndex := - 1
420+ return rids
421+ }
409422
410- for i := 0 ; i < expectedLength ; i ++ {
411- referenceSegment := segmentsList [0 ][i ]
412- isVarying := false
423+ // Finds elements common to ALL lists in a list of lists
424+ // and returns a new list of lists with those common elements removed.
425+ func removeSharedElements (list_of_lists [][]string ) [][]string {
426+ if len (list_of_lists ) <= 1 {
427+ return list_of_lists
428+ }
413429
414- for j := 1 ; j < len (segmentsList ); j ++ {
415- if segmentsList [j ][i ] != referenceSegment {
416- isVarying = true
417- break
418- }
430+ sharedSet := make (map [string ]bool )
431+ for _ , element := range list_of_lists [0 ] {
432+ sharedSet [element ] = true
433+ }
434+
435+ for i := 1 ; i < len (list_of_lists ); i ++ {
436+ currentListSet := make (map [string ]bool )
437+ for _ , element := range list_of_lists [i ] {
438+ currentListSet [element ] = true
419439 }
420440
421- if isVarying {
422- if varyingIndex != - 1 {
423- return rids
441+ newSharedSet := make (map [string ]bool )
442+
443+ for element := range sharedSet {
444+ if currentListSet [element ] {
445+ newSharedSet [element ] = true
424446 }
425- varyingIndex = i
447+ }
448+
449+ sharedSet = newSharedSet
450+
451+ if len (sharedSet ) == 0 {
452+ break
426453 }
427454 }
428455
429- if varyingIndex != - 1 {
430- for i , segments := range segmentsList {
431- rids [i ].IdentityParam = segments [varyingIndex ]
456+ var new_list_of_lists [][]string
457+
458+ for _ , sublist := range list_of_lists {
459+ var newSublist []string
460+ for _ , element := range sublist {
461+ if ! sharedSet [element ] {
462+ newSublist = append (newSublist , element )
463+ }
432464 }
433- return rids
465+ new_list_of_lists = append ( new_list_of_lists , newSublist )
434466 }
435467
436- return rids
468+ return new_list_of_lists
437469}
438470
439471type TgcWithProducts struct {
0 commit comments