Skip to content

Commit

Permalink
Merge pull request #476 from nodece/master
Browse files Browse the repository at this point in the history
fix: add cache for g function
  • Loading branch information
nodece committed Jun 4, 2020
2 parents 8cffd9a + c9fc2f0 commit d4c3ac8
Showing 1 changed file with 18 additions and 5 deletions.
23 changes: 18 additions & 5 deletions util/builtin_operators.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,19 +240,32 @@ func GlobMatchFunc(args ...interface{}) (interface{}, error) {

// GenerateGFunction is the factory method of the g(_, _) function.
func GenerateGFunction(rm rbac.RoleManager) govaluate.ExpressionFunction {
memorized := map[string]bool{}

return func(args ...interface{}) (interface{}, error) {
name1 := args[0].(string)
name2 := args[1].(string)

key := ""
for index := 0; index < len(args); index++ {
key += ";" + fmt.Sprintf("%v", args[index])
}

v, found := memorized[key]
if found {
return v, nil
}

if rm == nil {
return name1 == name2, nil
v = name1 == name2
} else if len(args) == 2 {
res, _ := rm.HasLink(name1, name2)
return res, nil
v, _ = rm.HasLink(name1, name2)
} else {
domain := args[2].(string)
res, _ := rm.HasLink(name1, name2, domain)
return res, nil
v, _ = rm.HasLink(name1, name2, domain)
}

memorized[key] = v
return v, nil
}
}

0 comments on commit d4c3ac8

Please sign in to comment.