@@ -38,32 +38,53 @@ func (r *ReleaseTargets) computeTargets(ctx context.Context) (map[string]*oapi.R
3838 _ , span := tracer .Start (ctx , "computeTargets" )
3939 defer span .End ()
4040
41- releaseTargets := make (map [string ]* oapi.ReleaseTarget , 1000 )
42-
4341 environments := r .store .Environments
4442 deployments := r .store .Deployments
4543
44+ // Index deployments by SystemId to avoid O(E*D) nested loop
45+ deploymentsBySystem := make (map [string ][]* oapi.Deployment )
46+ for depItem := range deployments .IterBuffered () {
47+ deployment := depItem .Val
48+ deploymentsBySystem [deployment .SystemId ] = append (deploymentsBySystem [deployment .SystemId ], deployment )
49+ }
50+
51+ // Pre-allocate based on a reasonable estimate
52+ releaseTargets := make (map [string ]* oapi.ReleaseTarget , 1000 )
53+
4654 for envItem := range environments .IterBuffered () {
4755 environment := envItem .Val
56+
57+ // Only process deployments in the same system
58+ systemDeployments , ok := deploymentsBySystem [environment .SystemId ]
59+ if ! ok {
60+ continue
61+ }
4862
49- for depItem := range deployments .IterBuffered () {
50- deployment := depItem .Val
63+ // Get environment resources once per environment
64+ envResources := environments .Resources (environment .Id )
65+ if len (envResources ) == 0 {
66+ continue
67+ }
5168
52- if environment .SystemId != deployment .SystemId {
69+ for _ , deployment := range systemDeployments {
70+ // Get deployment resources once per deployment
71+ depResources := deployments .Resources (deployment .Id )
72+ if len (depResources ) == 0 {
5373 continue
5474 }
5575
56- key := environment .Id + ":" + deployment .Id
57-
58- for _ , resource := range environments .Resources (environment .Id ) {
59- if ! deployments .HasResource (deployment .Id , resource .Id ) {
60- continue
61- }
62- releaseTargetId := key + ":" + resource .Id
63- releaseTargets [releaseTargetId ] = & oapi.ReleaseTarget {
64- EnvironmentId : environment .Id ,
65- DeploymentId : deployment .Id ,
66- ResourceId : resource .Id ,
76+ // Pre-compute the env:deployment key part
77+ keyPrefix := environment .Id + ":" + deployment .Id + ":"
78+
79+ // Find intersection of resources
80+ for resourceId := range envResources {
81+ if _ , hasResource := depResources [resourceId ]; hasResource {
82+ releaseTargetId := keyPrefix + resourceId
83+ releaseTargets [releaseTargetId ] = & oapi.ReleaseTarget {
84+ EnvironmentId : environment .Id ,
85+ DeploymentId : deployment .Id ,
86+ ResourceId : resourceId ,
87+ }
6788 }
6889 }
6990 }
0 commit comments