Commit 665116fe authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ fixed ReductionMember constraint, #193

parent a7488154
Loading
Loading
Loading
Loading
Loading
+11 −12
Original line number Diff line number Diff line
@@ -290,18 +290,17 @@ context DataUse

  -- Members in 'reduction' list
  inv ReductionMembers ('The \'Member\' referenced by the \'MemberReference\' at index i of a \'reduction\' shall be contained in or inherited by the \'StructuredDataType\' of the \'Member\' referenced by the \'MemberReference\' at index (i - 1) of that \'reduction\' or the \'StructuredDataType\' of this \'DataUse\' if the \'MemberReference\' is the first element of the \'reduction\'.' + self.toString()):
        self.reduction->isEmpty()
              or self.reduction->reject(r | self.reduction->indexOf(r) = 1) 
              ->iterate(r; acc = Sequence{Sequence{self.resolveBaseDataType(), self.reduction->at(1)}} 
          	    | acc->including(Sequence{self.reduction->at(self.reduction->indexOf(r) - 1)->asSequence()
          		    ->reject(r|r.member.oclIsUndefined()).member.dataType->including(self.resolveBaseDataType())->at(1), r
          	    }))
              ->reject(tr | tr->at(1).oclIsUndefined() or tr->at(2).oclAsType(MemberReference).member.oclIsUndefined())
              ->iterate(tr; acc = Sequence{} | acc->including(Sequence{tr->at(1)->asSequence()
          	    ->select(t|t.oclIsKindOf(CollectionDataType)).oclAsType(CollectionDataType).itemType->including(tr->at(1))->at(1), tr->at(2) 
              }))
              ->forAll(tr | tr->at(1).oclAsType(StructuredDataType).allMembers()->includes(tr->at(2).oclAsType(MemberReference).member))
  
        self.reduction->forAll(mr | mr.member.oclIsUndefined() 
        	or self.reduction->indexOf(mr) = 1        	 
        	or (not self.reduction->at(self.reduction->indexOf(mr)-1).member.oclIsUndefined() 
        		and (let dataType = self.reduction->at(self.reduction->indexOf(mr)-1).member.dataType in 
        			((dataType.oclIsKindOf(StructuredDataType)
	        			and dataType.oclAsType(StructuredDataType).allMembers()->includes(mr.member))
	    			or (dataType.oclIsKindOf(CollectionDataType)
	    				and dataType.oclAsType(CollectionDataType).itemType.oclIsKindOf(StructuredDataType)
	    				and dataType.oclAsType(CollectionDataType).itemType.oclAsType(StructuredDataType).allMembers()->includes(mr.member)))))
			or (self.reduction->at(self.reduction->indexOf(mr)-1).member.oclIsUndefined())
        )  

  -- Collection index of first 'reduction'
  inv ReductionMembersCollection ('If the \'member\' is not specified for the first element of the \'reduction\' then the type of this \'DataUse\' shall be \'CollectionDataType\'.' + self.toString()):