@@ -20,45 +20,58 @@ private AutomaticBrackets() {}
2020
2121 static Map <Class , Integer > expressionPrecedenceLookup ;
2222
23+ public final static int IFF_PRECEDENCE = 0 ;
24+ public final static int IMPLY_PRECEDENCE = 1 ;
25+ public final static int OR_PRECEDENCE = 2 ;
26+ public final static int AND_PRECEDENCE = 3 ;
27+ public final static int GEQ_LEQ_PRECEDENCE = 4 ;
28+ public final static int EQUATION_PRECEDENCE = 5 ;
29+ public final static int CONSTRAINT_UNARY_PRECEDENCE = 6 ;
30+
31+ public final static int ADD_SUB_PRECEDENCE = 0 ;
32+ public final static int MULT_DIV_PRECEDENCE = 1 ;
33+ public final static int UNARY_EXPRESSION_PRECEDENCE = 2 ;
34+
35+
2336 static {
2437 constraintprecedenceLookup = new HashMap <>();
2538
2639 // n-ary
27- constraintprecedenceLookup .put (EquivalenceConstraint .class , 0 );
28- constraintprecedenceLookup .put (ImplicationConstraint .class , 1 );
29- constraintprecedenceLookup .put (OrConstraint .class , 2 );
30- constraintprecedenceLookup .put (MultiOrConstraint .class , 2 );
31- constraintprecedenceLookup .put (AndConstraint .class , 3 );
32- constraintprecedenceLookup .put (GreaterEquationConstraint .class , 4 );
33- constraintprecedenceLookup .put (LowerEquationConstraint .class , 4 );
34- constraintprecedenceLookup .put (GreaterEqualsEquationConstraint .class , 4 );
35- constraintprecedenceLookup .put (LowerEqualsEquationConstraint .class , 4 );
36- constraintprecedenceLookup .put (NotEqualsEquationConstraint .class , 5 );
37- constraintprecedenceLookup .put (EqualEquationConstraint .class , 5 );
40+ constraintprecedenceLookup .put (EquivalenceConstraint .class , IFF_PRECEDENCE );
41+ constraintprecedenceLookup .put (ImplicationConstraint .class , IMPLY_PRECEDENCE );
42+ constraintprecedenceLookup .put (OrConstraint .class , OR_PRECEDENCE );
43+ constraintprecedenceLookup .put (MultiOrConstraint .class , OR_PRECEDENCE );
44+ constraintprecedenceLookup .put (AndConstraint .class , AND_PRECEDENCE );
45+ constraintprecedenceLookup .put (GreaterEquationConstraint .class , GEQ_LEQ_PRECEDENCE );
46+ constraintprecedenceLookup .put (LowerEquationConstraint .class , GEQ_LEQ_PRECEDENCE );
47+ constraintprecedenceLookup .put (GreaterEqualsEquationConstraint .class , GEQ_LEQ_PRECEDENCE );
48+ constraintprecedenceLookup .put (LowerEqualsEquationConstraint .class , GEQ_LEQ_PRECEDENCE );
49+ constraintprecedenceLookup .put (NotEqualsEquationConstraint .class , EQUATION_PRECEDENCE );
50+ constraintprecedenceLookup .put (EqualEquationConstraint .class , EQUATION_PRECEDENCE );
3851
3952 // Unary
40- constraintprecedenceLookup .put (LiteralConstraint .class , 6 );
41- constraintprecedenceLookup .put (NotConstraint .class , 6 );
42- constraintprecedenceLookup .put (ParenthesisConstraint .class , 6 );
53+ constraintprecedenceLookup .put (LiteralConstraint .class , CONSTRAINT_UNARY_PRECEDENCE );
54+ constraintprecedenceLookup .put (NotConstraint .class , CONSTRAINT_UNARY_PRECEDENCE );
55+ constraintprecedenceLookup .put (ParenthesisConstraint .class , CONSTRAINT_UNARY_PRECEDENCE );
4356
4457 expressionPrecedenceLookup = new HashMap <>();
4558
4659 // n-ary
47- expressionPrecedenceLookup .put (AddExpression .class , 0 );
48- expressionPrecedenceLookup .put (SubExpression .class , 0 );
49- expressionPrecedenceLookup .put (MulExpression .class , 1 );
50- expressionPrecedenceLookup .put (DivExpression .class , 1 );
60+ expressionPrecedenceLookup .put (AddExpression .class , ADD_SUB_PRECEDENCE );
61+ expressionPrecedenceLookup .put (SubExpression .class , ADD_SUB_PRECEDENCE );
62+ expressionPrecedenceLookup .put (MulExpression .class , MULT_DIV_PRECEDENCE );
63+ expressionPrecedenceLookup .put (DivExpression .class , MULT_DIV_PRECEDENCE );
5164
5265 // unary
53- expressionPrecedenceLookup .put (AvgAggregateFunctionExpression .class , 2 );
54- expressionPrecedenceLookup .put (MaxAggregateFunctionExpression .class , 2 );
55- expressionPrecedenceLookup .put (MinAggregateFunctionExpression .class , 2 );
56- expressionPrecedenceLookup .put (SumAggregateFunctionExpression .class , 2 );
57- expressionPrecedenceLookup .put (ParenthesisExpression .class , 2 );
58-
59- expressionPrecedenceLookup .put (LiteralExpression .class , 2 );
60- expressionPrecedenceLookup .put (NumberExpression .class , 2 );
61- expressionPrecedenceLookup .put (StringExpression .class , 2 );
66+ expressionPrecedenceLookup .put (AvgAggregateFunctionExpression .class , UNARY_EXPRESSION_PRECEDENCE );
67+ expressionPrecedenceLookup .put (MaxAggregateFunctionExpression .class , UNARY_EXPRESSION_PRECEDENCE );
68+ expressionPrecedenceLookup .put (MinAggregateFunctionExpression .class , UNARY_EXPRESSION_PRECEDENCE );
69+ expressionPrecedenceLookup .put (SumAggregateFunctionExpression .class , UNARY_EXPRESSION_PRECEDENCE );
70+ expressionPrecedenceLookup .put (ParenthesisExpression .class , UNARY_EXPRESSION_PRECEDENCE );
71+
72+ expressionPrecedenceLookup .put (LiteralExpression .class , UNARY_EXPRESSION_PRECEDENCE );
73+ expressionPrecedenceLookup .put (NumberExpression .class , UNARY_EXPRESSION_PRECEDENCE );
74+ expressionPrecedenceLookup .put (StringExpression .class , UNARY_EXPRESSION_PRECEDENCE );
6275 }
6376
6477 /**
@@ -75,7 +88,15 @@ private static boolean requiresBracketsInExpression(Expression parent, Expressio
7588 return expressionPrecedenceLookup .get (parent .getClass ()) >= expressionPrecedenceLookup .get (child .getClass ());
7689 }
7790
78-
91+ /**
92+ * Method can be used so that the printed versions of constraints are semantically equivalent to the internal object representation
93+ * @see de.vill.model.building.AutomaticBrackets for the precendences
94+ * @param parent
95+ * @param child
96+ * @param withSubmodels Consider imported submodels
97+ * @param currentAlias Check alias of submodel at hand
98+ * @return
99+ */
79100 public static String enforceConstraintBracketsIfNecessary (Constraint parent , Constraint child , boolean withSubmodels , String currentAlias ) {
80101 if (requiresBracketsInConstraint (parent , child )) {
81102 return "(" + child .toString (withSubmodels , currentAlias ) + ")" ;
0 commit comments