@@ -3353,7 +3353,7 @@ static public Expression simplify(final String op,
33533353 return Expression .simplifyStringExpression (op , arg );
33543354 }
33553355
3356- return arg ;
3356+ return new UnaryExpression ( op , arg ) ;
33573357 }
33583358
33593359 public static Expression simplifyStringExpression (String op ,
@@ -4163,8 +4163,10 @@ public static Expression simplifyPlus(
41634163 }
41644164
41654165 public static Expression simplifyMinus (Expression e1 , Expression e2 )
4166- { if (e1 == null ) { return simplifyUnaryMinus (e2 ); }
4167- if (e2 == null ) { return e1 ; }
4166+ { if (e1 == null )
4167+ { return simplifyUnaryMinus (e2 ); }
4168+ if (e2 == null )
4169+ { return e1 ; }
41684170
41694171 // also for strings
41704172
@@ -5731,10 +5733,21 @@ public static Expression simplifyAny(Expression src)
57315733 return uarg ;
57325734 }
57335735
5736+ if (src instanceof BasicExpression &&
5737+ ((BasicExpression ) src ).getData ().equals ("subrange" ) &&
5738+ "Integer" .equals (
5739+ ((BasicExpression ) src ).getObjectRef () + "" ))
5740+ { BasicExpression lcol = (BasicExpression ) src ;
5741+ Vector pars = lcol .getParameters ();
5742+ if (pars != null && pars .size () > 0 )
5743+ { return (Expression ) pars .get (0 ); }
5744+ }
5745+
57345746 if (src instanceof UnaryExpression )
57355747 { UnaryExpression uexpr = (UnaryExpression ) src ;
57365748 String uop = uexpr .getOperator ();
5737- if ("->asSet" .equals (uop ) || "->asSequence" .equals (uop ) ||
5749+ if ("->asSet" .equals (uop ) ||
5750+ "->asSequence" .equals (uop ) ||
57385751 "->oclAsSet" .equals (uop ) ||
57395752 "->oclAsSequence" .equals (uop ))
57405753 { System .err .println ("!! OES: Redundant operator " + uop + " in: " + src + "->any()" );
@@ -5794,6 +5807,39 @@ public static Expression simplifyReverse(Expression src)
57945807 return new UnaryExpression ("->reverse" , src );
57955808 }
57965809
5810+ public static Expression simplifySort (Expression src )
5811+ { // sq->reverse()->sort() is sq->sort()
5812+ // Integer.subrange(a,b)->sort() is Integer.subrange(a,b)
5813+ // sq->sort()->sort() is sq->sort()
5814+
5815+ if (src instanceof BasicExpression &&
5816+ ((BasicExpression ) src ).getData ().equals ("subrange" ) &&
5817+ "Integer" .equals (
5818+ ((BasicExpression ) src ).getObjectRef () + "" ))
5819+ { BasicExpression lcol = (BasicExpression ) src ;
5820+ System .err .println ("!! OES: Redundant operator ->sort() in: " + src + "->sort()" );
5821+ return lcol ;
5822+ }
5823+
5824+
5825+ if (src instanceof UnaryExpression )
5826+ { UnaryExpression usrc = (UnaryExpression ) src ;
5827+ String uop = usrc .getOperator ();
5828+
5829+ if ("->reverse" .equals (uop ) ||
5830+ "->sort" .equals (uop ) ||
5831+ "->asSequence" .equals (uop ) ||
5832+ "->oclAsSequence" .equals (uop ))
5833+ { Expression uarg = usrc .getArgument ();
5834+ System .err .println ("!! OES: Redundant operator " + uop + " in: " + src + "->sort()" );
5835+
5836+ return uarg ;
5837+ }
5838+ }
5839+
5840+ return new UnaryExpression ("->sort" , src );
5841+ }
5842+
57975843 public static Expression simplifyFront (Expression src )
57985844 { // sq->front()->front() is sq.subrange(1, sq->size()-2)
57995845 // sq->tail()->front() is sq.subrange(2,sq->size()-1)
@@ -6687,6 +6733,96 @@ else if (e instanceof BasicExpression)
66876733 return new UnaryExpression ("not" ,e );
66886734 } // and other cases
66896735
6736+ protected static Expression simplifyIsEmpty (
6737+ Expression re ,
6738+ Vector vars )
6739+ { if (re instanceof SetExpression )
6740+ { SetExpression rse = (SetExpression ) re ;
6741+
6742+ if (rse .isEmpty ())
6743+ { return new BasicExpression (true ); }
6744+
6745+ return new BasicExpression (false );
6746+ } // x : a \/ b as x : a or x : b etc?
6747+
6748+ if (re instanceof UnaryExpression )
6749+ { UnaryExpression ue = (UnaryExpression ) re ;
6750+ String uop = ue .getOperator ();
6751+ if ("->reverse" .equals (uop ) || "->sort" .equals (uop ) ||
6752+ "->asSet" .equals (uop ) || "->oclAsSet" .equals (uop ) ||
6753+ "->asSequence" .equals (uop ) ||
6754+ "->oclAsSequence" .equals (uop ))
6755+ { return simplifyIsEmpty (ue .getArgument (), vars ); }
6756+ }
6757+
6758+ if (re instanceof BinaryExpression )
6759+ { BinaryExpression ue = (BinaryExpression ) re ;
6760+ String uop = ue .getOperator ();
6761+
6762+ if ("->append" .equals (uop ) ||
6763+ "->including" .equals (uop ) ||
6764+ "->prepend" .equals (uop ))
6765+ { return new BasicExpression (false ); }
6766+
6767+ if ("->sortedBy" .equals (uop ) || "->collect" .equals (uop ))
6768+ { return simplifyIsEmpty (ue .getLeft (), vars ); }
6769+
6770+ if ("|sortedBy" .equals (uop ) ||
6771+ "|C" .equals (uop ))
6772+ { BinaryExpression arg =
6773+ (BinaryExpression ) ue .getLeft ();
6774+ return simplifyIsEmpty (arg .getRight (), vars );
6775+ }
6776+ }
6777+
6778+ return new UnaryExpression ("->isEmpty" ,re );
6779+ }
6780+
6781+ protected static Expression simplifyNotEmpty (
6782+ Expression re ,
6783+ Vector vars )
6784+ { if (re instanceof SetExpression )
6785+ { SetExpression rse = (SetExpression ) re ;
6786+
6787+ if (rse .isEmpty ())
6788+ { return new BasicExpression (false ); }
6789+
6790+ return new BasicExpression (true );
6791+ } // x : a \/ b as x : a or x : b etc?
6792+
6793+ if (re instanceof UnaryExpression )
6794+ { UnaryExpression ue = (UnaryExpression ) re ;
6795+ String uop = ue .getOperator ();
6796+ if ("->reverse" .equals (uop ) || "->sort" .equals (uop ) ||
6797+ "->asSet" .equals (uop ) || "->oclAsSet" .equals (uop ) ||
6798+ "->asSequence" .equals (uop ) ||
6799+ "->oclAsSequence" .equals (uop ))
6800+ { return simplifyNotEmpty (ue .getArgument (), vars ); }
6801+ }
6802+
6803+ if (re instanceof BinaryExpression )
6804+ { BinaryExpression ue = (BinaryExpression ) re ;
6805+ String uop = ue .getOperator ();
6806+
6807+ if ("->append" .equals (uop ) ||
6808+ "->including" .equals (uop ) ||
6809+ "->prepend" .equals (uop ))
6810+ { return new BasicExpression (true ); }
6811+
6812+ if ("->sortedBy" .equals (uop ) || "->collect" .equals (uop ))
6813+ { return simplifyNotEmpty (ue .getLeft (), vars ); }
6814+
6815+ if ("|sortedBy" .equals (uop ) ||
6816+ "|C" .equals (uop ))
6817+ { BinaryExpression arg =
6818+ (BinaryExpression ) ue .getLeft ();
6819+ return simplifyNotEmpty (arg .getRight (), vars );
6820+ }
6821+ }
6822+
6823+ return new UnaryExpression ("->notEmpty" ,re );
6824+ }
6825+
66906826 private static Expression simplifyIn (Expression le ,
66916827 Expression re ,
66926828 Vector vars )
@@ -6706,6 +6842,30 @@ private static Expression simplifyIn(Expression le,
67066842 return rse .includes (le );
67076843 } // x : a \/ b as x : a or x : b etc?
67086844
6845+ if (re instanceof UnaryExpression )
6846+ { UnaryExpression ue = (UnaryExpression ) re ;
6847+ String uop = ue .getOperator ();
6848+ if ("->reverse" .equals (uop ) || "->sort" .equals (uop ) ||
6849+ "->asSet" .equals (uop ) || "->oclAsSet" .equals (uop ) ||
6850+ "->asSequence" .equals (uop ) ||
6851+ "->oclAsSequence" .equals (uop ))
6852+ { return simplifyIn (le , ue .getArgument (), vars ); }
6853+ }
6854+
6855+ if (re instanceof BinaryExpression )
6856+ { BinaryExpression ue = (BinaryExpression ) re ;
6857+ String uop = ue .getOperator ();
6858+
6859+ if ("->sortedBy" .equals (uop ))
6860+ { return simplifyIn (le , ue .getLeft (), vars ); }
6861+
6862+ if ("|sortedBy" .equals (uop ))
6863+ { BinaryExpression arg =
6864+ (BinaryExpression ) ue .getLeft ();
6865+ return simplifyIn (le , arg .getRight (), vars );
6866+ }
6867+ }
6868+
67096869 return new BinaryExpression (":" ,le ,re );
67106870 }
67116871
@@ -6729,6 +6889,30 @@ private static Expression simplifyNotIn(Expression le,
67296889 return Expression .simplifyNot (isin );
67306890 }
67316891
6892+ if (re instanceof UnaryExpression )
6893+ { UnaryExpression ue = (UnaryExpression ) re ;
6894+ String uop = ue .getOperator ();
6895+ if ("->reverse" .equals (uop ) || "->sort" .equals (uop ) ||
6896+ "->asSet" .equals (uop ) || "->oclAsSet" .equals (uop ) ||
6897+ "->asSequence" .equals (uop ) ||
6898+ "->oclAsSequence" .equals (uop ))
6899+ { return simplifyNotIn (le , ue .getArgument (), vars ); }
6900+ }
6901+
6902+ if (re instanceof BinaryExpression )
6903+ { BinaryExpression ue = (BinaryExpression ) re ;
6904+ String uop = ue .getOperator ();
6905+
6906+ if ("->sortedBy" .equals (uop ))
6907+ { return simplifyNotIn (le , ue .getLeft (), vars ); }
6908+
6909+ if ("|sortedBy" .equals (uop ))
6910+ { BinaryExpression arg =
6911+ (BinaryExpression ) ue .getLeft ();
6912+ return simplifyNotIn (le , arg .getRight (), vars );
6913+ }
6914+ }
6915+
67326916 return new BinaryExpression ("/:" ,le ,re );
67336917 }
67346918
@@ -6750,6 +6934,30 @@ private static Expression simplifyIn(Expression le,
67506934 return rse .includes (le );
67516935 } // x : a \/ b as x : a or x : b etc?
67526936
6937+ if (re instanceof UnaryExpression )
6938+ { UnaryExpression ue = (UnaryExpression ) re ;
6939+ String uop = ue .getOperator ();
6940+ if ("->reverse" .equals (uop ) || "->sort" .equals (uop ) ||
6941+ "->asSet" .equals (uop ) || "->oclAsSet" .equals (uop ) ||
6942+ "->asSequence" .equals (uop ) ||
6943+ "->oclAsSequence" .equals (uop ))
6944+ { return simplifyIn (le , ue .getArgument ()); }
6945+ }
6946+
6947+ if (re instanceof BinaryExpression )
6948+ { BinaryExpression ue = (BinaryExpression ) re ;
6949+ String uop = ue .getOperator ();
6950+
6951+ if ("->sortedBy" .equals (uop ))
6952+ { return simplifyIn (le , ue .getLeft ()); }
6953+
6954+ if ("|sortedBy" .equals (uop ))
6955+ { BinaryExpression arg =
6956+ (BinaryExpression ) ue .getLeft ();
6957+ return simplifyIn (le , arg .getRight ());
6958+ }
6959+ }
6960+
67536961 return new BinaryExpression (":" ,le ,re );
67546962 }
67556963
0 commit comments