+ @Override\r
+ public void generateIterate(PlanContext context, CodeWriter w, long location, int boundMask, Variable[] variables,\r
+ Expression[] expressions) {\r
+ Environment env = context.context.environment;\r
+ switch(boundMask) {\r
+ case BF:\r
+ context.iterateList(location, w, variables[1],\r
+ w.apply(location,\r
+ env.getValue(GET_OBJECTS).getValue(),\r
+ expressions[0].toVal(env, w),\r
+ w.getModuleWriter().getExternalConstant(relation, Types.RESOURCE)));\r
+ break;\r
+ case FB:\r
+ if(inverseRelation == null)\r
+ throw new IllegalArgumentException();\r
+ context.iterateList(location, w, variables[0],\r
+ w.apply(location,\r
+ env.getValue(GET_OBJECTS).getValue(),\r
+ expressions[1].toVal(env, w),\r
+ w.getModuleWriter().getExternalConstant(inverseRelation, Types.RESOURCE)));\r
+ break;\r
+ case BB:\r
+ context.check(location, w, \r
+ inverseRelation == null || relationSelectivity <= inverseRelationSelectivity\r
+ ? w.apply(location, env.getValue(HAS_STATEMENT).getValue(), \r
+ expressions[0].toVal(env, w),\r
+ w.getModuleWriter().getExternalConstant(relation, Types.RESOURCE),\r
+ expressions[1].toVal(env, w))\r
+ : w.apply(location, env.getValue(HAS_STATEMENT).getValue(), \r
+ expressions[1].toVal(env, w),\r
+ w.getModuleWriter().getExternalConstant(inverseRelation, Types.RESOURCE),\r
+ expressions[0].toVal(env, w)));\r
+ break;\r
+ default: throw new IllegalArgumentException();\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void generateEnforce(PlanContext context, CodeWriter w, long location, Expression[] parameters) {\r
+ Environment env = context.context.environment;\r
+ w.apply(location,\r
+ env.getValue(CLAIM).getValue(),\r
+ parameters[0].toVal(env, w),\r
+ w.getModuleWriter().getExternalConstant(relation, Types.RESOURCE),\r
+ parameters[1].toVal(env, w));\r
+ }\r