X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.modeling%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Fscl%2FGraphPropertyRelation.java;h=a6009426f36d7422473128b5be520f90ae7eefbd;hb=b2c6aed4003ef264fb48eed9ac9f2d0f6c2d5b13;hp=d9803aedde5ef8e5c2198ed5ea75d6ab75c5f6cf;hpb=8561e498009a25473db94b0e667866aa79de90b1;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphPropertyRelation.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphPropertyRelation.java index d9803aedd..a6009426f 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphPropertyRelation.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphPropertyRelation.java @@ -15,6 +15,7 @@ import org.simantics.scl.compiler.elaboration.relations.SCLRelation; import org.simantics.scl.compiler.environment.Environment; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter; +import org.simantics.scl.compiler.types.TPred; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; @@ -26,7 +27,7 @@ public class GraphPropertyRelation implements SCLRelation { Type[] parameterTypes; private static final Type RESOURCE = Types.con("Simantics/DB", "Resource"); - + public GraphPropertyRelation(Resource propertyRelation, Type valueType) { this.propertyRelation = propertyRelation; this.valueType = valueType; @@ -37,7 +38,12 @@ public class GraphPropertyRelation implements SCLRelation { public TVar[] getTypeVariables() { return TVar.EMPTY_ARRAY; } - + + @Override + public TPred[] getTypeConstraints() { + return new TPred[] {Types.pred(Types.SERIALIZABLE, valueType)}; + } + @Override public Type[] getParameterTypes() { return parameterTypes; @@ -53,14 +59,14 @@ public class GraphPropertyRelation implements SCLRelation { default: throw new IllegalArgumentException(); } } - + @Override public int getRequiredVariablesMask() { return BF; } - + private static final Name POSSIBLE_RELATED_VALUE = Name.create("Simantics/DB", "possibleRelatedValue"); - + @Override public void generate(long location, QueryCompilationContext context, Type[] typeParameters, Variable[] parameters, int boundVariables) { @@ -78,8 +84,8 @@ public class GraphPropertyRelation implements SCLRelation { context.condition(new EApply( context.getCompilationContext().getConstant(Names.Builtin_equals, valueType), new Expression[] { - new EVariable(temp), - new EVariable(parameters[1]) + new EVariable(temp), + new EVariable(parameters[1]) } )); context.iterateMaybe(temp, possibleValue); @@ -91,7 +97,7 @@ public class GraphPropertyRelation implements SCLRelation { } private static final Name CLAIM_RELATED_VALUE = Name.create("Simantics/DB", "claimRelatedValue"); - + @Override public Expression generateEnforce(long location, EnforcingContext context, Type[] typeParameters, Variable[] parameters) { @@ -110,15 +116,40 @@ public class GraphPropertyRelation implements SCLRelation { public int getPhase() { return 0; } - + @Override - public void generateEnforce(PlanContext context, CodeWriter w, long location, Expression[] parameters) { - throw new UnsupportedOperationException(getClass().getSimpleName() + " does not support enforce."); + public void generateIterate(PlanContext context, CodeWriter w, long location, int boundMask, Variable[] variables, + Expression[] expressions, Expression[] typeConstraintEvidenceParameters) { + Environment env = context.context.environment; + switch(boundMask) { + case BF: + context.iterateMaybe(location, w, variables[1], + w.apply(location, + env.getValue(POSSIBLE_RELATED_VALUE).getValue().createSpecialization(valueType), + typeConstraintEvidenceParameters[0].toVal(env, w), + expressions[0].toVal(env, w), + w.getModuleWriter().getExternalConstant(propertyRelation, Types.RESOURCE))); + break; + case BB: + context.checkEqualsJust(location, w, expressions[1].toVal(env, w), + w.apply(location, + env.getValue(POSSIBLE_RELATED_VALUE).getValue().createSpecialization(valueType), + typeConstraintEvidenceParameters[0].toVal(env, w), + expressions[0].toVal(env, w), + w.getModuleWriter().getExternalConstant(propertyRelation, Types.RESOURCE))); + break; + default: throw new IllegalArgumentException(); + } } - + @Override - public void generateIterate(PlanContext context, CodeWriter w, long location, int boundMask, Variable[] variables, - Expression[] expressions) { - throw new UnsupportedOperationException(getClass().getSimpleName() + " does not support iterate."); + public void generateEnforce(PlanContext context, CodeWriter w, long location, Expression[] parameters, Expression[] typeConstraintEvidenceParameters) { + Environment env = context.context.environment; + w.apply(location, + env.getValue(CLAIM_RELATED_VALUE).getValue().createSpecialization(valueType), + typeConstraintEvidenceParameters[0].toVal(env, w), + parameters[0].toVal(env, w), + w.getModuleWriter().getExternalConstant(propertyRelation, Types.RESOURCE), + parameters[1].toVal(env, w)); } }