blob: db3c08fc97c7675e355ee45ce98e34af80fcdeea [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="dataaccess"
nsURI="http://eclipse.org/ocl/examples/impactanalyzer/testmodel/ngpm/dataaccess.ecore"
nsPrefix="dataaccess">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="invocationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="validationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="settingDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
</eAnnotations>
<eSubpackages name="expressions" nsURI="http://eclipse.org/ocl/examples/impactanalyzer/testmodel/ngpm/dataaccess/expressions.ecore"
nsPrefix="dataaccess.expressions">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="invocationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="validationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="settingDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Specifies an expression language that allows its users for form expressions over objects and values, producing other objects and values."/>
</eAnnotations>
<eClassifiers xsi:type="ecore:EClass" name="Expression" abstract="true" eSuperTypes="data.ecore#//classes/TypedElement data.ecore#//classes/InScope">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="An expression that evaluates to an object."/>
</eAnnotations>
<eOperations name="isSideEffectFree" ordered="false" unique="false" lowerBound="1"
eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EBoolean">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="let parametersAndSignatureAreSideEffectFree:Boolean =&#xA; self.oclIsKindOf(SignatureCallExpression) implies&#xA; (self.oclAsType(SignatureCallExpression).parameters->forAll(p|p.isSideEffectFree())&#xA; and self.oclAsType(SignatureCallExpression).getSignature().sideEffectFree)&#xA; in&#xA; if self.oclIsKindOf(ObjectBasedExpression) then&#xA; self.oclAsType(ObjectBasedExpression).object.isSideEffectFree() and&#xA; if self.oclIsKindOf(SignatureCallExpression) then&#xA; parametersAndSignatureAreSideEffectFree&#xA; else&#xA; if self.oclIsKindOf(Replace) then&#xA; self.oclAsType(Replace).with.isSideEffectFree()&#xA; else&#xA; if self.oclIsKindOf(ExpressionWithArgument) and self.oclAsType(ExpressionWithArgument).argument->notEmpty() then&#xA; self.oclAsType(ExpressionWithArgument).argument.isSideEffectFree()&#xA; else&#xA; true&#xA; endif&#xA; endif&#xA; endif&#xA; else if self.oclIsKindOf(FunctionCallExpression) then&#xA; parametersAndSignatureAreSideEffectFree and self.oclAsType(FunctionCallExpression).calledBlock.isSideEffectFree()&#xA; else if self.oclIsKindOf(Equals) then&#xA; self.oclAsType(Equals).left.isSideEffectFree() and self.oclAsType(Equals).right.isSideEffectFree()&#xA; else if self.oclIsKindOf(ObjectCreationExpression) then&#xA; self.oclAsType(ObjectCreationExpression).classToInstantiate.valueType&#xA; else if self.oclIsKindOf(dataaccess::analytics::DimensionExpression) then&#xA; self.oclAsType(dataaccess::analytics::DimensionExpression).dimensionParameter.ownerSignature.sideEffectFree&#xA; else if self.oclIsKindOf(Ternary) then&#xA; self.oclAsType(Ternary).condition.isSideEffectFree() and&#xA; self.oclAsType(Ternary).trueExpr.isSideEffectFree() and&#xA; self.oclAsType(Ternary).falseExpr.isSideEffectFree()&#xA; else if self.oclIsKindOf(dataaccess::expressions::collectionexpressions::CollectionExpression) then&#xA; self.oclAsType(dataaccess::expressions::collectionexpressions::CollectionExpression).source.isSideEffectFree() and&#xA; if self.oclIsKindOf(dataaccess::expressions::collectionexpressions::Iterate) then&#xA; (self.oclAsType(dataaccess::expressions::collectionexpressions::Iterate).accumulator.initExpression->notEmpty() implies&#xA; self.oclAsType(dataaccess::expressions::collectionexpressions::Iterate).accumulator.initExpression.isSideEffectFree()) and&#xA; self.oclAsType(dataaccess::expressions::collectionexpressions::Iterate).iteratorExpression.isSideEffectFree()&#xA; else&#xA; true&#xA; endif&#xA; else if self.oclIsKindOf(dataaccess::expressions::literals::ObjectLiteral) then&#xA; self.oclAsType(dataaccess::expressions::literals::ObjectLiteral).propertyValues.value->forAll(v|v.isSideEffectFree())&#xA; else if self.oclIsKindOf(persistence::expressions::All) or self.oclIsKindOf(Replace) or self.oclIsKindOf(This) or self.oclIsKindOf(VariableExpression) or&#xA; self.oclIsKindOf(dataaccess::expressions::literals::Literal) or self.oclIsKindOf(dataaccess::expressions::fp::AnonymousFunctionExpr) then&#xA; true&#xA; else if self.oclIsKindOf(dataaccess::query::Selection) then&#xA; self.oclAsType(dataaccess::query::Selection).object.isSideEffectFree()&#xA; else&#xA; false&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Tells if this expression is side effect-free. An expression has a side effect if it invokes a method or a function that is not described as side effect-free. It is important to note that this has to be checked recursively for nested expressions."/>
</eAnnotations>
</eOperations>
<eOperations name="evaluatesToEqualAs" ordered="false" unique="false" lowerBound="1"
eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EBoolean">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="if self=e then&#xA; true&#xA; else&#xA; if self.oclIsKindOf(dataaccess::expressions::literals::NumberLiteral) and e.oclIsKindOf(dataaccess::expressions::literals::NumberLiteral) then&#xA; self.oclAsType(dataaccess::expressions::literals::NumberLiteral).literal=e.oclAsType(dataaccess::expressions::literals::NumberLiteral).literal&#xA; else&#xA; if self.oclIsKindOf(dataaccess::expressions::literals::StringLiteral) and e.oclIsKindOf(dataaccess::expressions::literals::StringLiteral) then&#xA; self.oclAsType(dataaccess::expressions::literals::StringLiteral).literal=e.oclAsType(dataaccess::expressions::literals::StringLiteral).literal&#xA; else&#xA; if self.oclIsKindOf(dataaccess::expressions::literals::ObjectLiteral) and e.oclIsKindOf(dataaccess::expressions::literals::ObjectLiteral) then&#xA; self.oclAsType(dataaccess::expressions::literals::ObjectLiteral).isEqualTo(e.oclAsType(dataaccess::expressions::literals::ObjectLiteral))&#xA; else&#xA; if self.oclIsKindOf(VariableExpression) and e.oclIsKindOf(VariableExpression) then&#xA; self.oclAsType(VariableExpression).variable = e.oclAsType(VariableExpression).variable&#xA; else&#xA; false&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="A conservative estimation that returns true if provably this and the passed expression will evaluate to equal objects. false means that the two expressions may evaluate to different results, not excluding that they can still have equal results; it's just not (yet) provable here."/>
</eAnnotations>
<eParameters name="e" ordered="false" unique="false" lowerBound="1" eType="#//expressions/Expression"/>
</eOperations>
<eOperations name="getUsedAliases" ordered="false" upperBound="-1" eType="ecore:EClass behavioral.ecore#//actions/Iterator">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="if self.oclIsKindOf(VariableExpression) then&#xA; if self.oclAsType(VariableExpression).variable.oclIsKindOf(behavioral::actions::Iterator) then&#xA; self.oclAsType(VariableExpression).variable.oclAsType(behavioral::actions::Iterator)->select(i | i.fromClause->notEmpty())->asSet()&#xA; else&#xA; Set{}&#xA; endif&#xA; else&#xA; if self.oclIsKindOf(Replace) then&#xA; self.oclAsType(Replace).object.getUsedAliases()->union(&#xA; self.oclAsType(Replace).steps.filterFunction.getUsedAliases()->flatten()->asSet())->union(&#xA; self.oclAsType(Replace).with.getUsedAliases())&#xA; else&#xA; if self.oclIsKindOf(dataaccess::query::Selection) then&#xA; self.oclAsType(dataaccess::query::Selection).object.getUsedAliases()->union(&#xA; self.oclAsType(dataaccess::query::Selection).selectionExpr.getUsedAliases())&#xA; else&#xA; if self.oclIsKindOf(ObjectBasedExpression) then&#xA; let objectAliases:Set(behavioral::actions::Iterator) = self.oclAsType(ObjectBasedExpression).object.getUsedAliases() in&#xA; if self.oclIsKindOf(MethodCallExpression) then&#xA; objectAliases->union(self.oclAsType(MethodCallExpression).parameters.getUsedAliases()->flatten()->asSet())&#xA; else&#xA; objectAliases&#xA; endif&#xA; else&#xA; if self.oclIsKindOf(Equals) then&#xA; self.oclAsType(Equals).left.getUsedAliases()->union(self.oclAsType(Equals).right.getUsedAliases())&#xA; else&#xA; if self.oclIsKindOf(FunctionCallExpression) then&#xA; self.oclAsType(FunctionCallExpression).calledBlock.getUsedAliases()->union(&#xA; self.oclAsType(FunctionCallExpression).parameters.getUsedAliases()->flatten()->asSet())&#xA; else&#xA; if self.oclIsKindOf(Ternary) then&#xA; let sat:Ternary = self.oclAsType(Ternary) in&#xA; sat.condition.getUsedAliases()->union(sat.trueExpr.getUsedAliases())->union(sat.falseExpr.getUsedAliases())&#xA; else&#xA; if self.oclIsKindOf(dataaccess::expressions::collectionexpressions::CollectionExpressionWithArgument) then&#xA; self.oclAsType(dataaccess::expressions::collectionexpressions::CollectionExpressionWithArgument).argument.getUsedAliases()->union(&#xA; self.oclAsType(dataaccess::expressions::collectionexpressions::CollectionExpressionWithArgument).source.getUsedAliases())&#xA; else&#xA; if self.oclIsKindOf(dataaccess::expressions::collectionexpressions::Iterate) then&#xA; self.oclAsType(dataaccess::expressions::collectionexpressions::Iterate).iteratorExpression.getUsedAliases()->union(&#xA; self.oclAsType(dataaccess::expressions::collectionexpressions::Iterate).accumulator.initExpression.getUsedAliases())->union(&#xA; self.oclAsType(dataaccess::expressions::collectionexpressions::Iterate).source.getUsedAliases())&#xA; else&#xA; if self.oclIsKindOf(dataaccess::query::OqlQuery) then&#xA; self.oclAsType(dataaccess::query::OqlQuery).fromClauses.fromExpression.getUsedAliases()->flatten()->asSet()->union(&#xA; self.oclAsType(dataaccess::query::OqlQuery).condition.getUsedAliases())&#xA; else&#xA; Set{}&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Computes the Iterator objects that are defined by a FromClause of an OqlQuery and that are used in a VariableExpression somewhere inside this expression. Needs to handle all side effect-free expression types. By the current definition, this excludes, e.g., ObjectCreationExpression and therefore its initializers method call expressions."/>
</eAnnotations>
</eOperations>
<eOperations name="getNamedValuesInScope" ordered="false" upperBound="-1" eType="ecore:EClass data.ecore#//classes/NamedValue">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="self.addNamedValuesWithNewNames(&#xA;&#xA; -- First, collect those NamedValues defined immediately for this expression:&#xA; -- an iterate's body expression sees the iterators and the accumulator&#xA; let accumulator:Set(data::classes::NamedValue)=self.inIterator.accumulator->asSet() in&#xA; let iterators:Set(data::classes::NamedValue)=self.inIterator.iterators->asSet() in&#xA; -- an OQL &quot;from&quot; clause sees all aliases left of it&#xA; let oqlAliases:Set(data::classes::NamedValue)=(if self.fromClause->notEmpty() then&#xA; let fromClauses:OrderedSet(dataaccess::query::FromClause) = self.fromClause.fromClauseOfOqlQuery.fromClauses in&#xA; let fcIndex:Integer = fromClauses->indexOf(self.fromClause) in&#xA; Sequence{1..-1+fcIndex}->collect(i | fromClauses->at(i).alias)->asSet()&#xA; else&#xA; Set{}&#xA; endif)->union(&#xA; -- an OQL &quot;where&quot; clause sees all aliases defined by any of the OQL expression's &quot;from&quot; entries&#xA; self.conditionOfOqlQuery.fromClauses.alias->asSet()) in&#xA; -- a Selection defines an implicit iterator for its filter expression&#xA; let selectionIterator:Set(data::classes::NamedValue)=self.selection.iterator->asSet() in&#xA; -- a GroupBy's mapExpression sees all dimension iterators and the groupedFacts iterator&#xA; let groupByMapExpressionIterators:Set(data::classes::NamedValue)=self.mapExpressionOfGroupBy.groupedFacts->asSet()->union(&#xA; self.mapExpressionOfGroupBy.dimensions.iterator->asSet()) in&#xA; -- a GroupBy's dimension expression sees the facts iterator&#xA; let groupByDimensionFactIterator:Set(data::classes::NamedValue)=self.dimension.groupBy.fact->asSet() in&#xA;&#xA; accumulator->union(iterators)->union(oqlAliases)->union(selectionIterator)->union(groupByMapExpressionIterators)->&#xA; union(groupByDimensionFactIterator),&#xA;&#xA; -- Then, add those defined by owning structures such as owning statements or owning expressions&#xA; -- an expression that is used by an ExpressionStatement or as condition in a Conditional sees all named values that the statement sees&#xA; if self.actualObjectParameter.owningClassTypeDefinition->notEmpty() then&#xA; self.actualObjectParameter.owningClassTypeDefinition.getNamedValuesInScope()&#xA; else&#xA; if self.initExpressionFor.namedValueDeclaration->notEmpty() then&#xA; self.initExpressionFor.namedValueDeclaration.getNamedValuesInScope()&#xA; else&#xA; if self.expressionStatement->notEmpty() then&#xA; self.expressionStatement.getNamedValuesInScope()&#xA; else&#xA; if self.conditional->notEmpty() then&#xA; if self.conditional.oclIsKindOf(behavioral::actions::ConditionalStatement) then&#xA; self.conditional.oclAsType(behavioral::actions::ConditionalStatement).getNamedValuesInScope()&#xA; else&#xA; self.conditional.oclAsType(ConditionalExpression).getNamedValuesInScope()&#xA; endif&#xA; else&#xA; if self.argumentOf->notEmpty() and self.argumentOf.oclIsKindOf(behavioral::actions::StatementWithArgument) then&#xA; self.argumentOf.oclAsType(behavioral::actions::StatementWithArgument).getNamedValuesInScope()&#xA; else&#xA; -- add all variables in scope for owning expressions&#xA; let oe:Expression = self.getOwningExpression() in&#xA; if oe->isEmpty() then&#xA; Set{}&#xA; else&#xA; oe.getNamedValuesInScope()&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; )"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
</eOperations>
<eOperations name="getOwningExpression" ordered="false" unique="false" eType="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="let objectBasedExpressions:Set(Expression)=self.objectBasedExpression->asSet() in&#xA; let argumentsOf:Set(Expression)=self.argumentOf->select(ao | ao.oclIsKindOf(Expression)).oclAsType(ExpressionWithArgument)->asSet() in&#xA; let equals:Set(Expression)=self.leftOfEquals->asSet()->union(self.rightOfEquals->asSet()) in&#xA; let blocksOfFunctionCallExpression:Set(Expression)=self.blockOfFunctionCallExpression->asSet() in&#xA; let signatureCalls:Set(Expression)=self.usedAsArgumentInSignatureCall->asSet() in&#xA; let creationExpression:Set(Expression)=if self.oclIsKindOf(MethodCallExpression) then&#xA; self.oclAsType(MethodCallExpression).creationExpression->asSet()&#xA; else&#xA; Set{}&#xA; endif in&#xA; let ternary:Set(Expression)=self.trueOfTernary->asSet()->union(self.falseOfTernary->asSet()) in&#xA; let conditional:Set(Expression)=if self.conditional->notEmpty() and self.conditional.oclIsKindOf(ConditionalExpression) then&#xA; self.conditional.oclAsType(ConditionalExpression)->asSet()&#xA; else&#xA; Set{}&#xA; endif in&#xA; let replace:Set(Expression)=self.withOfReplace->asSet()->union(self.navigationStep.replace->asSet()) in&#xA; let oqlQuery:Set(Expression)=self.conditionOfOqlQuery->asSet()->union(self.fromClause.fromClauseOfOqlQuery->asSet()) in&#xA; let selection:Set(Expression)=self.selection->asSet() in&#xA; let objectLiteral:Set(Expression)=self.valueInit.objectLiteral->asSet() in&#xA; let iterator:Set(Expression)=self.inIterator->asSet() in&#xA; let collectionExpression:Set(Expression)=self.collectionExpression->asSet() in&#xA; let all:Set(Expression)=self.all->asSet() in&#xA; let valueInitInObjectLiteral:Set(Expression)=self.valueInit.objectLiteral->asSet() in&#xA; let dimensionExpression:Set(Expression)=self.cellSetOfDimensionExpression->asSet()->union(&#xA; self.factsOfDimensionExpression->asSet()) in&#xA; let groupByExpression:Set(Expression)=self.dimension.groupBy->asSet()->union(&#xA; self.mapExpressionOfGroupBy->asSet()) in&#xA;&#xA; objectBasedExpressions->union(argumentsOf)->union(equals)->union(blocksOfFunctionCallExpression)->union(&#xA; signatureCalls)->union(creationExpression)->union(ternary)->union(conditional)->union(replace)->union(&#xA; oqlQuery)->union(selection)->union(objectLiteral)->union(iterator)->union(collectionExpression)->union(&#xA; all)->union(valueInitInObjectLiteral)->union(dimensionExpression)->union(groupByExpression)->any(true)"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="If this expression is composed by another expression, determines the composing expression. Otherwise, an empty result is returned.&#xD;&#xA;&#xD;&#xA;The issue with this operation is that each time a new inbound composite relatioship is added to Expression, this operation needs to be extended accordingly."/>
</eAnnotations>
</eOperations>
<eOperations name="getOwningClass" ordered="false" unique="false" eType="ecore:EClass data.ecore#//classes/SapClass">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="let oe:Expression = self.getOwningExpression() in&#xA; if oe->notEmpty() then&#xA; oe.getOwningClass()&#xA; else&#xA; if self.expressionStatement->notEmpty() then&#xA; self.expressionStatement.getOwningClass()&#xA; else&#xA; if self.conditional->notEmpty() and self.conditional.oclIsKindOf(behavioral::actions::Statement) then&#xA; self.conditional.oclAsType(behavioral::actions::ConditionalStatement).getOwningClass()&#xA; else&#xA; if self.argumentOf->notEmpty() and self.argumentOf.oclIsKindOf(behavioral::actions::StatementWithArgument) then&#xA; self.argumentOf.oclAsType(behavioral::actions::StatementWithArgument).getOwningClass()&#xA; else&#xA; if self.initExpressionFor.namedValueDeclaration->notEmpty() then&#xA; self.initExpressionFor.namedValueDeclaration.getOwningClass()&#xA; else&#xA; null&#xA; endif&#xA; endif&#xA; endif&#xA; endif&#xA; endif"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
</eOperations>
<eStructuralFeatures xsi:type="ecore:EReference" name="expressionStatement"
eType="ecore:EClass behavioral.ecore#//actions/ExpressionStatement" transient="true"
eOpposite="behavioral.ecore#//actions/ExpressionStatement/expression"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="initExpressionFor" eType="ecore:EClass behavioral.ecore#//actions/NamedValueWithOptionalInitExpression"
transient="true" eOpposite="behavioral.ecore#//actions/NamedValueWithOptionalInitExpression/initExpression"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="actualObjectParameter"
eType="ecore:EClass data.ecore#//classes/ActualObjectParameter" transient="true"
eOpposite="data.ecore#//classes/ActualObjectParameter/value"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="objectBasedExpression"
eType="#//expressions/ObjectBasedExpression" transient="true" eOpposite="#//expressions/ObjectBasedExpression/object"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="argumentOf" eType="#//expressions/WithArgument"
transient="true" eOpposite="#//expressions/WithArgument/argument"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="blockOfFunctionCallExpression"
eType="#//expressions/FunctionCallExpression" transient="true" eOpposite="#//expressions/FunctionCallExpression/calledBlock"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="leftOfEquals" eType="#//expressions/Equals"
transient="true" eOpposite="#//expressions/Equals/left"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="usedAsArgumentInSignatureCall"
eType="#//expressions/SignatureCallExpression" transient="true" eOpposite="#//expressions/SignatureCallExpression/parameters"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="rightOfEquals" eType="#//expressions/Equals"
transient="true" eOpposite="#//expressions/Equals/right"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="conditional" eType="#//expressions/Conditional"
transient="true" eOpposite="#//expressions/Conditional/condition"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="collectionExpression"
eType="#//expressions/collectionexpressions/CollectionExpression" transient="true"
eOpposite="#//expressions/collectionexpressions/CollectionExpression/source"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="inIterator" eType="#//expressions/collectionexpressions/Iterate"
transient="true" eOpposite="#//expressions/collectionexpressions/Iterate/iteratorExpression"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="conditionOfOqlQuery"
eType="#//query/OqlQuery" transient="true" eOpposite="#//query/OqlQuery/condition"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="fromClause" eType="#//query/FromClause"
transient="true" eOpposite="#//query/FromClause/fromExpression"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="cellSetOfDimensionExpression"
eType="#//analytics/DimensionExpression" transient="true" eOpposite="#//analytics/DimensionExpression/cellSet"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="factsOfDimensionExpression"
eType="#//analytics/DimensionExpression" transient="true" eOpposite="#//analytics/DimensionExpression/facts"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="dimension" eType="#//analytics/DimensionDefinition"
transient="true" eOpposite="#//analytics/DimensionDefinition/expression"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="mapExpressionOfGroupBy"
eType="#//analytics/GroupBy" transient="true" eOpposite="#//analytics/GroupBy/mapExpression"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="template" eType="ecore:EClass ui.ecore#//templates/StringTemplate"
transient="true" eOpposite="ui.ecore#//templates/StringTemplate/expressions"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="all" eType="ecore:EClass persistence.ecore#//expressions/All"
transient="true" eOpposite="persistence.ecore#//expressions/All/snapshotIdentifier"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="VariableExpression" eSuperTypes="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="The variable referenced by this type of expression must be visible within the scope where this expression occurs.&#xD;&#xA;&#xD;&#xA;TODO: How to determine the block containing this VariableExpression? This will be important to determine if the variable is visible."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="VariableExpressionType" value="self.getType().conformsTo(self.variable.getType())"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="VariableExpressionType"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="variable" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/NamedValue"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="MethodCallExpression" eSuperTypes="#//expressions/ObjectBasedExpression #//expressions/SignatureCallExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="The MethodCallExpression executes an implementation of the signature using the &quot;parameters&quot; expressions as arguments on the object evaluated by the &quot;object&quot; expression. For that, first the &quot;object&quot; expression is evaluated. the parameter expressions (if provided) are evaluated and then passed to the implementation.&#xD;&#xA;&#xD;&#xA;The object expression must evaluate to a single value, i.e., a TypeDefinition with upperMultiplicity = 1."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ObjectMustSupportOperation" value="self.object.getType().getInnermost().oclIsKindOf(data::classes::ClassTypeDefinition) and&#xD;&#xA; self.object.getType().getInnermost().oclAsType(data::classes::ClassTypeDefinition).clazz.conformsTo(self.methodSignature.owner.oclAsType(data::classes::SapClass))"/>
<details key="OutputMultiplicities" value="(self.object.getType().isMany() implies (self.getType().isMany() and not self.getType().unique)) and&#xD;&#xA; (self.object.getType().lowerMultiplicity = 0 implies (self.getType()->isEmpty() or self.getType().lowerMultiplicity = 0))"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ObjectMustSupportOperation OutputMultiplicities"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="asynchronous" ordered="false"
unique="false" lowerBound="1" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EBoolean">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="An operation may be invoked asynchronously. If the operation returns a value, it is ignored, as are any exceptions raised by the operation. An OperationExpression with this attribute set to true has itself no type and therefore cannot reasonably be used in a side effect-free expression but only as a statement."/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="methodSignature" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/MethodSignature"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="creationExpression" eType="#//expressions/ObjectCreationExpression"
transient="true" eOpposite="#//expressions/ObjectCreationExpression/initializers"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ObjectBasedExpression" abstract="true"
eSuperTypes="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="A specific type of expression that is evaluated in the context of a specific object. Another expression is used to determine this object. An example for such an expression would be association navigation, where the object where the navigation starts has to be specified by the &quot;object&quot; expression."/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="object" lowerBound="1"
eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/objectBasedExpression"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ObjectCreationExpression" eSuperTypes="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="CannotInstantiateAbstractClass" value="not self.classToInstantiate.isAbstract()"/>
<details key="ExpressionType" value="self.getType().oclIsKindOf(data::classes::ClassTypeDefinition) and&#xD;&#xA; self.getType().oclAsType(data::classes::ClassTypeDefinition).clazz = self.classToInstantiate and&#xD;&#xA; self.getType().lowerMultiplicity = 1 and&#xD;&#xA; self.getType().upperMultiplicity = 1"/>
<details key="HasToOwnTypeDefinition" value="self.ownedTypeDefinition->notEmpty()"/>
<details key="CannotInstantiateValueClass" value="not self.classToInstantiate.valueType"/>
<details key="NoDuplicateInitializers" value="self.initializers->forAll( a, b | a &lt;> b implies a.methodSignature &lt;> b.methodSignature )"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="CannotInstantiateAbstractClass ExpressionType HasToOwnTypeDefinition CannotInstantiateValueClass NoDuplicateInitializers"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="classToInstantiate" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/SapClass"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="initializers" upperBound="-1"
eType="#//expressions/MethodCallExpression" containment="true" eOpposite="#//expressions/MethodCallExpression/creationExpression"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="FunctionCallExpression" eSuperTypes="#//expressions/SignatureCallExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="An expression that is computed by first evaluating &quot;calledBlock&quot; and invoking the resulting block passing the &quot;argument&quot; expression. The value returned by the block constitutes the value of this expression. If the block terminates with a fault, the evaluation of this expression terminates with this fault.&#xD;&#xA;&#xD;&#xA;The type of the object computed by the &quot;parameters&quot; expression must conform to the input parameter types of the signature called.&#xD;&#xA;&#xD;&#xA;If the calledBock evaluates to more than one callable function, all functions will be called. Invocation ordering depends on the side effect-freeness of the signatures called."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ResultType" value="let fstd:data::classes::FunctionSignatureTypeDefinition = self.calledBlock.getType().getInnermost().oclAsType(data::classes::FunctionSignatureTypeDefinition) in&#xD;&#xA;&#xD;&#xA; if fstd.isMany() then&#xD;&#xA; -- calling multiple functions; test is somewhat fuzzy because it doesn't test condormance of nesting structure exactly&#xD;&#xA; self.getType().isMany() and not self.getType().unique and&#xD;&#xA; fstd.signature.output.getInnermost().conformsTo(self.getType().getInnermost()) and&#xD;&#xA; (fstd.lowerMultiplicity = 0 implies (self.getType()->isEmpty() or self.getType().lowerMultiplicity = 0))&#xD;&#xA; else&#xD;&#xA; -- calling a single function&#xD;&#xA; fstd.signature.output.conformsTo(self.getType()) and &#xD;&#xA; (fstd.lowerMultiplicity = 0 implies (self.getType()->isEmpty() or self.getType().lowerMultiplicity = 0))&#xD;&#xA; endif"/>
<details key="CalledBlockMustBeFunction" value="self.calledBlock.getType().getInnermost().oclIsKindOf(data::classes::FunctionSignatureTypeDefinition)"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ResultType CalledBlockMustBeFunction"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="calledBlock" lowerBound="1"
eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/blockOfFunctionCallExpression"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="WithArgument" abstract="true">
<eStructuralFeatures xsi:type="ecore:EReference" name="argument" eType="#//expressions/Expression"
containment="true" eOpposite="#//expressions/Expression/argumentOf"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="This" eSuperTypes="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Statically, the This expression has the type that owns its occurrence. This means, in order to determine this, the getType implementation needs to ascend the composition hierarchy until it finds a Class somewhere. The problem, again, is that an OCL expression cannot manufacture the result required becauce currently TypeDefinition is still an &quot;entity type,&quot; meaning a MOF class whose instances have ID and an explicit life cycle.&#xD;&#xA;&#xD;&#xA;Therefore, currently This has to own its type definition, unfortunately."/>
</eAnnotations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Equals" eSuperTypes="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="compares two or more values/objects. Entity type instances are compared based on their identity. Value type instances are compared by their value. The type of an Equals expression is Boolean.&#xD;&#xA;&#xD;&#xA;The getType() implementation can only infer the type once TypeDefinition is a value type, values of which can be constructed in an OCL expression."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ConformaceOneWayOrAnother" value="self.left.getType().conformsTo(self.right.getType()) or&#xD;&#xA; self.right.getType().conformsTo(self.left.getType())"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ConformaceOneWayOrAnother"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="left" lowerBound="1"
eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/leftOfEquals"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="right" lowerBound="1"
eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/rightOfEquals"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="AssociationEndNavigationExpression"
eSuperTypes="#//expressions/ObjectBasedExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Navigates from the &quot;object&quot; across the &quot;toEnd&quot;'s association to the &quot;toEnd&quot;. The expression evaluates to the objects at the &quot;toEnd&quot; that are associated with the &quot;object&quot; based on the end's association."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ObjectTypeMustMatch" value="self.object.getType().conformsToIgnoringMultiplicity(self.toEnd.otherEnd().type)"/>
<details key="ResultType" value="self.getType() = self.toEnd.type"/>
<details key="EndMustBeNavigable" value="self.toEnd.navigable"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ObjectTypeMustMatch ResultType EndMustBeNavigable"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="toEnd" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/AssociationEnd"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="SignatureCallExpression" abstract="true"
eSuperTypes="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ParametersTypesMustMatchSignatureParametersTypes" value="let numberOfMandatoryParameters:Integer =&#xD;&#xA; self.getSignature().input->select(p|p.defaultValue->isEmpty())->size()&#xD;&#xA; in&#xD;&#xA; self.parameters->size() >= numberOfMandatoryParameters and&#xD;&#xA; self.parameters->size() &lt;= self.getSignature().input->size() and&#xD;&#xA; self.parameters->forAll(parameter |&#xD;&#xA; parameter.getType().conformsTo(self.getSignature().input->at(self.parameters->indexOf(parameter)).getType()) )"/>
<details key="CallTypeMustMatchSignatureOutput" value="if self.getSignature().output.oclIsUndefined() then&#xD;&#xA; self.getType().oclIsUndefined()&#xD;&#xA; else &#xD;&#xA; if self.getMultiplicityOfCallTarget().isMany() and self.getSignature().output.isMany() then&#xD;&#xA; let ntd:data::classes::NestedTypeDefinition = self.getType().oclAsType(data::classes::NestedTypeDefinition) in&#xD;&#xA; self.getType().oclIsKindOf(data::classes::NestedTypeDefinition) and &#xD;&#xA; ntd.unique = false and&#xD;&#xA; ntd.ordered = self.getMultiplicityOfCallTarget().ordered and&#xD;&#xA; ntd.lowerMultiplicity = self.getMultiplicityOfCallTarget().lowerMultiplicity and&#xD;&#xA; ntd.upperMultiplicity = self.getMultiplicityOfCallTarget().upperMultiplicity and&#xD;&#xA; self.getSignature().output.conformsTo(ntd.type)&#xD;&#xA; else&#xD;&#xA; let target:data::classes::Multiplicity = self.getMultiplicityOfCallTarget() in&#xD;&#xA; let output:data::classes::TypeDefinition = self.getSignature().output in &#xD;&#xA; ( output.isMany() implies self.getType().unique = output.unique ) and&#xD;&#xA; ( ( output.isMany() or target.isMany() ) implies ( self.getType().ordered = (output.ordered or target.ordered) ) ) and&#xD;&#xA; ( self.getType().lowerMultiplicity = (output.lowerMultiplicity * target.lowerMultiplicity)) and&#xD;&#xA; ( self.getType().upperMultiplicity = (if output.isMany() or target.isMany() then &#xD;&#xA; -1 &#xD;&#xA; else &#xD;&#xA; output.upperMultiplicity * target.upperMultiplicity &#xD;&#xA; endif)) and&#xD;&#xA; self.getType().conformsToIgnoringMultiplicity(output)&#xD;&#xA; endif&#xD;&#xA; endif"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ParametersTypesMustMatchSignatureParametersTypes CallTypeMustMatchSignatureOutput"/>
</eAnnotations>
<eOperations name="getSignature" ordered="false" unique="false" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/Signature">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="if self.oclIsKindOf(FunctionCallExpression) then&#xD;&#xA; self.oclAsType(FunctionCallExpression).calledBlock->collect(getType().getInnermost().oclAsType(data::classes::FunctionSignatureTypeDefinition).signature)->any(true)&#xD;&#xA; else&#xD;&#xA; self.oclAsType(MethodCallExpression).methodSignature&#xD;&#xA; endif"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="For FunctionCallExpression, this retrieves the signature from the type of the calledBlock expression which is required to be a FunctionSignatureTypeDefinition. For MethodCallExpression, it obtains the signature by navigating to the methodSignature role."/>
</eAnnotations>
</eOperations>
<eOperations name="getMultiplicityOfCallTarget" ordered="false" unique="false"
lowerBound="1" eType="ecore:EClass data.ecore#//classes/Multiplicity">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="if self.oclIsKindOf(FunctionCallExpression) then&#xA; self.oclAsType(FunctionCallExpression).calledBlock.getType()&#xA; else&#xA; self.oclAsType(MethodCallExpression).object.getType()&#xA; endif"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
</eOperations>
<eStructuralFeatures xsi:type="ecore:EReference" name="parameters" upperBound="-1"
eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/usedAsArgumentInSignatureCall"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ObjectCount" eSuperTypes="#//expressions/ObjectBasedExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Computes the Number 1 for single objects, and the number of objects in a multi-valued object otherwise.&#xD;&#xA;&#xD;&#xA;Type inference in getType() can be done once TypeDefinition is a value type that can be constructed in OCL."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="TypeIsNumber" value="self.getType().oclIsKindOf(data::classes::ClassTypeDefinition) and&#xD;&#xA; self.getType().oclAsType(data::classes::ClassTypeDefinition).clazz.name = 'Number'"/>
<details key="MultiplicityIsOne" value="self.getType().upperMultiplicity = 1 and&#xD;&#xA; self.getType().lowerMultiplicity = 1"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="TypeIsNumber MultiplicityIsOne"/>
</eAnnotations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Replace" eSuperTypes="#//expressions/ObjectBasedExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="An abstract-syntactical convenience to construct a value from an existing one, replacing a component somewhere in the possibly deep structure that the value has.&#xD;&#xA;&#xD;&#xA;The replacement always produces a value of the same type as the source value. It can provide a navigation path, following associations, staying withing values, with the last path component being allowed to end at an entity or a value class. Each path segment may add a constraint which makes sense specifically for multiplicities greater than one."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="SourceObjectIsOfValueType" value="self.object.getType().oclIsKindOf(data::classes::ClassTypeDefinition) and&#xD;&#xA; self.object.getType().oclAsType(data::classes::ClassTypeDefinition).clazz.valueType"/>
<details key="WithTypeConformsToLastStepsType" value="self.with.getType().conformsTo(self.steps->at(self.steps->size()).to.type)"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="SourceObjectIsOfValueType WithTypeConformsToLastStepsType"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="steps" lowerBound="1"
upperBound="-1" eType="#//expressions/NavigationStep" containment="true"
eOpposite="#//expressions/NavigationStep/replace"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="with" lowerBound="1"
eType="#//expressions/Expression" containment="true">
<eAnnotations source="http://schema.omg.org/spec/MOF/2.0/emof.xml">
<details key="Property.oppositeRoleName" value="withOfReplace"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="NavigationStep">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="FromEndAttachesToOutputOfPreviousStep" value="let i:Integer = self.replace.steps->indexOf(self) in&#xD;&#xA; let t:data::classes::ClassTypeDefinition = if i=1 then&#xD;&#xA; self.replace.object.getType().oclAsType(data::classes::ClassTypeDefinition)&#xD;&#xA; else&#xD;&#xA; self.replace.steps->at(-1 + i).to.type&#xD;&#xA; endif&#xD;&#xA; in&#xD;&#xA;&#xD;&#xA; self.to.otherEnd().type.clazz.conformsTo(t.clazz)"/>
<details key="FilterFunctionExpressionHasFunctionType" value="self.filterFunction->notEmpty() implies self.filterFunction.getType().oclIsKindOf(data::classes::FunctionSignatureTypeDefinition)"/>
<details key="FromEndMustBeEqualityRelevant" value="to.otherEnd().contributesToEquality"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="FromEndAttachesToOutputOfPreviousStep FilterFunctionExpressionHasFunctionType FromEndMustBeEqualityRelevant"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="replace" lowerBound="1"
eType="#//expressions/Replace" transient="true" eOpposite="#//expressions/Replace/steps"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="to" lowerBound="1" eType="ecore:EClass data.ecore#//classes/AssociationEnd"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="filterFunction" eType="#//expressions/Expression"
containment="true">
<eAnnotations source="http://schema.omg.org/spec/MOF/2.0/emof.xml">
<details key="Property.oppositeRoleName" value="navigationStep"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Head" eSuperTypes="#//expressions/ObjectBasedExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="IsOrdered" value="self.object.getType().ordered"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="IsOrdered"/>
</eAnnotations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Tail" eSuperTypes="#//expressions/ObjectBasedExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="IsOrdered" value="self.object.getType().ordered"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="IsOrdered"/>
</eAnnotations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="AsList" eSuperTypes="#//expressions/ObjectBasedExpression"/>
<eClassifiers xsi:type="ecore:EClass" name="Conditional" abstract="true">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Some statement depending on a Boolean expression"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ConditionMustBeBoolean" value="self.condition.getType().upperMultiplicity = 1 and&#xD;&#xA; self.condition.getType().oclIsKindOf(data::classes::ClassTypeDefinition) and&#xD;&#xA; self.condition.getType().oclAsType(data::classes::ClassTypeDefinition).clazz.name = 'Boolean'"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ConditionMustBeBoolean"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="condition" lowerBound="1"
eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/conditional"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Ternary" eSuperTypes="#//expressions/ConditionalExpression #//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="TrueAndFalseExprsConformToResultType" value="self.trueExpr.getType().conformsTo(self.getType()) or&#xD;&#xA; self.falseExpr.getType().conformsTo(self.getType())"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="TrueAndFalseExprsConformToResultType"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="falseExpr" lowerBound="1"
eType="#//expressions/Expression" containment="true">
<eAnnotations source="http://schema.omg.org/spec/MOF/2.0/emof.xml">
<details key="Property.oppositeRoleName" value="falseOfTernary"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="trueExpr" lowerBound="1"
eType="#//expressions/Expression" containment="true">
<eAnnotations source="http://schema.omg.org/spec/MOF/2.0/emof.xml">
<details key="Property.oppositeRoleName" value="trueOfTernary"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ContentEquals" eSuperTypes="#//expressions/Equals">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Compares two entity objects by the content of those associations marked as equality relevant for the entity."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ContentEqualsOnlyForEntities" value="self.left.getType().getInnermost().oclIsKindOf(data::classes::ClassTypeDefinition) and&#xD;&#xA; self.right.getType().getInnermost().oclIsKindOf(data::classes::ClassTypeDefinition) and&#xD;&#xA; not self.left.getType().getInnermost().oclAsType(data::classes::ClassTypeDefinition).clazz.valueType and&#xD;&#xA; not self.right.getType().getInnermost().oclAsType(data::classes::ClassTypeDefinition).clazz.valueType"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ContentEqualsOnlyForEntities"/>
</eAnnotations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ExpressionWithArgument" abstract="true"
eSuperTypes="#//expressions/Expression #//expressions/WithArgument"/>
<eClassifiers xsi:type="ecore:EClass" name="ConditionalExpression" abstract="true"
eSuperTypes="#//expressions/Expression #//expressions/Conditional"/>
<eClassifiers xsi:type="ecore:EClass" name="Map" eSuperTypes="#//expressions/ExpressionWithArgument #//expressions/ObjectBasedExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="A map expression operates on a (multi-)object (therefore it is an ObjectBaseExpression) and subjects each element of this (multi-)object as argument to the function expected as argument (therefore, it is an ExpressionWithArgument). The single multiplicity of the object expression must conform to the single input argument of the function signature of the FunctionSignatureTypeDefinition defining the type of the argument."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ObjectTypeMustConformToFunctionArgument" value="let fstd:data::classes::TypeDefinition = self.argument.getType() in&#xD;&#xA; let sig:data::classes::Signature = fstd.oclAsType(data::classes::FunctionSignatureTypeDefinition).signature in&#xD;&#xA; let t:data::classes::TypeDefinition = self.object.getType() in&#xD;&#xA; let argT:data::classes::TypeDefinition = sig.input->at(1).getType() in&#xD;&#xA; -- if multiplicities match including multiplicities, that's ok&#xD;&#xA; t.conformsTo(argT) or&#xD;&#xA; -- otherwise, pick single multiplicity from object and try again&#xD;&#xA; t.conformsToIgnoringMultiplicity(argT) or&#xD;&#xA; (t.oclIsKindOf(data::classes::NestedTypeDefinition) and t.oclAsType(data::classes::NestedTypeDefinition).type.conformsTo(argT))"/>
<details key="ArgumentMustBeSingleArgumentFunctionWithNonVoidOutput" value="let fstd:data::classes::TypeDefinition = self.argument.getType() in&#xD;&#xA; fstd.oclIsKindOf(data::classes::FunctionSignatureTypeDefinition) and&#xD;&#xA; (let sig:data::classes::Signature = fstd.oclAsType(data::classes::FunctionSignatureTypeDefinition).signature in&#xD;&#xA; (sig.output->notEmpty() and&#xD;&#xA; sig.input->size() = 1))"/>
<details key="MapFunctionMustBeSideEffectFree" value="self.argument.getType().oclAsType(data::classes::FunctionSignatureTypeDefinition).signature.sideEffectFree"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ObjectTypeMustConformToFunctionArgument ArgumentMustBeSingleArgumentFunctionWithNonVoidOutput MapFunctionMustBeSideEffectFree"/>
</eAnnotations>
</eClassifiers>
<eSubpackages name="literals" nsURI="http://eclipse.org/ocl/examples/impactanalyzer/testmodel/ngpm/dataaccess/expressions/literals.ecore"
nsPrefix="dataaccess.expressions.literals">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="invocationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="validationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="settingDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
</eAnnotations>
<eClassifiers xsi:type="ecore:EClass" name="Literal" eSuperTypes="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="A literal of any primitive type, such as &quot;This is a string&quot; or 123 or an enumeration literal or a literal denoting a value of an implicit anonymous class, or a block, or a literal that denotes a (potentially anonymous) class.&#xD;&#xA;&#xD;&#xA;The exact type of a literal may not always be possible to decide completely, particularly when it comes to constrained types over primitive types. This can only come in through &quot;post types&quot; and type inference, e.g., in an assignment statement where the type of the lvalue is known."/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="literal" ordered="false"
unique="false" lowerBound="1" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EString">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Represents the value of this literal as a string. Final interpretation has to happen by the type of the literal expression. For string literals this is particularly straightforward. For numbers and dates, specific formats as defined by the respective types may apply."/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="BinaryLiteral" eSuperTypes="#//expressions/literals/Literal"/>
<eClassifiers xsi:type="ecore:EClass" name="StringLiteral" eSuperTypes="#//expressions/literals/Literal"/>
<eClassifiers xsi:type="ecore:EClass" name="NumberLiteral" eSuperTypes="#//expressions/literals/Literal"/>
<eClassifiers xsi:type="ecore:EClass" name="TimePointLiteral" eSuperTypes="#//expressions/literals/Literal"/>
<eClassifiers xsi:type="ecore:EClass" name="BooleanLiteral" eSuperTypes="#//expressions/literals/Literal"/>
<eClassifiers xsi:type="ecore:EClass" name="ObjectLiteral" eSuperTypes="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ObjectLiteralsForValueClassesOnly" value="self.valueClass.valueType"/>
<details key="ObjectLiteralPropertiesOnRightClass" value="self.propertyValues->forAll(vi|vi.forEnd.otherEnd().type.clazz = self.valueClass)"/>
<details key="ValuesMustBeProvidedForAllMandatoryProperties" value="self.valueClass.getEqualityRelevantAssociationEnds()->select(ae | ae.otherEnd().type.lowerMultiplicity > 0)->forAll(ae |&#xD;&#xA; self.propertyValues->exists(pv | pv.forEnd.otherEnd() = ae))"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ObjectLiteralsForValueClassesOnly ObjectLiteralPropertiesOnRightClass ValuesMustBeProvidedForAllMandatoryProperties"/>
</eAnnotations>
<eOperations name="isEqualTo" ordered="false" unique="false" lowerBound="1"
eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EBoolean">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="self.valueClass = o.valueClass and&#xA; self.propertyValues->size() = o.propertyValues->size() and&#xA; self.propertyValues->forAll(pv | o.propertyValues->exists(opv | opv.forEnd = pv.forEnd and opv.value.evaluatesToEqualAs(pv.value)))"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
<eParameters name="o" ordered="false" unique="false" lowerBound="1" eType="#//expressions/literals/ObjectLiteral"/>
</eOperations>
<eStructuralFeatures xsi:type="ecore:EReference" name="valueClass" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/SapClass">
<eAnnotations source="http://schema.omg.org/spec/MOF/2.0/emof.xml">
<details key="Property.oppositeRoleName" value="objectLiteral"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="propertyValues" upperBound="-1"
eType="#//expressions/literals/ValueInit" containment="true">
<eAnnotations source="http://schema.omg.org/spec/MOF/2.0/emof.xml">
<details key="Property.oppositeRoleName" value="objectLiteral"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ValueInit">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Provides an initialization value for an association end whose other end is attached to a value class. The expression's type must conform to the association end's type."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ValueInitTypeConforms" value="self.value.getType().conformsTo(self.forEnd.type)"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ValueInitTypeConforms"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="forEnd" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/AssociationEnd">
<eAnnotations source="http://schema.omg.org/spec/MOF/2.0/emof.xml">
<details key="Property.oppositeRoleName" value="valueInit"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1"
eType="#//expressions/Expression" containment="true">
<eAnnotations source="http://schema.omg.org/spec/MOF/2.0/emof.xml">
<details key="Property.oppositeRoleName" value="valueInit"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
</eSubpackages>
<eSubpackages name="collectionexpressions" nsURI="http://eclipse.org/ocl/examples/impactanalyzer/testmodel/ngpm/dataaccess/expressions/collectionexpressions.ecore"
nsPrefix="dataaccess.expressions.collectionexpressions">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="invocationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="validationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="settingDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
</eAnnotations>
<eClassifiers xsi:type="ecore:EClass" name="Including" eSuperTypes="#//expressions/collectionexpressions/CollectionExpressionWithArgument">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Produces a new value which includes the *argument* object. If the *argument* object was already included in the *source* and the multiplicity of the *source* has the *unique* attribute set to *true*, the *what* object will not be added a second time and the resulting expression will be equal to the *source* expression's value.&#xD;&#xA;&#xD;&#xA;If the *source* expression had multiplicity 1, the resulting expression's multiplicity is *, regardless of whether an object actually gets added."/>
</eAnnotations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Excluding" eSuperTypes="#//expressions/collectionexpressions/CollectionExpressionWithArgument">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Produces a new value which includes one less occurrence of the *argument* object than *source* or no occurrence if *source* did not contain an occurrence.&#xD;&#xA;&#xD;&#xA;If the *source* expression had multiplicity a..b, the resulting expression's multiplicity is Max(a-1, 0)..b, regardless of whether an object actually gets removed."/>
</eAnnotations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="IncludingAt" eSuperTypes="#//expressions/collectionexpressions/Including #//expressions/collectionexpressions/WithPosition">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Like Including, produced a new value based on the *source* value that includes the *argument* object. In addition, *IncludingAt* specifies the position where to include the *argument* object. The multiplicity of source and resulting value have ordered=true. If *source* already includes an object equal to *argument* and the *source* multiplicity has unique=true, that element will afterwards be at the requested position or at the end of the resulting value if the *at* position is greater or equal the *source*'s cardinality."/>
</eAnnotations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Iterate" eSuperTypes="#//expressions/collectionexpressions/CollectionExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Given the number of iterators variables, assigns all possible tuples of values from the source expression to the iterators (combinatorial product). In particular, if only only one iterator variable is provided, this variable will &quot;loop&quot; through the values in the source expression. If the source expression has an ordered multiplicity, the iteration order corresponds with that order. Otherwise, iteration order is arbitrary and undefined.&#xD;&#xA;&#xD;&#xA;For each combination of iterator variable values, the iteratorExpression will be evaluated. The result of each evaluation is assigned to the accumulator variable.&#xD;&#xA;&#xD;&#xA;The iteratorExpression can use all iterators variables as well as the accumulator if one is declared, and of course all other variables in scope as well (block variables, etc.). If an accumulator is declared, an initial value must be provided for it.&#xD;&#xA;&#xD;&#xA;The result of the Iterate expression is the value that the accumulator has when the iteration terminates or the value of the last iteratorExpression evaluation if no accumulator has been provided. By this rationale, the type of the Iterate expression equals the type of the iteratorExpression."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="AccumulatorTypeEqualsExpressionType" value="self.accumulator->notEmpty() implies&#xD;&#xA; (self.accumulator.ownedTypeDefinition->notEmpty() implies&#xD;&#xA; self.accumulator.ownedTypeDefinition.conformsTo(self.iteratorExpression.getType()))"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="AccumulatorTypeEqualsExpressionType"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="iterators" lowerBound="1"
upperBound="-1" eType="ecore:EClass behavioral.ecore#//actions/Iterator"
containment="true" eOpposite="behavioral.ecore#//actions/Iterator/iterate"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="accumulator" eType="ecore:EClass behavioral.ecore#//actions/Constant"
containment="true" eOpposite="behavioral.ecore#//actions/Constant/iterate"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="iteratorExpression"
lowerBound="1" eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/inIterator"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="CollectionExpression" abstract="true"
eSuperTypes="#//expressions/Expression">
<eStructuralFeatures xsi:type="ecore:EReference" name="source" lowerBound="1"
eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/collectionExpression"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ExcludingAt" eSuperTypes="#//expressions/collectionexpressions/Excluding #//expressions/collectionexpressions/WithPosition">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Like Excluding, but useful if multiple occurrences of the *argument* value exist. This expression removes the occurrence at the position specified by *at*. For this purpose, the argument value must have ordered=true, and so will the resulting value. If at position *at* there is no object that equals *argument* or the *at* position is outside the valid bounds, the resulting expression equals the *source* expression.&#xD;&#xA;&#xD;&#xA;If the argument is a multi-object (cardinality > 1), it needs to be ordered, and the argument's object sequence needs to exist at the position specified by *at*. If only a subsequence prefix is matched at position *at*, only that subsequence prefix will be excluded."/>
</eAnnotations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="WithPosition" abstract="true" eSuperTypes="#//expressions/ExpressionWithArgument">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="SourceMustBeOrdered" value="self.argument.getType().ordered"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="SourceMustBeOrdered"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="at" ordered="false"
unique="false" lowerBound="1" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EInt">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="a position in an object with upper multiplicity >1 and ordered=true."/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="CollectionExpressionWithArgument"
abstract="true" eSuperTypes="#//expressions/collectionexpressions/CollectionExpression #//expressions/ExpressionWithArgument">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ArgumentTypeMustConformToCollectionExpressionType" value="let snl : Integer = source.getType().getNestingLevel() in let anl : Integer = argument.getType().getNestingLevel() in&#xD;&#xA; if snl = anl then&#xD;&#xA; source.getType().conformsToIgnoringMultiplicity(argument.getType())&#xD;&#xA; else&#xD;&#xA; if snl = (anl + 1) then&#xD;&#xA; source.getType().oclAsType(data::classes::NestedTypeDefinition).type.conformsToIgnoringMultiplicity(argument.getType())&#xD;&#xA; else&#xD;&#xA; if (snl + 1) = anl then&#xD;&#xA; source.getType().conformsToIgnoringMultiplicity(argument.getType().oclAsType(data::classes::NestedTypeDefinition).type)&#xD;&#xA; else&#xD;&#xA; false&#xD;&#xA; endif&#xD;&#xA; endif&#xD;&#xA; endif"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ArgumentTypeMustConformToCollectionExpressionType"/>
</eAnnotations>
</eClassifiers>
</eSubpackages>
<eSubpackages name="fp" nsURI="http://eclipse.org/ocl/examples/impactanalyzer/testmodel/ngpm/dataaccess/expressions/fp.ecore"
nsPrefix="dataaccess.expressions.fp">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="invocationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="validationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="settingDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
</eAnnotations>
<eClassifiers xsi:type="ecore:EClass" name="AnonymousFunctionExpr" eSuperTypes="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="The type of expression of this type is a FunctionSignatureTypeDefinition. The value of this expression can be invoked which results in an invocation of the assoicated block.&#xD;&#xA;&#xD;&#xA;The expression must own a FunctionSignatureTypeDefinition in the role ownedTypeDefinition that has a valid implementation for its FunctionSignature.&#xD;&#xA;&#xD;&#xA;Note that there can be other expressions that evaluate to a function, such as an access to a variable that has a FunctionSignatureTypeDefinition as its type. AnonymousFunctionExpr really is the constructor for a function with implementation. This expression may then, e.g., be bound to variables or passed as parameter or returned by a method or function."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="TypeMustBeSignatureTypeDefinitionWithImplementation" value="self.getType().oclIsKindOf(data::classes::FunctionSignatureTypeDefinition) and&#xD;&#xA; self.getType().oclAsType(data::classes::FunctionSignatureTypeDefinition).signature.oclAsType(data::classes::FunctionSignature).implementation->notEmpty()"/>
<details key="HasToOwnSignatureTypeDefinition" value="self.ownedTypeDefinition->notEmpty()"/>
<details key="SignatureMustBeFunctionSignature" value="self.ownedTypeDefinition.oclAsType(data::classes::FunctionSignatureTypeDefinition).signature.oclIsKindOf(data::classes::FunctionSignature)"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="TypeMustBeSignatureTypeDefinitionWithImplementation HasToOwnSignatureTypeDefinition SignatureMustBeFunctionSignature"/>
</eAnnotations>
<eOperations name="getImplementation" ordered="false" unique="false" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/FunctionSignatureImplementation">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="self.ownedTypeDefinition.oclAsType(data::classes::FunctionSignatureTypeDefinition).signature.oclAsType(data::classes::FunctionSignature).implementation"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Determines the Block implementing the function to which this expression evaluates by navigating to the FunctionSignatureTypeDefinition that tells this expression's type, and from there obtaining the signature's implementation."/>
</eAnnotations>
</eOperations>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="FunctionFromMethodExpr" eSuperTypes="#//expressions/ObjectBasedExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="The getType() implementation for this expression type could infer the function type definition from the method signature. However, this would require constructing such a value from within OCL."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="SignatureAvailableOnObjectsClass" value="self.object.getType().oclIsKindOf(data::classes::ClassTypeDefinition) and&#xD;&#xA; self.object.getType().oclAsType(data::classes::ClassTypeDefinition).clazz.conformsTo(self.method.owner.oclAsType(data::classes::SapClass))"/>
<details key="MethodSignatureConformsToFunctionSignature" value="self.getType().oclIsKindOf(data::classes::FunctionSignatureTypeDefinition) and&#xD;&#xA; self.method.conformsTo(self.getType().oclAsType(data::classes::FunctionSignatureTypeDefinition).signature)"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="SignatureAvailableOnObjectsClass MethodSignatureConformsToFunctionSignature"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="method" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/MethodSignature"/>
</eClassifiers>
</eSubpackages>
</eSubpackages>
<eSubpackages name="query" nsURI="http://eclipse.org/ocl/examples/impactanalyzer/testmodel/ngpm/dataaccess/query.ecore"
nsPrefix="dataaccess.query">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="invocationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="validationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="settingDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="A query language (overlap with rules package?) based on the structural package (BO, BONodes, associations, attributes). The language is independent of the mapping to the persistence layer but can be mapped to efficient queries in the persistence layer for those BOs that have a declared persistence mapping. Look closely at FSI, its query and view builder and how they have structured their metadata.&#xD;&#xA;&#xD;&#xA;Should this be a subset of the expression language?&#xD;&#xA;Note the particular issues around *retrieval* (as opposed to just querying IDs) as mentioned by Maic Wintel. Modeling of aspects to retrieve by a query?&#xD;&#xA;&#xD;&#xA;What about regular expressions?&#xD;&#xA;&#xD;&#xA;TODO: Most queries by means of their projection (SELECT) clause will implicitly define a tuple type, and the value returned by the query is a multi-object of that tuple type. We need to think about what these types exactly are (currently we don't support tuple types). Are they classes that are implicitly defined by the query? Or does a class explicitly have to be defined whose associations then can assume the values of the individual columns? Can that class somehow be referenced otherwise? What happens when the result of a query is assigned to a variable that uses type inference? I would hope that the implicit result class of the query is used as the variable's type. But is there / should there also be explicit ways of referencing this type?"/>
</eAnnotations>
<eClassifiers xsi:type="ecore:EClass" name="Selection" eSuperTypes="#//expressions/ObjectBasedExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Filters the (multi-)object based on the &quot;condition&quot; predicate. The expression can assume an implicit iterator variable &quot;self&quot; to be in scope which holds a single element of the (multi-)object from which to select. self's basic type is the same as that of &quot;object&quot; but with single multiplicity.&#xD;&#xA;&#xD;&#xA;The expression's type must be Boolean. If the expression evaluates to true, the single object is part of the resulting object, otherwise not.&#xD;&#xA;&#xD;&#xA;The Selection expression's result type is the same as object's type."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ConditionMustBeSideEffectFree" value="self.selectionExpr.isSideEffectFree()"/>
<details key="ConditionMustBeBooleanOrNumeric" value="self.selectionExpr.getType().oclIsKindOf(data::classes::ClassTypeDefinition) and&#xD;&#xA; (&#xD;&#xA; (&#xD;&#xA; self.selectionExpr.getType().oclAsType(data::classes::ClassTypeDefinition).clazz.name = 'Boolean' and&#xD;&#xA; self.selectionExpr.getType().upperMultiplicity = 1&#xD;&#xA; )&#xD;&#xA; or&#xD;&#xA; (&#xD;&#xA; self.selectionExpr.getType().oclAsType(data::classes::ClassTypeDefinition).clazz.name = 'Number' &#xD;&#xA; and &#xD;&#xA; self.object.getType().ordered&#xD;&#xA; )&#xD;&#xA; )"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ConditionMustBeSideEffectFree ConditionMustBeBooleanOrNumeric"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="iterator" lowerBound="1"
eType="ecore:EClass behavioral.ecore#//actions/Iterator" containment="true"
eOpposite="behavioral.ecore#//actions/Iterator/selection"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="selectionExpr" lowerBound="1"
eType="#//expressions/Expression" containment="true">
<eAnnotations source="http://schema.omg.org/spec/MOF/2.0/emof.xml">
<details key="Property.oppositeRoleName" value="selection"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="OqlQuery" eSuperTypes="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ConditionMustBeBoolean" value="self.condition->notEmpty() implies&#xD;&#xA; (self.condition.getType().oclIsKindOf(data::classes::ClassTypeDefinition) and&#xD;&#xA; self.condition.getType().oclAsType(data::classes::ClassTypeDefinition).clazz.name='Boolean')"/>
<details key="WhereClauseMustBeSideEffectFree" value="self.condition->forAll(c | c.isSideEffectFree())"/>
<details key="HasValueType" value="self.getType().oclIsKindOf(data::classes::ClassTypeDefinition) and self.getType().oclAsType(data::classes::ClassTypeDefinition).clazz.valueType"/>
<details key="SelectedIteratorsMustHaveClassTypeDefinitionAsType" value="self.selected->forAll(i | i.getType().oclIsKindOf(data::classes::ClassTypeDefinition))"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ConditionMustBeBoolean WhereClauseMustBeSideEffectFree HasValueType SelectedIteratorsMustHaveClassTypeDefinitionAsType"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="condition" eType="#//expressions/Expression"
containment="true" eOpposite="#//expressions/Expression/conditionOfOqlQuery"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="fromClauses" lowerBound="1"
upperBound="-1" eType="#//query/FromClause" containment="true" eOpposite="#//query/FromClause/fromClauseOfOqlQuery"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="selected" lowerBound="1"
upperBound="-1" eType="ecore:EClass behavioral.ecore#//actions/Iterator"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="FromClause">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="FromClausesMustBeSideEffectFree" value="self.fromExpression.isSideEffectFree()"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="FromClausesMustBeSideEffectFree"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="fromClauseOfOqlQuery"
eType="#//query/OqlQuery" transient="true" eOpposite="#//query/OqlQuery/fromClauses"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="fromExpression" lowerBound="1"
eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/fromClause"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="alias" lowerBound="1"
eType="ecore:EClass behavioral.ecore#//actions/Iterator" containment="true"
eOpposite="behavioral.ecore#//actions/Iterator/fromClause"/>
</eClassifiers>
</eSubpackages>
<eSubpackages name="analytics" nsURI="http://eclipse.org/ocl/examples/impactanalyzer/testmodel/ngpm/dataaccess/analytics.ecore"
nsPrefix="dataaccess.analytics">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="invocationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="validationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
<details key="settingDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="This is the home for the definitions of what InfoObjects, InfoCubes, extractors, queries and views are."/>
</eAnnotations>
<eClassifiers xsi:type="ecore:EClass" name="Dimension" eSuperTypes="modelmanagement.ecore#//NamedElement">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Dimensions define characteristics of the elements in a cell set according to which they may be grouped. A dimension defines a block that receives a value from the cell set's domain (its &quot;facts&quot; expression) and that determines the characteristic for that value in this dimension.&#xD;&#xA;&#xD;&#xA;For example, if a cell set's domain is the set of all SalesOrderItems, one dimension could be the Product, and therefore the product dimension's block would determine the product of the SalesOrderItem."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="BlockSignatureMustMatch" value="self.characteristicFunction.input->size() = 1 and &#xD;&#xA; self.cellSet.factsType.conformsToIgnoringMultiplicity(self.characteristicFunction.input->at(1).getType())&#xD;&#xA; -- Add the following again once we have NestedTypeDefinitions under control...&#xD;&#xA; -- and self.characteristicFunction.input->at(1).getType().upperMultiplicity = 1"/>
<details key="CharacteristicFunctionMustNotBeAbstract" value="not self.characteristicFunction.isAbstract()"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="BlockSignatureMustMatch CharacteristicFunctionMustNotBeAbstract"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="cellSet" lowerBound="1"
eType="#//analytics/CellSet" transient="true" eOpposite="#//analytics/CellSet/dimensions"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="characteristicFunction"
lowerBound="1" eType="ecore:EClass data.ecore#//classes/FunctionSignature"
containment="true" eOpposite="data.ecore#//classes/FunctionSignature/dimension"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="CellSet" eSuperTypes="data.ecore#//classes/FunctionSignatureImplementation">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="A cell set computes an aggregated view on a domain of values, aggregated according to the different values for the different dimensions, using the aggregation function defined by the cell set. The domain (fact base) type is specified by factsType.&#xD;&#xA;&#xD;&#xA;It subclasses FunctionSignatureImplementation. The function signature that a CellSet implements takes as its first argument a value whose type conforms to factsType, furthermore one argument per dimension and returns the aggregated cell value for the coordinate specified by the parameters. Therefore, the aggregationFunction's output type must conform to the CellSet's function signature's output type."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="ValueFunctionSignatureMustMatch" value="self.valueFunction->notEmpty() implies&#xD;&#xA; (self.valueFunction.input->size() = 1 and&#xD;&#xA; self.factsType.conformsToIgnoringMultiplicity(self.valueFunction.input->at(1).getType())&#xD;&#xA; -- Add the following again once we have NestedTypeDefinitions under control...&#xD;&#xA; -- and self.valueFunction.input->at(1).getType().upperMultiplicity = 1&#xD;&#xA; )"/>
<details key="AggregationFunctionSignatureMustMatch" value="self.aggregationFunction.input->size() = 1 and &#xD;&#xA; self.keyFigureType().conformsTo(self.aggregationFunction.input->at(1).getType())"/>
<details key="AggregationFunctionMustNotBeAbstract" value="not self.aggregationFunction.isAbstract()"/>
<details key="ValueFunctionMustNotBeAbstract" value="self.valueFunction->forAll(vf | not vf.isAbstract())"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="ValueFunctionSignatureMustMatch AggregationFunctionSignatureMustMatch AggregationFunctionMustNotBeAbstract ValueFunctionMustNotBeAbstract"/>
</eAnnotations>
<eOperations name="keyFigureType" ordered="false" unique="false" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/TypeDefinition">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="if self.valueFunction->isEmpty() then&#xA; self.factsType&#xA; else&#xA; self.valueFunction.output&#xA; endif"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Determines the type over which to aggregate. If no valueFunction is provided, this is the type of the cell set's elements. Otherwise, this is the type output by the valueFunction."/>
</eAnnotations>
</eOperations>
<eOperations name="cellType" ordered="false" unique="false" lowerBound="1" eType="ecore:EClass data.ecore#//classes/TypeDefinition">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="self.aggregationFunction.output"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
</eOperations>
<eOperations name="localIsSideEffectFree" ordered="false" unique="false" lowerBound="1"
eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EBoolean">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="self.dimensions->forAll(d|d.characteristicFunction.sideEffectFree) and&#xA; (self.valueFunction->notEmpty() implies self.valueFunction.sideEffectFree) and&#xA; self.aggregationFunction.sideEffectFree"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
</eOperations>
<eStructuralFeatures xsi:type="ecore:EReference" name="dimensions" lowerBound="1"
upperBound="-1" eType="#//analytics/Dimension" containment="true" eOpposite="#//analytics/Dimension/cellSet"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="valueFunction" eType="ecore:EClass data.ecore#//classes/FunctionSignature"
containment="true" eOpposite="data.ecore#//classes/FunctionSignature/cellSetForValueFunction"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="aggregationFunction"
lowerBound="1" eType="ecore:EClass data.ecore#//classes/FunctionSignature"
containment="true" eOpposite="data.ecore#//classes/FunctionSignature/cellSetForAggregationFunction"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="factsType" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/TypeDefinition" containment="true">
<eAnnotations source="http://schema.omg.org/spec/MOF/2.0/emof.xml">
<details key="Property.oppositeRoleName" value="cellSet"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="DimensionExpression" eSuperTypes="#//expressions/Expression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="For the given cell set, obtain all distinct characteristic values of the given dimension. For example, for a CellSet based on SalesOrderItem with one Dimension being Product, yield all products for which a SalesOrderItem exists in the CellSet.&#xD;&#xA;&#xD;&#xA;The type of this DimensionExpression is Set&lt;self.dimension.type>"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="FactsTypeConformsToFirstFunctionParameterType" value="self.facts.getType().conformsTo(self.dimensionParameter.ownerSignature.input->at(1).getType())"/>
<details key="CellSetExpressionMustHaveFunctionSignatureType" value="self.cellSet.getType().oclIsKindOf(data::classes::FunctionSignatureTypeDefinition)"/>
<details key="DimensionParameterIsNotFirst" value="self.dimensionParameter.ownerSignature.input->indexOf(self.dimensionParameter) > 1"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="FactsTypeConformsToFirstFunctionParameterType CellSetExpressionMustHaveFunctionSignatureType DimensionParameterIsNotFirst"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="cellSet" lowerBound="1"
eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/cellSetOfDimensionExpression"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="dimensionParameter" lowerBound="1"
eType="ecore:EClass data.ecore#//classes/Parameter"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="facts" lowerBound="1"
eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/factsOfDimensionExpression"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="GroupBy" eSuperTypes="#//expressions/ObjectBasedExpression">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="Groups the &quot;object&quot; expression's evaluation result by assigning each of its objects to the &quot;fact&quot; iterator, then evaluating all dimensions' expressions. Those objects having equal dimension results for all dimensions are put into one group. If no mapExpression is provided, the collection of those groups is the result of the GroupBy expression.&#xD;&#xA;&#xD;&#xA;If a mapExpression is provided, each group is assigned to the groupedFacts iterator, all dimension values for the respective group are assigned to their iterator and the mapExpression is evaluated with all these iterators in scope. The map expression's output type is raised in multiplicity by one &quot;level&quot;. However, the GroupBy's type always has non-unique multiplicity."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="GroupedFactsIteratorMustExistIfMapExpressionExists" value="self.mapExpression->notEmpty() implies self.groupedFacts->notEmpty()"/>
<details key="MapExpressionMustBeSideEffectFree" value="if self.mapExpression->notEmpty() then&#xD;&#xA; self.mapExpression.isSideEffectFree()&#xD;&#xA; else&#xD;&#xA; true&#xD;&#xA; endif"/>
<details key="GroupByIteratorsMustHaveDistinctNames" value="self.dimensions.iterator->asSet()->union(self.groupedFacts->asSet())->union(self.fact->asSet())->forAll(i, j | i&lt;>j implies i.name&lt;>j.name)"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="GroupedFactsIteratorMustExistIfMapExpressionExists MapExpressionMustBeSideEffectFree GroupByIteratorsMustHaveDistinctNames"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="dimensions" lowerBound="1"
upperBound="-1" eType="#//analytics/DimensionDefinition" containment="true"
eOpposite="#//analytics/DimensionDefinition/groupBy"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="fact" lowerBound="1"
eType="ecore:EClass behavioral.ecore#//actions/Iterator" containment="true"
eOpposite="behavioral.ecore#//actions/Iterator/factOfGroupBy"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="mapExpression" eType="#//expressions/Expression"
containment="true" eOpposite="#//expressions/Expression/mapExpressionOfGroupBy"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="groupedFacts" eType="ecore:EClass behavioral.ecore#//actions/Iterator"
containment="true" eOpposite="behavioral.ecore#//actions/Iterator/groupedFactsOfGroupBy"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="DimensionDefinition">
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
<details key="documentation" value="A dimension definition is not named. It owns a named iterator that can be used by the mapExpression."/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="DimensionExpressionMustBeSideEffectFree" value="self.expression.isSideEffectFree()"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="DimensionExpressionMustBeSideEffectFree"/>
</eAnnotations>
<eOperations name="getName" ordered="false" unique="false" lowerBound="1" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EString">
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
<details key="body" value="self.iterator.name"/>
</eAnnotations>
<eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
<details key="constraints" value="body"/>
</eAnnotations>
</eOperations>
<eStructuralFeatures xsi:type="ecore:EReference" name="groupBy" lowerBound="1"
eType="#//analytics/GroupBy" transient="true" eOpposite="#//analytics/GroupBy/dimensions"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="expression" lowerBound="1"
eType="#//expressions/Expression" containment="true" eOpposite="#//expressions/Expression/dimension"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="iterator" lowerBound="1"
eType="ecore:EClass behavioral.ecore#//actions/Iterator" containment="true"
eOpposite="behavioral.ecore#//actions/Iterator/dimension"/>
</eClassifiers>
</eSubpackages>
</ecore:EPackage>