Skip to content

Commit a334647

Browse files
authored
Merge pull request casbin#236 from seriouszyx/dev
fix: add cache for g function
2 parents 097efa5 + 5ec8f0c commit a334647

File tree

1 file changed

+44
-30
lines changed

1 file changed

+44
-30
lines changed

src/main/java/org/casbin/jcasbin/util/BuiltInFunctions.java

+44-30
Original file line numberDiff line numberDiff line change
@@ -345,58 +345,72 @@ public static AviatorFunction generateGFunction(String name, RoleManager rm) {
345345

346346
@Override
347347
public AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args) {
348+
Map<String, AviatorBoolean> memorized = new HashMap<>();
349+
348350
int len = args.length;
349351
if(len < 2){
350352
return AviatorBoolean.valueOf(false);
351353
}
354+
String key = "";
352355
Object name1Obj = FunctionUtils.getJavaObject(args[0], env);
353356
String name2 = FunctionUtils.getStringValue(args[1], env);
354357
Sequence name1List = null;
355358
String name1 = null;
356359
if (name1Obj instanceof java.util.List) {
357360
name1List = RuntimeUtils.seq(name1Obj,env);
361+
for (Object obj : name1List) {
362+
key += ";" + obj;
363+
}
364+
key += ";" + name2;
358365
}
359366
else{
360367
name1 = (String) name1Obj;
368+
key = ";" + name1 + ";" + name2;
361369
}
362370

363-
if (rm == null) {
364-
return AviatorBoolean.valueOf(name1.equals(name2));
371+
AviatorBoolean value = memorized.get(key);
372+
if (value != null) {
373+
return value;
365374
}
366-
switch (len){
367-
case 2:
368-
if (name1List!=null) {
369-
boolean res = false;
370-
for (Object obj : name1List) {
371-
if (rm.hasLink((String) obj, name2)){
372-
res = true;
373-
break;
374-
}
375+
376+
if (rm == null) {
377+
value = AviatorBoolean.valueOf(name1.equals(name2));
378+
} else if (len == 2) {
379+
if (name1List!=null) {
380+
boolean res = false;
381+
for (Object obj : name1List) {
382+
if (rm.hasLink((String) obj, name2)){
383+
res = true;
384+
break;
375385
}
376-
return AviatorBoolean.valueOf(res);
377386
}
378-
return AviatorBoolean.valueOf(rm.hasLink(name1, name2));
379-
case 3:
380-
String domain = FunctionUtils.getStringValue(args[2], env);
381-
return AviatorBoolean.valueOf(rm.hasLink(name1, name2, domain));
382-
case 4:
383-
String p_dom = FunctionUtils.getStringValue(args[3], env);
384-
Object domainObj = FunctionUtils.getJavaObject(args[2], env);
387+
value = AviatorBoolean.valueOf(res);
388+
}
389+
value = AviatorBoolean.valueOf(rm.hasLink(name1, name2));
390+
} else if (len == 3) {
391+
String domain = FunctionUtils.getStringValue(args[2], env);
392+
value = AviatorBoolean.valueOf(rm.hasLink(name1, name2, domain));
393+
} else if (len == 4) {
394+
String p_dom = FunctionUtils.getStringValue(args[3], env);
395+
Object domainObj = FunctionUtils.getJavaObject(args[2], env);
385396

386-
boolean res = false;
387-
if (domainObj instanceof java.util.List){
388-
Sequence domainSeq = RuntimeUtils.seq(domainObj,env);
389-
for (Object r_dom : domainSeq) {
390-
if (r_dom.equals(p_dom) && rm.hasLink(name1, name2, (String) r_dom)){
391-
res = true;
392-
break;
393-
}
397+
boolean res = false;
398+
if (domainObj instanceof java.util.List){
399+
Sequence domainSeq = RuntimeUtils.seq(domainObj,env);
400+
for (Object r_dom : domainSeq) {
401+
if (r_dom.equals(p_dom) && rm.hasLink(name1, name2, (String) r_dom)){
402+
res = true;
403+
break;
394404
}
395405
}
396-
return AviatorBoolean.valueOf(res);
397-
default:
398-
return AviatorBoolean.valueOf(false);
406+
}
407+
value = AviatorBoolean.valueOf(res);
408+
} else {
409+
value = AviatorBoolean.valueOf(false);
399410
}
411+
412+
memorized.put(key, value);
413+
return value;
400414
}
401415

402416
@Override

0 commit comments

Comments
 (0)