private void defineTransformations() { MetaOverTwoRelation metaGroupDep = instOverTwoRelation.getMetaOverTwoRelation(); boolean targetActiveAttribute = false; if (instOverTwoRelation.getTargetRelations().size() > 0) // TODO support multiple targets targetActiveAttribute = (boolean) ((InstPairwiseRelation) instOverTwoRelation.getTargetRelations().get(0)) .getTargetRelations() .get(0) .getInstAttribute("Active") .getValue(); if (targetActiveAttribute && metaGroupDep != null) { relationType = (String) instOverTwoRelation .getInstAttribute(SemanticOverTwoRelation.VAR_RELATIONTYPE_IDEN) .getValue(); // System.out.println(relationType); for (String sourceName : instOverTwoRelation.getSourceAttributeNames()) { AbstractExpression abstractTransformation = null; Iterator<InstElement> instEdges1 = instOverTwoRelation.getSourceRelations().iterator(); AbstractExpression recursiveExpression1 = null; AbstractExpression recursiveExpression2 = null; if (instEdges1.hasNext()) { InstElement left1 = instEdges1.next(); while ((boolean) ((InstPairwiseRelation) left1) .getSourceRelations() .get(0) .getInstAttribute("Active") .getValue() == false) { if (instEdges1.hasNext()) left1 = instEdges1.next(); else return; } switch (relationType) { case "and": abstractTransformation = new AndBooleanExpression(); break; case "or": abstractTransformation = new OrBooleanExpression(); break; case "mutex": abstractTransformation = new SumNumericExpression(); break; case "range": abstractTransformation = new SumNumericExpression(); Iterator<InstElement> instEdges2 = instOverTwoRelation.getSourceRelations().iterator(); // instEdges2.next(); // TODO eliminate duplicated edges // from collection and remove this // line InstElement left2 = instEdges2.next(); Constructor<?> constructor3 = null, constructor4 = null; try { constructor3 = abstractTransformation .getClass() .getConstructor( InstElement.class, String.class, Boolean.TYPE, AbstractExpression.class); constructor4 = abstractTransformation .getClass() .getConstructor( InstElement.class, InstElement.class, String.class, String.class); } catch (NoSuchMethodException | SecurityException e) { e.printStackTrace(); } recursiveExpression2 = transformation(constructor3, constructor4, instEdges2, left2, sourceName); break; case "": return; default: return; } Constructor<?> constructor1 = null, constructor2 = null; try { constructor1 = abstractTransformation .getClass() .getConstructor( InstElement.class, String.class, Boolean.TYPE, AbstractExpression.class); constructor2 = abstractTransformation .getClass() .getConstructor( InstElement.class, InstElement.class, String.class, String.class); } catch (NoSuchMethodException | SecurityException e) { e.printStackTrace(); } switch (relationType) { case "and": // B_Satisfied #<=> ( ( A1_"attribute" #/\ // A2_"attribute" ) #/\ ... ) case "or": // B_Satisfied #<=> ( ( A1_"attribute" #\/ // A2_"attribute" ) #\/ ... ) recursiveExpression1 = transformation(constructor1, constructor2, instEdges1, left1, sourceName); getTransformations() .add( new DoubleImplicationBooleanExpression( instOverTwoRelation, sourceName, true, recursiveExpression1)); break; case "mutex": // B_Satisfied #<=> (( ( A1_"attribute" + A2_"attribute" // ) + ... ) #<=> 1) recursiveExpression1 = transformation(constructor1, constructor2, instEdges1, left1, sourceName); AbstractExpression transformation1 = new EqualsComparisonExpression( recursiveExpression1, new NumberNumericExpression(1)); getTransformations() .add( new DoubleImplicationBooleanExpression( instOverTwoRelation, sourceName, true, transformation1)); break; case "range": // B_"attribute" #<=> ( ( ( ( A1_"attribute" + // A2_"attribute" ) + ... ) #>= GD_LowCardinality) #/\ // ( ( ( A1_"attribute" + A2_"attribute" ) + ... ) #<= // GD_HighCardinality ) ) recursiveExpression1 = transformation(constructor1, constructor2, instEdges1, left1, sourceName); AbstractExpression transformation3 = new GreaterOrEqualsBooleanExpression( instOverTwoRelation, "lowCardinality", false, recursiveExpression1); AbstractExpression transformation4 = new LessOrEqualsBooleanExpression( instOverTwoRelation, "highCardinality", false, recursiveExpression2); AbstractExpression transformation5 = new AndBooleanExpression(transformation3, transformation4); getTransformations() .add( new DoubleImplicationBooleanExpression( instOverTwoRelation /* * .getTargetRelations * ().get(0) * .getToRelation() */, sourceName, true, transformation5)); break; default: return; } } } } }