Subject:
|
[omg] [QVT13] Ballot #5 is ready for review until Wed, 28 Oct 2015 04:00 GMT.
|
Date:
|
Thu, 22 Oct 2015 02:29:45 -0400 (EDT)
|
From:
|
QVT 1.3 RTF (No Reply)
<jira+qvt-rtf@xxxxxxx>
|
To:
|
qvt-rtf@xxxxxxx
|
Ballot #5 — QVT 1,3 RTF Ballot 4
Hello Task Force Members:
Ballot #5 is opening soon and the issues are ready to be reviewed.
Issues:
12
Ballot Opens:
Wed, 28 Oct 2015 04:00 GMT
Ballot Closes:
Fri, 6 Nov 2015 04:59 GMT
All dates are UTC
Please note the following excerpt from OMG Policies and Procedures: "A Representative on the F/RTF who fails to vote in a contiguous sequence of at least two polls that complete during a period of at least two weeks is automatically removed from the F/RTF.
A proxy vote or a vote of abstain is considered a vote for this purpose." (document pp/14-06-04, section 4.4.1.3)
Task Force Members who are awaiting approval will not be able to register their votes until they are approved.
Issues Summary
Issues Descriptions
Title:
Relations Language: how will metamodels get into a transformation scrip
Summary:
Concerning to Relations Language, how will the metamodels get into a transformation script ? Is there a technique similar to Operational Mappings using metamodel declaration and modeltypes ? The RL sample transformation script
in annex A.1 (pp 164) doesn't declare the metamodels. The OM sample (A.2.3) does. There is some syntax for declaring and using metamodels and modeltypes in OM (pp118), there isn't for RL (pp38).
Source:
ptc/07-07-07 — Chapter/Section: 7 — Page Number/s: 13ff
Legacy Issue Number:
12213
Reporter:
Siegfried Nolte, Siegfried Nolte (siegfried@xxxxxxxxxxxxxxxxxx)
Reported:
Wed, 6 Feb 2008 05:00 GMT on
QVT 1.0
Updated:
Wed, 21 Oct 2015 09:17 GMT
Discussion:
QVT13-6
Summary:
Relations Language: how will metamodels get into a transformation scrip
Concerning to Relations Language, how will the metamodels get into a transformation script ? Is there a technique similar to Operational Mappings using metamodel declaration and modeltypes ? The RL sample transformation script
in annex A.1 (pp 164) doesn't declare the metamodels. The OM sample (A.2.3) does. There is some syntax for declaring and using metamodels and modeltypes in OM (pp118), there isn't for RL (pp38).
Discussion
We needs to support definition of e.g. UML in
transformation umlToRdbms(uml:UML, rdbms:RDBMS)
But we actually may want to reference a document URI or namespace URI
But the current syntax is essentially a Java import without the trailing * option.
It cannot reference URIs and it has the wrong separator.
Something similar to QVTo's ModelType is needed:
modeltype UML uses SimpleUml ("http:);
However ModelType has many problems that we do not need to replicate:
§
it is a Class; absolutely not
§
it supports strict/effective inside rather than outside the program
§
it has undefined URI usage
Conversely Complrete OCL has a requirement for an import too, and here ModelType's are not appropriate at all.
Let's fix up import.
Revised Text:
In 7.1 replace
transformation umlRdbms (uml : SimpleUML, rdbms : SimpleRDBMS) {
by
import SimpleUML : 'http:
transformation umlRdbms (uml : SimpleUML, rdbms : SimpleRDBMS) {
Insert before 7.1.1
7.1.1 Import statements
An import statement introduces definitions of unqualified, or first qualifier names for resolution as if defined at the root package of the transformation.
The import of a document URI (such as http://www.omg.org/spec/UML/20131001/UML.xmi) makes the root element (the
UML Package) available to resolve references (to
UML). Additionally, the optional alias (SimpleUML) also makes the root element available to resolve references to the alias name.
Alternatively the import of a namespace URI (such as
http://www.omg.org/spec/UML/20131001) makes the referenced element available in a similar way. It is not specified how an implementation locates elements corresponding
to namespace URIs or how it distinguishes namespace URI access from document URI access. (A plausible implementation maintains a catalog of known namespace URIs to support their resolution leaving everything else to be interpreted as a document URI.)
The import may use further qualification such as
'http://www.omg.org/spec/UML/20131001'::Activities to provide a finer grained import. A trailing wildcard as in
'http://www.omg.org/spec/UML/20131001'::* imports all names defined by the reference preceding the wild card. For UML, this is the Packages
Actions, Activities,
Classification, ... . An alias and a wildcard cannot be used together.
In 7.13.5 replace
<topLevel> ::= ('import' <unit> ';' )* <transformation>*
<unit> ::= <identifier> ('.' <identifier>)*
by
<topLevel> ::= <import>* <transformation>*
<import> ::= 'import' [<identifier> ':'] <URI> ('::' <identifier>)* ['::*'] ';'
<URI> ::= #x27 StringChar* #x27
In 9.18 replace
TopLevel ::= (Transformation | Mapping | Query)*
by
TopLevel ::= Import* (Transformation | Mapping | Query)*
Import ::= 'import' [simpleNameCS ':'] <URI> ('::' simpleNameCS)* ['::*'] ';'
<URI> ::= #x27 StringChar* #x27
Extent Of Change:
Minor
Created:
Wed, 14 Oct 2015 20:03 GMT
Updated:
Wed, 21 Oct 2015 09:17 GMT
Discussion:
QVT13-131
Title:
MOF-QVT 1.0: 7.11.3.6 (and 7.11.1.1) BlackBox operation signature difficulties
Summary:
In 7.11.3.6 (and 7.8) the ordering of parameters is implied but not explicit. Presumably the first is the output (enforced direction) so:
package QVTBase
context TypedModel
def: allUsedPackage() : Set(EMOF::Package)
= self.dependsOn.allUsedPackage()>asSet()>union(self.usedPackage)
endpackage
package QVTRelation
context RelationImplementation
inv RootNodeIsBoundToRootVariable : self.inDirectionOf.allUsedPackage()>includes(self.impl.ownedParameter>at(1).type._package)
endpackage
This is not satisfied by almost the last line of RelToCore in 10.3:
enforce domain core me:OclExpression{} implementedby CopyOclExpession(re, me);
which seems to have output second.
-----------------------------------------------------
More significantly CopyOclExpession(re, me) is not meaningful as a black box signature, since it is a static function and EMOF has no way to define static functions. Perhaps it is a query, for which the declaration was omitted
from the example. If this is the case, it should be made clear that black box operations must be declared internally as queries and bound externally to static operations of the transformation.
This semantic clumsiness could be resolved, if, within a transformation,
relation, domain or query, self is bound to a transformation instance. Queries would then be normal non-static operations of the transformation (class) and the implementedBy operation call would be a normal implicit call via self of a non-static transformation
operation or query. (A RelationCallExp would also deviate less from OCL than it currently does.) This would also allow a transformation to extend a Utility class that provided the required black box operations. Since queries and relations are declarative,
it is not obvious that there need be any prohibition on the content of an extended Class; if the Class has properties, these cannot mutate during a query or relation match, so the properties are ok; they might even permit useful behavioural tailoring. For
instance an 'inherited' Boolean mangledNames property could influence the mapping of names between input and output.
The RelToCore example can then be mended by declaring that:
RelToCore(...) extends utils::CopyUtilities
and externally binding the utils model name to a package that has a CopyUtilities class with suitable a CopyOclExpession operation.
Legacy Issue Number:
13054
Reporter:
Ed Willink, Model Driven Solutions (ed@xxxxxxxxxxxxx)
Reported:
Fri, 31 Oct 2008 04:00 GMT on
QVT 1.0
Updated:
Wed, 21 Oct 2015 08:59 GMT
Discussion:
QVT13-7
Summary:
7.11.3.6 (and 7.11.1.1) BlackBox operation signature difficulties
In 7.11.3.6 (and 7.8) the ordering of parameters is implied but not explicit. Presumably the first is the output (enforced direction) so:
package QVTBase
context TypedModel
def: allUsedPackage() : Set(EMOF::Package)
= self.dependsOn.allUsedPackage()>asSet()>union(self.usedPackage)
endpackage
package QVTRelation
context RelationImplementation
inv RootNodeIsBoundToRootVariable : self.inDirectionOf.allUsedPackage()>includes(self.impl.ownedParameter>at(1).type._package)
endpackage
This is not satisfied by almost the last line of RelToCore in 10.3:
enforce domain core me:OclExpression{} implementedby CopyOclExpession(re, me);
which seems to have output second.
-----------------------------------------------------
More significantly CopyOclExpession(re, me) is not meaningful as a black box signature, since it is a static function and EMOF has no way to define static functions. Perhaps it is a query, for which the declaration was omitted
from the example. If this is the case, it should be made clear that black box operations must be declared internally as queries and bound externally to static operations of the transformation.
This semantic clumsiness could be resolved, if, within a transformation,relation, domain or query, self is bound to a transformation instance. Queries would then be normal non-static operations of the transformation (class) and
the implementedBy operation call would be a normal implicit call via self of a non-static transformation operation or query. (A RelationCallExp would also deviate less from OCL than it currently does.) This would also allow a transformation to extend a Utility
class that provided the required black box operations. Since queries and relations are declarative, it is not obvious that there need be any prohibition on the content of an extended Class; if the Class has properties, these cannot mutate during a query or
relation match, so the properties are ok; they might even permit useful behavioural tailoring. For instance an 'inherited' Boolean mangledNames property could influence the mapping of names between input and output.
The RelToCore example can then be mended by declaring that:
RelToCore(...) extends utils::CopyUtilities
and externally binding the utils model name to a package that has a CopyUtilities class with suitable a CopyOclExpession operation.
Discussion
Binding self to a Transformation instance may conflict with
self as the context in a query. Much safer to bind this; just like QVTo.
Using this as the source of an OperationCallExp of a query eliminates an incompatibility with OCL. But there is no need bloat every RelationCallExp with an extra VariableExp for
this.
Any enhancement here needs prototyping.
Created:
Wed, 14 Oct 2015 16:14 GMT
Updated:
Wed, 21 Oct 2015 08:59 GMT
Discussion:
QVT13-129
Title:
element creation and element attachment/detachment to/from an extent
Summary:
Suggestion: In the Operational Mappings language, element creation and element attachment/detachment to/from an extent should be seen and treated as two different and independent activities. Once an element is created via an ObjectExp,
this element is usually attached to another element immediately afterwards, which becomes its container, so the ObjectExp semantics of assigning it to an explicit or inferred extent becomes an unnecessary overhead. And also there are other times when we need
to assign to an extent some model elements that may have been created at an unrelated time. They could even exist prior to the transformation execution. A case where this is relevant is with the result of a 'Element::clone()' or 'Element::deepclone()' operation
execution. Is it expected that these model elements must belong by default to the same model as the original? How to clone parts of an extent with direction kind == 'in'? How to make them become part of the Set of root elements of another, different extent?
Source:
formal/08-04-03 — Chapter/Section: 8.2.1.24 — Page Number/s: 86-87
Legacy Issue Number:
13103
Reporter:
Victor Sanchez, Open Canarias, SL (vsanchez@xxxxxxxxxxxxxxxx)
Reported:
Fri, 21 Nov 2008 05:00 GMT on
QVT 1.0
Updated:
Wed, 21 Oct 2015 05:50 GMT
Discussion:
QVT13-9
Summary:
element creation and element attachment/detachment to/from an extent
Suggestion: In the Operational Mappings language, element creation and element attachment/detachment to/from an extent should be seen and treated as two different and independent activities. Once an element is created via an ObjectExp,
this element is usually attached to another element immediately afterwards, which becomes its container, so the ObjectExp semantics of assigning it to an explicit or inferred extent becomes an unnecessary overhead. And also there are other times when we need
to assign to an extent some model elements that may have been created at an unrelated time. They could even exist prior to the transformation execution. A case where this is relevant is with the result of a 'Element::clone()' or 'Element::deepclone()' operation
execution. Is it expected that these model elements must belong by default to the same model as the original? How to clone parts of an extent with direction kind == 'in'? How to make them become part of the Set of root elements of another, different extent?
Discussion
This seems to be a misunderstanding. ObjectExp does not require a created object to be attached to an inferred extent.
This functionality seems to be present already.
Creation without attachment requires a null or null-valued extent during creation.
Attachment after creation can occur through an ObjectExp update to the required extent.
Re-attachment presumably occurs through an ObjectExp update to the new extent.
Detachment then naturally occurs through an ObjectExp update to a null-valued extent.
This issue inspired the provision of a better desciption of extents. The resolution is therefore merged with that of
QVT-36.
See Issue
QVT13-36 for disposition
Created:
Mon, 12 Oct 2015 18:57 GMT
Updated:
Wed, 21 Oct 2015 05:50 GMT
Discussion:
QVT13-119
Title:
Unclear transformation rooting condition
Summary:
"The starting point is a major flaw in all three QVT languages at present and enabled Perdita Stevens to correctly conclude in
http://www.springerlink.com/content/9x368617317l3q87/ that QVTr and QVTc are incompatible. QVT currently provides no way to distinguish whether for instance a check-mode transformation is a
query of whether a transformed input pattern can be discovered in the output (e.g. a database lookup), or a validation that the transformed input exactly matches the output (e.g. an already transformed check). Both facilities are useful and so when a QVT transformation
is invoked the invoker needs to specify what I call the 'rooting' condition in addition to the direction
Legacy Issue Number:
15411
Reporter:
Ed Willink, Model Driven Solutions (ed@xxxxxxxxxxxxx)
Reported:
Tue, 10 Aug 2010 04:00 GMT on
QVT 1.1
Updated:
Wed, 21 Oct 2015 08:35 GMT
Discussion:
QVT13-18
Summary:
Unclear transformation rooting condition
"The starting point is a major flaw in all three QVT languages at present and enabled Perdita Stevens to correctly conclude in
http://www.springerlink.com/content/9x368617317l3q87/ that QVTr and QVTc are incompatible. QVT currently provides no way to distinguish whether for instance a check-mode transformation is a
query of whether a transformed input pattern can be discovered in the output (e.g. a database lookup), or a validation that the transformed input exactly matches the output (e.g. an already transformed check). Both facilities are useful and so when a QVT transformation
is invoked the invoker needs to specify what I call the 'rooting' condition in addition to the direction
Discussion
We need a much simpler principled exposition of the intent of QVTc/QVTr. Since Perdita has correctly come to such unwelcome conclusions, we clearly have a problem. The new statement should be uncontroversial and therefore provide
a reference against which subsequent text can be assessed.
The following is perhaps what is needed, but needs more discussion with QVTr users and prototyping of its implications.
In Section 6.3 replace
The semantics of the Core language (and hence the Relations language) allow for the following execution scenarios:
• Check-only transformations to verify that models are related in a specified way.
• Single direction transformations.
• Bi-directional transformations. (In fact more than two directions are possible, but two is the most common case.)
• The ability to establish relationships between pre-existing models, whether developed manually, or through some other
tool or mechanism.
• Incremental updates (in any direction) when one related model is changed after an initial execution.
• The ability to create as well as delete objects and values, while also being able to specify which objects and values must
not be modified.
by

A Declarative QVT transformation capability establishes a correspondence between source objects in one or more source models and transformed objects in one or more transformed models. The correspondence may be used to check or
enforce a view of, or a transformation to, target objects in one or more target models.
The correspondence takes the form of trace data comprising a set of trace records. Each trace record identifies a relationship to one or more transformed objects from, one or more, source or transformed, objects or values. The
production of each transformed object is traced by exactly one trace record. The trace data includes relationships for all satisfied constraints imposed by the language constructs that express the transformation program. No relationships for satisfiable constraints
are omitted from the trace data.
In practice a Core language (and hence the Relations language) transformation is executed after a form, mode and direction have been selected.
There are two main forms of QVT execution:
§
For a Transformation execution, there is an exactly 1:1 mapping between the transformed objects and the target objects.
§
For a View execution, there is an exactly 1:1 mapping between the transformed objects and the target objects in the view. There may be further target objects outside the view that are unaffected by the execution.
Additionally, for a Query execution, an OCL query is executed on the trace data. No actual target models are required.
There are three modes of execution:
§
An enforced View or Transformation execution coerces the target objects to correspond to the transformed objects. (This is most simply achieved by model replacement, but may be realized by executing a series of changes so that
desirable extra-model considerations such as xmi:id preservation or minimal database activity are accommodated.)
§
A check execution is a degenerate Query execution that just returns true or false according to the existence of the trace data. (An optimized execution capability may bypass the creation of the transformed objects and look for
correspondence between source and target objects directly.)
§
An update Query, View or Transformation execution compares an old correspondence between source objects and transformed objects with a new correspondence between changed source objects and correspondingly changed transformed objects.
The correspondence changes may be used to enforce or check for corresponding creations, deletions and updates in the target objects.
Additionally an in-place update View or Transformation execution shares source and target models and so each source object is coerced to correspond to its transformed equivalent. (This can be naively achieved by model copy. An
optimized execution may bypass the creation of the transformed objects by performing each source read before any corrupting write.)
The declarative transformation languages do not have fixed sources and targets, rather they have multiple domains some of which may be designated sources and others as targets. The direction of the transformation is chosen by selecting
the domain to be used as a target.
§
A unidirectional transformation has just a single choice of direction since only one domain is able to be used as the target
§
For a bi-directional, and more generally a multi-directional transformation, the domain used as the target may be selected
In practice it is often difficult to satisfy the bijective requirements of bidirectional execution and so many transformations are just unidirectional.
Created:
Tue, 13 Oct 2015 15:13 GMT
Updated:
Wed, 21 Oct 2015 08:35 GMT
Discussion:
QVT13-123
Title:
Trace data for an 'accessed' transformation
Summary:
The spec should clarify the interaction of
1.) explicit instantiation + execution of 'accessed' transformations, and
2.) trace records / resolving.
The following questions are of interest:
How does the initial trace for an 'accessed' transformation look like? Does it reuse the records previously created by the 'accessing' transformation, or does an 'accessed' transformation always start on an empty trace?
How does an 'accessed' transformation affect the trace? Are the trace records post-visible that were created during execution of the 'accessed' transformation, or is the trace of the 'accessing' transformation unchanged?
Both issues heavily affect the results of resolve-operations. Resolving object references after executing an 'accessed' transformation would be very practical.
Source:
formal/11-01-01 — Chapter/Section: 8.2.1.4 ModuleImport — Page Number/s: 83
Legacy Issue Number:
18323
Reporter:
Christopher Gerking, campus.upb.de (cgerking@xxxxxxxxxxxxx)
Reported:
Thu, 27 Dec 2012 05:00 GMT on
QVT 1.1
Updated:
Wed, 21 Oct 2015 05:59 GMT
Discussion:
QVT13-22
Summary:
Trace data for an 'accessed' transformation
The spec should clarify the interaction of
1.) explicit instantiation + execution of 'accessed' transformations, and
2.) trace records / resolving.
The following questions are of interest:
How does the initial trace for an 'accessed' transformation look like? Does it reuse the records previously created by the 'accessing' transformation, or does an 'accessed' transformation always start on an empty trace?
How does an 'accessed' transformation affect the trace? Are the trace records post-visible that were created during execution of the 'accessed' transformation, or is the trace of the 'accessing' transformation unchanged?
Both issues heavily affect the results of resolve-operations. Resolving object references after executing an 'accessed' transformation would be very practical.
Discussion
The resolution of
QVT13-23 makes clear that the trace data contains a trace record for every mapping.
See Issue
QVT13-23 for disposition
Created:
Sat, 10 Oct 2015 17:13 GMT
Updated:
Sat, 10 Oct 2015 17:13 GMT
Discussion:
QVT13-103
Title:
No trace data for disjuncting mapping
Summary:
Trace data creation is specified to happen "at the end of the initialization section".
For disjuncting mappings, the initialization section is never executed, which prevents any trace data from being stored.
As a consequence, no resolution via resolve-in-expressions is possible on the disjuncting mapping, due to the missing trace record. This is problematic, since disjunction should be transparent from a resolver's point of view, i.e.
it should not make a difference for resolution whether a mapping disjuncts or not.
Hence, some clarification is required whether trace records are deliberately avoided for disjuncting mappings (for whatever reason), or whether trace data must be created in another place than the init section in case of a disjuncting
mapping.
Source:
formal/11-01-01 — Chapter/Section: 8.2.1.15 MappingOperation — Page Number/s: 93
Legacy Issue Number:
18324
Reporter:
Christopher Gerking, campus.upb.de (cgerking@xxxxxxxxxxxxx)
Reported:
Thu, 27 Dec 2012 05:00 GMT on
QVT 1.1
Updated:
Wed, 21 Oct 2015 15:32 GMT
Discussion:
QVT13-23
Summary:
No trace data for disjuncting mapping
Trace data creation is specified to happen "at the end of the initialization section".
For disjuncting mappings, the initialization section is never executed, which prevents any trace data from being stored.
As a consequence, no resolution via resolve-in-expressions is possible on the disjuncting mapping, due to the missing trace record. This is problematic, since disjunction should be transparent from a resolver's point of view, i.e.
it should not make a difference for resolution whether a mapping disjuncts or not.
Hence, some clarification is required whether trace records are deliberately avoided for disjuncting mappings (for whatever reason), or whether trace data must be created in another place than the init section in case of a disjuncting
mapping.
Discussion
It seems the 8.1.x section on Tracing never got written. Time for a thorough review and clarification.
Trace lookups by source objects treat context and all in/inout parameters as source objects.
Trace lookups by target objects treat all out/inout and result parameters as target objects.
Trace lookups by mapping allow either disjuncting mapping or candidate mapping to be used as the mapping selection.
If re-execution is to be completely suppressed and fully re-use a previous execution, the output trace should be the final outputs, but the existing text is clear that it is the preliminary outputs at the end of the initialization
section. The earlier trace gives a slightly different semantics that requires the population section to modify the created object after it is traced and allows the population section to use the trace. This is different but fine when explained clearly.
References to 8.1.12 refer to the new text from the
QVT13-99 resolution.
Revised Text:
In 8.1.4 change
{
init { … }
population { … }
end { … }
}
to
{
init { … }
population { … }
end { … }
}
In 8.1.4 replace
Between the initialization and the population sections, there is an implicit section, named the instantiation section, which
creates all output parameters that have a null value at the end of the initialization section. This means that, in order to
return an existing object rather than creating a new one, one simply needs to assign the result parameter within the
initialization section.
by
Before the init, there is an implicit section, named the pre-trace section, which suppresses redundant re-execution of a mapping.
Following the init and before the population sections, there is an implicit section, named the instantiation section, which creates all output parameters that have a null value at the end of the initialization section.
The null value tests mean that, in order to return an existing object rather than creating a new one, one simply needs to assign the result parameter within the
init section.
Following the instantiation section, a further implicit section, named the post-trace section creates the trace record of the execution.
In 8.1 before 8.1.10 Add a new section
8.1.x Tracing and Resolving
Execution of a mapping establishes a trace record to maintain the relationship between its context object and the result object or objects. This relationship can be queried using one of the eight
resolve expressions.
8.1.x.1 Trace Records
Execution of a transformation builds the overall
trace-data which comprises a sequence of trace-records; one for each mapping execution in execution order. This includes every mapping executed by, accessed or extended, transformations or libraries, but not those by transformation invocations.
Each trace-record comprises:
§
context-parameter - the context parameter object
§
in-parameters - the in and inout parameter objects or values
§
invoked-mapping - the invoked mapping operation
§
executed-mapping - the executed mapping operation
§
out-parameters - the out parameter objects or values
§
result-parameters - the result parameter object or objects
The invoked-mapping and executed-mapping operations may differ when a
disjuncting mapping is executed. The invoked-mapping is the
disjuncting mapping. The executed-mapping is the successfully selected
candidate mapping or null.
inout parameters are traced once as in-parameters; they cannot change during production of the trace-record.
The trace-record is created during the post-trace section of the selected
candidate mapping, which is after the initialization and instantiation sections and before the population section.
A trace-record is created by every mapping execution, unless predicates or initialization section fail.
A trace-record is created or re-used by every mapping invocation, unless predicates or initialization section fail. In the case of a standard mode execution for which no candidate mapping is selected, the
executed-mapping, out-parameters and result-parameters are
null.
The following example mapping declarations
mapping X::disjunctingMapping(in p1:P1, inout p2:P2, out p3:P3) : r1:R1, r2:R2
disjuncts mappingName, ... {}
mapping X::mappingName(in p1:P1, inout p2:P2, out p3:P3) : r1:R1, r2:R2 ..{...}
may be invoked as
var t := anX.map disjunctingMapping(aP1, aP2, aP3);
var anR1 := t.r1;
var anR2 := t.r2;
to create the following trace-record. (Hyphens are used in names that are helpful for exposition, but which are not accessible to program code.)
object Trace-Record {
context-parameter := anX;
in-parameters := Sequence{aP1, aP2};
invoked-mapping := X::disjunctingMapping;
executed-mapping := X::mappingName;
out-parameters := Sequence{aP3};
result-parameters := Sequence{anR1, anR2};
}
The trace-record traces the relationship between mapping inputs and outputs; between the inputs {anX, aP1, aP2} and the outputs {aP3, anR1, anR2}.
Note that there is no trace for object construction in helpers or for nested object construction in mappings. If a trace of all objects is needed, a mapping must be used to create each object as a mapping output.
8.1.x.2 The pre-trace, instantiation and post-trace sections
The auto-generated pre-trace, instantiation and post-trace sections occurs surround the initialization section of a mapping, whose general structure is:
mapping X::mappingName(in p1:P1, inout p2:P2, out p3:P3) : r1:R1, r2:R2
when { … }
where { … }
{
var trace-records := trace-data
->select(executed-mapping=X::mappingName)
->select(context-parameter=self)
->select(in-parameters->at(1)=p1)
->select(in-parameters->at(2)=p2);
if (trace-records->notEmpty()) {
var trace-record := trace-records->at(1);
p3 := trace-record.out-parameters->at(1);
r1 := trace-record.result-parameters->at(1);
r2 := trace-record.result-parameters->at(2);
return;
};
init { … }
if (p3 == null) p3 := object P3{};
if (r1 == null) r1 := object R1{};
if (r2 == null) r2 := object R2{};
trace-data += object Trace-Record{
context-parameter:=self,
in-parameters:=Sequence{p1, p2},
invoked-mapping:=X::dislunctingName,
executed-mapping:=X::mappingName,
out-parameters:=Sequence{p3},
result-parameters:=Sequence{r1,r2}
};
population { … }
end { … }
}
In the pre-trace section, the trace-data is consulted to locate all
trace-records whose executed-mapping, context-parameter and
in-parameters match the new candidate mapping invocation. If a match is found, the previous
out-parameters and result-parameters are used as the mapping return values and the mapping re-execution is suppressed.
Then the initialization section provides an opportunity for the default
null values of outputs to be replaced by something more useful. If the
null values are unchanged, the instantiation section constructs an object for each object. inout parameters may not be changed during the initialization section.
The post-trace section records the execution of the mapping by adding a
trace-record to the trace-data.
A candidate mapping execution is suppressed to avoid creating a
trace-record whose context-parameter, in-parameters,
invoked-mapping and executed-mapping fields duplicate another trace-record already in the
trace-data. When comparing trace-record fields, Class instances are compared as objects without regard for their content, and DataType values are compared by deep value equality. Traced object instances may therefore be modified between mapping
executions without inhibiting detection of re-execution since only the object references are traced. However any modification of a traced DataType value such as a List inhibits detection of a re-execution since the entire value is traced.
When a re-execution attempt is detected, the re-execution is suppressed without any additional
trace-record being created. Note that traced Class instances are mutable and so the re-used value may have changed in the interim.
8.1.x.3 resolve() - Resolution of target objects by Type
The trace data may be queried to identify all target objects using the
resolve operation without a context object or argument.
The query may be restricted to identifying all target objects conforming to a given type by adding a type argument.
The returned target objects may be restricted to those mapped from a particular source object by supplying the source object as the context object.
Additionally, or alternatively, the returned target objects may be restricted by an OCL condition.
source.resolve(t : Table | t.name.startsWith('_'))
These queries return a sequence of target objects in mapping invocation order.
An equivalent OCL-like query for SOURCE.resolve(T : TYPE | CONDITION) is
let selectedRecords = trace-data->select(in-parameters->including(context-parameter)->includes(SOURCE)) in
let selectedTargets = selectedRecords->collect(out-parameters->union(result-parameters)) in
selectedTargets->selectByKind(TYPE)->select(T | CONDITION)
8.1.x.4 resolveIn() - Resolution of target objects by Mapping
The trace data may be queried to identify all target objects produced by a given invoked disjuncting mapping or executed candidate mapping using the
resolveIn _expression_.
The returned target objects may be restricted to those mapped from a particular source object by supplying the source object as the context object.
source.resolveIn(Class2Table)
Additionally, or alternatively, the returned target objects may be restricted by an OCL condition.
source.resolveIn(Class2Table, t : Table | t.name.startsWith('_'))
These queries return a sequence of target objects in mapping invocation order.
An equivalent OCL-like query for SOURCE.resolveIn(MAPPING, T : TYPE | CONDITION) is
let selectedRecords1 = trace-data->select(in-parameters->including(context-parameter)->includes(SOURCE)) in
let selectedRecords2 = selectedRecords1->select((invoked-mapping = MAPPING) or (executed-mapping = MAPPING)) in
let selectedTargets = selectedRecords2->collect(out-parameters->union(result-parameters)) in
selectedTargets->selectByKind(TYPE)->select(T | CONDITION)
8.1.x.5 invresolve() - Resolution of source objects by Type or Mapping
The corresponding inverse queries are available using the
invresolve or invresolveIn expressions. These identify source objects mapped to a given type or by a given mapping.
invresolve()
invresolve(Class) Class
target.invresolve()
target.invresolve(c : Class | c.name.startsWith('_'))
invresolveIn(Class2Table) for
target.invresolveIn(Class2Table)
target.invresolveIn(Class2Table, c : Class | c.name.startsWith('_'))
8.1.x.6 resolveone() - Resolution of a single source or target object by Type or Mapping
The four resolveone variants of the four
resolve expressions modify the return to suit the common case where only a single object is expected. The return is therefore the first resolved object or
null.
resolveone()
resolveone(Table)
source.resolveone()
source.resolveone(t : Table | t.name.startsWith('_'))
resolveoneIn(Class2Table)
source.resolveoneIn(Class2Table)
source.resolveoneIn(Class2Table, t : Table | t.name.startsWith('_'))
invresolveone()
invresolveone(Class) Class
target.invresolveone()
target.invresolveone(c : Class | c.name.startsWith('_'))
invresolveoneIn(Class2Table) for
target.invresolveoneIn(Class2Table)
target.invresolveoneIn(Class2Table, c : Class | c.name.startsWith('_'))
8.1.x.7 Late resolution
The resolve expressions query the prevailing state of the
trace data. resolve cannot of course return results from mappings that have yet to execute and so careful programming of mapping invocations may be required to ensure that required results are available when needed. Alternatively a
late keyword may prefix resolve when the resolution occurs within an assignment. This defers the execution of the assignment and the partial computation involving
late resolve's until all mapping executions have completed. The deferred assignment cannot return the future value; it therefore returns a
null value.
More precisely, mappings execute, assignment right hand sides involving late resolutions are computed, then finally deferred assignments are made. The ordering in which late resolutions occur does not matter, since each late resolution
can influence only its own deferred assignment.
myprop := mylist->late resolve(Table);
for
This last example also demonstrates that an implicit imperative xcollect of resolutions may be performed, in this case requiring the collection to be performed after all mappings have executed.
8.1.x.8 Persisted Trace Data
The trace data may be persisted and reloaded to support a re-execution. However the
trace record does not trace configuration data, transformation properties or intermediate data, and does not involve a deep clone of every traced object. It is therefore not possible to use a persisted form of the
trace data to support incremental re-execution of an arbitrary QVTo transformation since the required object state may not be present in persisted trace. A well-behaved transformation that avoids dependence on mutable object properties or other untraced
facilities may be re-executable.
In 8.2.1.15 Correct
A mapping operation is an operation implementing a mapping between one or more source model elements-
intoand one or
more target model elements.
In 8.2.1.15 Replace
The when clause acts either as a pre-condition or as a guard, depending on the invocation mode of the mapping
operation.
by
The when clause acts either as a pre-condition when invoked with strict semantics, or as a guard, when invoked using standard semantics.
In 8.2.1.15 Replace
The initialization section is used for computation prior to the effective instantiation of the outputs. The population section is used to populate the outputs and the finalization section is used to define termination computations
that take place before exiting the body.
by
The init (initialization) section is used for computation prior to the effective instantiation of the outputs. The
population section is used to populate the outputs and the end (finalization) section is used to define termination computations that take place before exiting the body.
In 8.2.1.15 Replace
There are three reuse and composition facilities associated to mapping operations:
by
A mapping operation may be explicitly defined as a disjunction of candidate mapping operations. Every mapping operation is also an implicit disjunction of all mappings that are overloads as a consequence of matching name and argument
count. Execution of a disjunction involves selecting the first candidate mapping whose when clause and other predicates are satisfied and then invoking it. This is described in Section 8.1.12. The empty body of the disjuncting mapping is not executed.
Additionally, there are two extension mechanisms associated to mapping operations:
In 8.2.1.15 Replace
3. A mapping operation may be defined as a disjunction of other mapping operations. This means selecting, among the
set of disjuncted mappings, the first that satisfies the when clause and then invoking it. The execution semantics subsection
below provides the details of these reuse facilities.
by
The execution semantics subsection below provides the details of these mapping extension mechanisms.
In 8.2.1.15 Constraints add
The body of a disjuncting mapping must be empty.
disjunct->notEmpty() implies body = null
In 8.2.1.15 Replace
We first define the semantic of the execution of a mapping operation in absence of any reuse facility (inheritance, merge, and disjunction), then we describe the effect of using these facilities.
by
We firstly define the semantic of the execution of a mapping operation in the absence of any inheritance or merge reuse facility.
In 8.2.1.21 Replace
Indicates the mode of the mapping invocation.
by
Indicates whether the mapping invocation mode is strict or standard.
In 8.2.1.21 Replace
In strict mode the when clause is evaluated as a pre-condition. In contrast, when the mapping is invoked in standard mode, the execution of the mapping body is skipped and the null value is returned to the caller.
by
In strict mode, failure to evaluate the when clause as a pre-condition causes the mapping execution to fail. In contrast in standard mode, failure to evaluate the when clause as a guard causes execution of the mapping body to be
skipped and null to be returned to the caller.
In 8.2.1.21 Correct
The map and xmap keywords may be called on a
listcollection as source
In 8.2.1.22 Correct
where the <resolve_op> is one of the following: resolve,
resolveone, invresolve, and invresolveone.
In 8.2.1.22 Correct
When isDeferred is true the
latelate keyword is used before the
operation name<resolve_op>.
In 8.2.1.22 Correct
The resolution operator may be called on a
listcollection. This is a shorthand for invoking it in the body of
a ForExpan xcollect ImperativeIterateExp _expression_.
In 8.2.1.22 Replace
// shorthand for mylist->forEach(i) { i.late resolve(Table); }
by
// shorthand for mylist->xcollect(late resolve(Table))
Extent Of Change:
Significant
Created:
Sat, 10 Oct 2015 10:14 GMT
Updated:
Wed, 21 Oct 2015 16:01 GMT
Discussion:
QVT13-102
Title:
xcollect is ambiguously flattened
Summary:
xcolect is specified to like collect, which flattens, however the xcollect pseudocode does not flatten.
Source:
formal/11-01-01 — Chapter/Section: 8.2.2.7 — Page Number/s: 109
Legacy Issue Number:
19177
Reporter:
Ed Willink, Model Driven Solutions (ed@xxxxxxxxxxxxx)
Reported:
Thu, 9 Jan 2014 05:00 GMT on
QVT 1.1
Updated:
Thu, 22 Oct 2015 04:25 GMT
Discussion:
QVT13-34
Summary:
xcollect is ambiguously flattened
xcollect is specified to like collect, which flattens, however the xcollect pseudocode does not flatten.
Discussion
Ditto xcollectselect, xcollectselectOne
Once an attempt is made to put the pseudo-code through Eclipse QVTo, it is quite amazing how many different errors there are.
§
spurious source/iterator arguments
§
missing compute open {
§
increarect non-collection returns
§
incorrect accommodation of ordered collections
§
no flattening
§
no single values
§
use of mutable Sequence rather than List
Revised Text:
In 8.2.2.7 ImperativeIterateExp Collection(T)::xcollect(source, iterator, body) replace
Collection(T)::xcollect(source, iterator, body) : Sequence(TT) =
compute (res:Sequence(TT) := Sequence{})
source->forEach (iterator:T) {
var target : TT := body;
if (target<>null) res += target;
};
Collection(T)::xselect(source, iterator, condition) : Sequence(T) =
compute (res:Sequence(T) := Sequence{})
source->forEach (iterator:T) {
var target : T := iterator;
if (target<>null and condition) res += target;
};
Collection(T)::xselectOne(source, iterator, condition) : Sequence(T) =
compute (res:Sequence(T) := Sequence{})
source->forEach (iterator:T) {
var target : T := iterator;
if (target<>null and condition) {res += target; break;}
};
Collection(T)::xcollectselect(source, iterator, target, body, condition) : Sequence(TT) =
compute (res:Sequence(TT) := Sequence{})
source->forEach (iterator:T) {
var target : TT := body;
if (target<>null and condition) res += target;
};
Collection(T)::xcollectselectOne(source, iterator, target, body, condition) : Sequence(TT) =
compute (res:Sequence(TT) := Sequence{})
source->forEach (iterator:T) {
var target : TT := body;
if (target<>null and condition) {res += target; break;}
};
T and TT are respectively the type of the source elements and the type of the target elements. When applying the
imperative iterate _expression_ if the source collection is not ordered, it is implicitly converted into the corresponding
ordered collection (Set and Bag become respectively OrderedSet and Sequence). If the condition is not given, it should be
replaced by true in the definitions above.
by
Collection(T)::xcollect(BODY) : BagOrSequence(TT) =
compute (res : List(TT) := List{}) {
self->forEach(COLLECTOR) {
BODY->flatten()->forEach(target) {
if (target <> null) res += target;
};
};
}->asBagOrSequence();
Collection(T)::xselect(CONDITION) : BagOrOrderedSetOrSequenceOrSet(T) =
compute (res : List(T) := List{}) {
self->forEach(SELECTOR) {
if (SELECTOR<> null and CONDITION) res += SELECTOR;
};
}->asBagOrOrderedSetOrSequenceOrSet();
Collection(T)::xselectOne(CONDITION) : T =
compute (res : T := null) {
self->forEach(SELECTOR) {
if (SELECTOR<> null and CONDITION) { res := SELECTOR; break; }
};
};
Collection(T)::xcollectselect(BODY, CONDITION) : BagOrSequence(TT) =
compute (res : List(TT) := List{}) {
self->forEach(COLLECTOR) {
BODY->flatten()->forEach(SELECTOR) {
if (SELECTOR <> null and CONDITION) { res += SELECTOR; }
};
};
}->asBagOrSequence();
Collection(T)::xcollectselectOne(BODY, CONDITION) : TT =
compute (res : TT := null) {
self->forEach(COLLECTOR) {
BODY->flatten()->forEach(SELECTOR) {
if (SELECTOR <> null and CONDITION) { res := SELECTOR; break; }
};
if (res <> null) { break; }
};
};
where
§
BagOrOrderedSetOrSequenceOrSet denotes the Bag, OrderedSet, Sequence or Set kind of the source Collection
§
BagOrSequence denotes either Bag or Sequence according to whether the source Collection is unordered or ordered
§
BODY is a TT-valued Imperative OCL _expression_ that may use the COLLECTOR variable
§
CONDITION is a Boolean-valued Imperative OCL _expression_ that may use the SELECTOR variable
Extent Of Change:
Support Text
Created:
Tue, 6 Oct 2015 18:34 GMT
Updated:
Wed, 21 Oct 2015 10:12 GMT
Discussion:
QVT13-125
Title:
Specify the utility of an extent
Summary:
There is no mention of extent in Section 8.1 where one might hope to find an overview of the utility.
The proposed resolution of Issue 13103 clarifies the ability of ObjectExp to (re-)define the extent residence of a pre-existing object.
MappingParameter has some contradictory indications that an extent is bound by the callee rather than the caller.
Is this a consequence of the need for a MappingOperation to have a 1:1 correspondence to a QVTr Relation requiring the domain to be determined solely from the declaration? How is the inability of a Relation to have more than one
parameter per domain accommodated when there can be more than one parameter per extent?
Source:
formal/11-01-01 — Chapter/Section: 8 — Page Number/s: n/a
Legacy Issue Number:
19204
Reporter:
Ed Willink, Model Driven Solutions (ed@xxxxxxxxxxxxx)
Reported:
Wed, 5 Feb 2014 05:00 GMT on
QVT 1.1
Updated:
Wed, 21 Oct 2015 17:17 GMT
Discussion:
QVT13-36
Summary:
Specify the utility of an extent
There is no mention of extent in Section 8.1 where one might hope to find an overview of the utility.
The proposed resolution of Issue 13103 clarifies the ability of ObjectExp to (re-)define the extent residence of a pre-existing object.
MappingParameter has some contradictory indications that an extent is bound by the callee rather than the caller.
Is this a consequence of the need for a MappingOperation to have a 1:1 correspondence to a QVTr Relation requiring the domain to be determined solely from the declaration? How is the inability of a Relation to have more than one
parameter per domain accommodated when there can be more than one parameter per extent?
Discussion
A section on Extents is sadly lacking; write it.
The confusing fiction that there is a correspondence between QVTo Model Parameters and QVTr Domains is best eliminated.
Revised Text:
Add the following section after 8.1.2 Model Types and before 8.1.3 Libraries
8.1.x Extents, Models and Model Parameters
The inputs and output of a transformation are identified by Model Parameters which have a direction, model name and ModelType.
transformation Uml2Rdbms(in uml:UML, out rdbms:RDBMS)
8.1.x.1 Implementation responsibilities
A transformation is executed by a QVTo implementation which must load an external model for each
in and inout parameter and identify a future external model for each
out parameter. When the transformation completes successfully, the implementation must save the
inout models and the no longer future out models.
8.1.x.2 Extents
The interface between implementation and specified behavior uses a distinct MOF Extent associated with each Model Parameter. A MOF Extent identifies the root objects of its Model. The root objects are members of the Extent and
are said to reside in the Extent.
The initial members of in and inout Extents are the roots of loaded external models. There are no initial members of
out Extents.
Each Extent for an in Model Parameter is immutable. It may be shared when the same external model is loaded by multiple
in Model Parameters. Other Extents are mutable and must be distinct even when the same external model is bound to more than one Model Parameter. There are therefore no shared model conflicts within the QVTo engine. Resolution of the conflict between
multiple Extents that need to be saved to the same external model is a problem for the implementation to solve, perhaps by prohibiting the conflict in the first place.
8.1.x.3 Models
A Model comprises a forest of model elements (objects) with each tree defined by MOF containment relationships. For many applications, a single root, and its containment tree, rather than a forest is sufficient. However during
the course of a transformation, model elements are created for use by the model and these may form additional roots until the model elements are assigned to their intended container.
Each Model Parameter has an Extent whose members are the root objects of a Model. The ModelParameter's ModelType identifies the permitted content of the Model, The ModelParameter's name may be used with the operations of the Model
library type.
uml.objectsOfKind(Class);
The name may be used to assign all members of the Extent.
A model assignment displaces any previous members associated with the extent in favor of the root model elements of the replacement Model. The previous members cease to reside in any Extent and so become orphans.
Additional Models and corresponding Extents may be created by the Model::copy() and Model::createEmptyModel() operations. These Extents have no associated external model and so their contents will be lost unless assigned to Extents
with external models or unless passed to other transformations. The Models passed to nested transformation calls by Transformation::transform() or Transformation::parallelTransform() may not be modified after the call. This may require that a copy is created.
8.1.x.4 Object Containment and Extent Residence
A MOF object can be contained by at most one other object, consequently the containment relationship of a model form a forest. The roots of the forest have no containers, rather they are members of at most one Extent and are therefore
said to reside in that Extent. The non-roots of the forest are transitively contained by a root that is a member of the Extent; the non-roots are therefore also said to reside in the Extent. Objects that do not reside in an Extent are orphans.
parent.child := firstChild;
parent.child := secondChild;
Assignment of a container relationship, or opposite containment relationship, establishes a new parent-child containment relationship. This may displace the previous child so that it has no container, however the displaced child
retains its residence in its models' extent; the displaced child is therefore added to the extent's members and is an additional root object for the model.
model.addElement(anObject);
Similarly assignment of the residence of a root object, establishes or updates the residence of the root object and transitively of all its contained objects. Any previous residence is eliminated.
When a transformation consistently assigns all residences and containments for all objects, the result is often a tree for the Extent of each
inout and out parameter. However if any residence or containment is left unassigned, some orphan objects are lost.
Direct object creation or construction typically results in orphans whose containment and residence is assigned later since there is no inference of a default residence. The object may be explicitly assigned to the root of some
extent when it is created:
column := new Column@mymodel(n,t); fornew
object x:X@srcmodel { … }
Objects returned as out or inout parameters of a mapping are assigned to an explicit or inferred extent. If no extent can be inferred, typically because two ModelParameters use the same ModelType, the objects
are orphans. This is a programming hazard that can be diagnosed by tooling.
An object may be completely removed from its extent by invoking Model::removeElement(). This makes the object an orphan with no references to or from any other object.
Cloned and deepcloned objects are added to the Extent of the source object; they are therefore new root objects until assigned to some container.
8.1.x.5 Orphans
An orphan is a potentially lost object; it resides in no container and no extent and so will not contribute to any
out or inout model.
Orphans may arise as the result of:
§
Model::removeElement() explicitly orphaning an object
§
model assignment displacing an obsolete model
§
non-mapping object construction
Creation of orphans by object construction is discouraged in two ways. An @extent may form part of the ObjectExp, or Mapping out parameter declaration. In the case of mappings, a default extent is inferred by metamodel compatibility.
However objects constructed within helpers may be orphans.
An orphan may cease to be an orphan when a container is assigned, or when Model::addElement() is used to add the orphan element to the members of the Extent that identifies the root objects of the Model.
Although an orphan may have no container and may reside in no extent, it may still be referenced by objects that reside in an out extent. At the end of the transformation, when these extents are saved, the referenced orphans are
unresolved and the saved extent is incomplete and difficult to use. Referenced orphans are therefore saved as members of each extent in which they are referenced.
In 8.2.1.6 replace
More precisely there is a MOF extent corresponding to each parameter.
by
More precisely each ModelParameter has a ModelType for a MOF Extent whose members are the root objects of the corresponding Model.
In 8.2.1.6 delete the following contradiction
Any object creation occurs in an extent associated with a model parameter.
In 8.2.1.6 delete the following (rewritten above)
Relationship between MOF extents and model parameters
When a model element is created by a transformation it is necessary to know in what model the model element is to be
created. In particular, this makes it possible to use the inspection operations on model parameters like objects() and
objectsOfType() to retrieve an object previously created. In MOF there is a notion of Extent that is simply defined
as a container for Objects. Here we are correlating the notion of model (represented by model parameters in a
transformation definition) with the notion of MOF extent stating that for each model parameter there is a MOF extent.
In 8.2.1.16 delete the following fiction
A mapping operation being a refinement of a relation, a mapping parameter is associated with a domain of the refined
relation. This correspondence is based on the order of the declared parameters and domains, where the contextual
parameter, if any, is the first and the result parameters are positioned after the “regular” parameters. The type of the
mapping parameter should necessarily be the same as the type specified by the object pattern of the domain (see Domain
definition in Clause 7.11).
In 8.2.1.24 ObjectExp add after the first paragraph
Object creation, initialization and residence are separate activities. Object creation occurs when the referredObject has a null value; it is skipped if the referredObject variable references an existing object. Object initialization
always occurs, but may be trivial if the body is empty. Object residence is left unchanged when the extent is omitted; it will be established as soon as the created object is put at the target end of some composition relationship. An explicit object residence
may be established by specifying the model parameter for the required extent as the extent.
In 8.2.2.12 UnlinkExp correct
An unlink _expression_ represents an explicit removal of
a valuean object from a multivalued property link.
In 8.2.2.12 UnlinkExp add
The residence of the removed object is unaffected; it therefore becomes a root object of its model. If total removal is required the
Model::removeElement() operation may be used.
In 8.3.4 correct
8.3.4 Operations on elementsElements
In 8.3.4.10 clone add
The returned object is added to the root of the model containing the source element.
In 8.3.4.11 deepclone add
The returned object is added to the root of the model containing the source element.
In 8.3.5 correct
8.3.5 Operations on modelsModels
In 8.3.5.1 correct
Returns the listset of
theall objects in the model
extent.
In 8.3.5.3 correct
Returns the set of all the objects in the
extentmodel that are not contained by other objects
of the extentin the model.
Before 8.3.5.4 removeElement add
8.3.5.x addElement
Model::addElement (anObject : Element): Void
The object is first displaced from any usage by setting its container to null, then the object is added to the model's extent so that it provides another root for the model. Any non-containment references to and from the object are unaffected.
In 8.3.5.4 removeElement replace
Removes an object of the model extent. All links between the object and other objects in the extent are deleted. References from collections to the ends of deleted links are removed. References from noncollections are set to null.
by
Removes an object from the model so that it becomes an orphan. All references to or from the object are eliminated. References from collections are removed. References from non-collections are set to null.
In 8.3.5.6 copy replace
Performs a complete copy of a model into another model. All objects belonging to the source extent are copied into the target extent.
by
Creates a deep copy of a model and its extent. All objects transitively contained in the source model are copied into the new model. The roots of the new model are the initial members of the new extent. The new extent has no associated
external file and so the new contents may be lost unless assigned to another model or passed to another transformation.
In 8.3.5.7 createEmptyModel replace
Creates and initializes a model of the given type. This operation is useful when creating intermediate models within a transformation.
by
Creates a model and extent of the given type without any content. This operation is useful when creating intermediate models within a transformation.
Extent Of Change:
Significant
Created:
Mon, 12 Oct 2015 18:46 GMT
Updated:
Wed, 21 Oct 2015 17:17 GMT
Discussion:
QVT13-118
Title:
QVTr Variable Initialization
Summary:
QVTr does not allow variables to be initialized at the point of declaration. This is a rather prehistoric limitation that significantly degrades readability.
a) it requires separate declaration and assignment lines
b) it inhibits inference of the variable type from the initializer
c) it obfuscates the variable assignment
The latter is a particular problem in QVTr where the assignment may a consequence of a pattern match;
Suggest allowing an initializer on a VarDeclarationCS and allowing the type to be inferred from the initializer.
Legacy Issue Number:
19665
Reporter:
Ed Willink, Model Driven Solutions (ed@xxxxxxxxxxxxx)
Reported:
Fri, 28 Nov 2014 05:00 GMT on
QVT 1.2
Updated:
Wed, 21 Oct 2015 09:36 GMT
Discussion:
QVT13-43
Summary:
QVTr Variable Initialization
QVTr does not allow variables to be initialized at the point of declaration. This is a rather prehistoric limitation that significantly degrades readability.
a) it requires separate declaration and assignment lines
b) it inhibits inference of the variable type from the initializer
c) it obfuscates the variable assignment
The latter is a particular problem in QVTr where the assignment may a consequence of a pattern match;
Suggest allowing an initializer on a VarDeclarationCS and allowing the type to be inferred from the initializer.
Discussion
The underlying Abstract Syntax supports an initializer.
Prototyping in Eclipse QVTr demonstrated a useful reduction in line count and increase in clarity of the RelToCore transformation.
Revised Text:
In 7.13.5 replace
<varDeclaration> ::= <identifier> (, <identifier>)* ':' <TypeCS> ';'
to
<varDeclaration> ::= <identifier> (, <identifier>)* ':' <TypeCS>
['=' <OclExpressionCS>] ';'
Extent Of Change:
Minor
Created:
Wed, 21 Oct 2015 09:27 GMT
Updated:
Wed, 21 Oct 2015 09:35 GMT
Discussion:
QVT13-132
Title:
Allow QVTc to use initialized variables
Summary:
Initializing variables at the point of declaration is generally recognized as good practice. QVTc does not support it.
Suggest extend the (Realized) Variable syntax to support an initializer.
Source:
invalid:- — Chapter/Section: 9 — Page Number/s: 174
Legacy Issue Number:
19725
Reporter:
Ed Willink, Model Driven Solutions (ed@xxxxxxxxxxxxx)
Reported:
Thu, 19 Feb 2015 05:00 GMT on
QVT 1.2
Updated:
Wed, 21 Oct 2015 09:51 GMT
Discussion:
QVT13-50
Summary:
Allow QVTc to use initialized variables
Initializing variables at the point of declaration is generally recognized as good practice. QVTc does not support it.
Suggest extend the (Realized) Variable syntax to support an initializer.
Discussion
Initializing RealizedVariables makes no sense, since a RealizedVariable is initialized by the new Type().
Initializing (Unrealized)Variables is however useful and supported by the Abstract Syntax already; just need some Concrete Syntax re-using the := of an Assignment.
Revised Text:
In 9.18 Concrete Syntax replace
Variable :=
VariableName ':' TypeDeclaration
by
Variable :=
VariableName ':' TypeDeclaration [':=' ValueOCLExpr]
Extent Of Change:
Minor
Created:
Wed, 21 Oct 2015 09:48 GMT
Updated:
Wed, 21 Oct 2015 09:51 GMT
Discussion:
QVT13-133
Title:
Section: 7.13.5
Summary:
The "import" feature of Relations Language is not yet explained. And there is no example for it, too. For instance what does the "unit" in "import <unit>;" mean ?
Legacy Issue Number:
11690
Reporter:
Anonymous
Reported:
Tue, 27 Nov 2007 05:00 GMT on
QVT 1.0
Updated:
Wed, 21 Oct 2015 09:18 GMT
Discussion:
QVT13-59
Summary:
Section: 7.13.5
The "import" feature of Relations Language is not yet explained. And there is no example for it, too. For instance what does the "unit" in "import <unit>;" mean ?
See Issue
QVT13-6 for disposition
Created:
Wed, 14 Oct 2015 20:00 GMT
Updated:
Wed, 14 Oct 2015 20:00 GMT
Discussion:
QVT13-130
Title:
How can an UnlinkExp.target be a Property
Summary:
The description of UnlinkExp.target specifies an OclExpression but describes a Property.
Is this an error? Is it introducing a new PropertyLiteralExp?
Reporter:
Ed Willink, Model Driven Solutions (ed@xxxxxxxxxxxxx)
Reported:
Wed, 21 Oct 2015 16:48 GMT on
QVT 1.2
Updated:
Wed, 21 Oct 2015 17:27 GMT
Discussion:
QVT13-134
Summary:
How can an UnlinkExp.target be a Property
The description of UnlinkExp.target specifies an OclExpression but describes a Property.
Is this an error? Is it introducing a new PropertyLiteralExp?
Discussion
It can't be a Property. It is a property.
Revised Text:
In 8.2.2.12 UnlinkExp correct
The target _expression_. It should evaluate to a
Propertyproperty that can be updated.
Extent Of Change:
Minor
Created:
Wed, 21 Oct 2015 17:26 GMT
Updated:
Wed, 21 Oct 2015 17:27 GMT
Discussion:
QVT13-135
The OMG Team
No virus found in this message.
Checked by AVG - www.avg.com
Version: 2015.0.6172 / Virus Database: 4450/10869 - Release Date: 10/22/15