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:
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