@@ -37,7 +37,7 @@ func (rg *DefinitionReachability) RelationsEncounteredForResource(
3737 ctx context.Context ,
3838 resourceType * core.RelationReference ,
3939) ([]* core.RelationReference , error ) {
40- _ , relationNames , err := rg .computeEntrypoints (ctx , resourceType , nil /* include all entrypoints */ , reachabilityFull , entrypointLookupFindAll )
40+ _ , relationNames , err := rg .computeEntrypoints (ctx , resourceType , nil , reachabilityFull /* include all entrypoints */ , entrypointLookupFindAll )
4141 if err != nil {
4242 return nil , err
4343 }
@@ -85,11 +85,12 @@ func (rg *DefinitionReachability) RelationsEncounteredForSubject(
8585 continue
8686 }
8787
88- encounteredRelations := map [string ]struct {}{}
88+ allEncounteredRelations := mapz .NewSet [string ]()
89+ encounteredRelationsForComputation := mapz .NewSet [string ]()
8990 err := nrg .collectEntrypoints (ctx , & core.RelationReference {
9091 Namespace : nsDef .Name ,
9192 Relation : relation .Name ,
92- }, subjectType , collected , encounteredRelations , reachabilityFull , entrypointLookupFindAll )
93+ }, subjectType , collected , allEncounteredRelations , encounteredRelationsForComputation , reachabilityFull , entrypointLookupFindAll )
9394 if err != nil {
9495 return nil , err
9596 }
@@ -193,10 +194,13 @@ func (rg *DefinitionReachability) computeEntrypoints(
193194 }
194195
195196 collected := & []ReachabilityEntrypoint {}
196- encounteredRelations := map [string ]struct {}{}
197- err := rg .collectEntrypoints (ctx , resourceType , optionalSubjectType , collected , encounteredRelations , reachabilityOption , entrypointLookupOption )
197+
198+ allEncounteredRelations := mapz .NewSet [string ]()
199+ encounteredRelationsForComputation := mapz .NewSet [string ]()
200+
201+ err := rg .collectEntrypoints (ctx , resourceType , optionalSubjectType , collected , allEncounteredRelations , encounteredRelationsForComputation , reachabilityOption , entrypointLookupOption )
198202 if err != nil {
199- return nil , slices . Collect ( maps . Keys ( encounteredRelations ) ), err
203+ return nil , allEncounteredRelations . AsSlice ( ), err
200204 }
201205
202206 collectedEntrypoints := * collected
@@ -213,7 +217,7 @@ func (rg *DefinitionReachability) computeEntrypoints(
213217 for _ , entrypoint := range collectedEntrypoints {
214218 hash , err := entrypoint .Hash ()
215219 if err != nil {
216- return nil , slices . Collect ( maps . Keys ( encounteredRelations ) ), err
220+ return nil , allEncounteredRelations . AsSlice ( ), err
217221 }
218222
219223 if _ , ok := entrypointMap [hash ]; ! ok {
@@ -222,7 +226,7 @@ func (rg *DefinitionReachability) computeEntrypoints(
222226 }
223227 }
224228
225- return uniqueEntrypoints , slices . Collect ( maps . Keys ( encounteredRelations ) ), nil
229+ return uniqueEntrypoints , allEncounteredRelations . AsSlice ( ), nil
226230}
227231
228232func (rg * DefinitionReachability ) getOrBuildGraph (ctx context.Context , resourceType * core.RelationReference , reachabilityOption reachabilityOption ) (* core.ReachabilityGraph , error ) {
@@ -253,17 +257,17 @@ func (rg *DefinitionReachability) collectEntrypoints(
253257 resourceType * core.RelationReference ,
254258 optionalSubjectType * core.RelationReference ,
255259 collected * []ReachabilityEntrypoint ,
256- encounteredRelations map [string ]struct {},
260+ allEncounteredRelations * mapz.Set [string ],
261+ encounteredRelationsForComputation * mapz.Set [string ],
257262 reachabilityOption reachabilityOption ,
258263 entrypointLookupOption entrypointLookupOption ,
259264) error {
260265 // Ensure that we only process each relation once.
261266 key := tuple .JoinRelRef (resourceType .Namespace , resourceType .Relation )
262- if _ , ok := encounteredRelations [ key ]; ok {
267+ if ! encounteredRelationsForComputation . Add ( key ) {
263268 return nil
264269 }
265-
266- encounteredRelations [key ] = struct {}{}
270+ allEncounteredRelations .Add (key )
267271
268272 rrg , err := rg .getOrBuildGraph (ctx , resourceType , reachabilityOption )
269273 if err != nil {
@@ -274,7 +278,7 @@ func (rg *DefinitionReachability) collectEntrypoints(
274278 // Add subject type entrypoints.
275279 subjectTypeEntrypoints , ok := rrg .EntrypointsBySubjectType [optionalSubjectType .Namespace ]
276280 if ok {
277- addEntrypoints (subjectTypeEntrypoints , resourceType , collected , encounteredRelations )
281+ addEntrypoints (subjectTypeEntrypoints , resourceType , collected , allEncounteredRelations , encounteredRelationsForComputation )
278282 }
279283
280284 if entrypointLookupOption == entrypointLookupFindOne && len (* collected ) > 0 {
@@ -284,7 +288,7 @@ func (rg *DefinitionReachability) collectEntrypoints(
284288 // Add subject relation entrypoints.
285289 subjectRelationEntrypoints , ok := rrg .EntrypointsBySubjectRelation [tuple .JoinRelRef (optionalSubjectType .Namespace , optionalSubjectType .Relation )]
286290 if ok {
287- addEntrypoints (subjectRelationEntrypoints , resourceType , collected , encounteredRelations )
291+ addEntrypoints (subjectRelationEntrypoints , resourceType , collected , allEncounteredRelations , encounteredRelationsForComputation )
288292 }
289293
290294 if entrypointLookupOption == entrypointLookupFindOne && len (* collected ) > 0 {
@@ -293,11 +297,11 @@ func (rg *DefinitionReachability) collectEntrypoints(
293297 } else {
294298 // Add all entrypoints.
295299 for _ , entrypoints := range rrg .EntrypointsBySubjectType {
296- addEntrypoints (entrypoints , resourceType , collected , encounteredRelations )
300+ addEntrypoints (entrypoints , resourceType , collected , allEncounteredRelations , encounteredRelationsForComputation )
297301 }
298302
299303 for _ , entrypoints := range rrg .EntrypointsBySubjectRelation {
300- addEntrypoints (entrypoints , resourceType , collected , encounteredRelations )
304+ addEntrypoints (entrypoints , resourceType , collected , allEncounteredRelations , encounteredRelationsForComputation )
301305 }
302306 }
303307
@@ -309,7 +313,7 @@ func (rg *DefinitionReachability) collectEntrypoints(
309313 for _ , entrypointSetKey := range keys {
310314 entrypointSet := rrg .EntrypointsBySubjectRelation [entrypointSetKey ]
311315 if entrypointSet .SubjectRelation != nil && entrypointSet .SubjectRelation .Relation != tuple .Ellipsis {
312- err := rg .collectEntrypoints (ctx , entrypointSet .SubjectRelation , optionalSubjectType , collected , encounteredRelations , reachabilityOption , entrypointLookupOption )
316+ err := rg .collectEntrypoints (ctx , entrypointSet .SubjectRelation , optionalSubjectType , collected , allEncounteredRelations , encounteredRelationsForComputation , reachabilityOption , entrypointLookupOption )
313317 if err != nil {
314318 return err
315319 }
@@ -323,13 +327,12 @@ func (rg *DefinitionReachability) collectEntrypoints(
323327 return nil
324328}
325329
326- func addEntrypoints (entrypoints * core.ReachabilityEntrypoints , parentRelation * core.RelationReference , collected * []ReachabilityEntrypoint , encounteredRelations map [string ]struct {} ) {
330+ func addEntrypoints (entrypoints * core.ReachabilityEntrypoints , parentRelation * core.RelationReference , collected * []ReachabilityEntrypoint , allEncounteredRelations * mapz. Set [string ], encounteredRelationsForComputation * mapz. Set [ string ] ) {
327331 for _ , entrypoint := range entrypoints .Entrypoints {
328332 if entrypoint .TuplesetRelation != "" {
329333 key := tuple .JoinRelRef (entrypoint .TargetRelation .Namespace , entrypoint .TuplesetRelation )
330- encounteredRelations [ key ] = struct {}{}
334+ allEncounteredRelations . Add ( key )
331335 }
332-
333336 * collected = append (* collected , ReachabilityEntrypoint {entrypoint , parentRelation })
334337 }
335338}
0 commit comments