MOF Query/View/Transformation Avatar
  1. OMG Specification

MOF Query/View/Transformation — Closed Issues

  • Acronym: QVT
  • Issues Count: 62
  • Description: Issues resolved by a task force and approved by Board
Closed All
Issues resolved by a task force and approved by Board

Issues Summary

Key Issue Reported Fixed Disposition Status
QVT13-99 QVTo: Mapping Overloading MOF 1.2 QVT 1.3 Resolved closed
QVT13-97 QVTo: xselectOne, xcollectselectOne is Sequence of One not One MOF 1.2 QVT 1.3 Duplicate or Merged closed
QVT13-93 QVTo: Mapping and other Identifiers MOF 1.2 QVT 1.3 Resolved closed
QVT13-78 QVTo: VariableInitExp wording for missing initializer MOF 1.2 QVT 1.3 Resolved closed
QVT13-120 QVTo: object creation in helpers MOF 1.2 QVT 1.3 Duplicate or Merged closed
QVT13-61 QVTo: Calling the super implementation of an overriding operation MOF 1.2 QVT 1.3 Duplicate or Merged closed
QVT13-60 QVTo: non-mutating List operation example problem MOF 1.2 QVT 1.3 Resolved closed
QVT13-59 QVTc/QVTr: Imports QVT 1.0 QVT 1.3 Duplicate or Merged closed
QVT13-53 QVTo: Standard Library return types QVT 1.2 QVT 1.3 Resolved closed
QVT13-56 QVTo: List navigation operator example problems QVT 1.2 QVT 1.3 Resolved closed
QVT13-58 QVTo: access/extension default for ImportKind MOF 1.2 QVT 1.3 Resolved closed
QVT13-51 QVTo: null and AssignExp QVT 1.2 QVT 1.3 Resolved closed
QVT13-48 allInstances() QVT 1.2 QVT 1.3 Resolved closed
QVT13-47 QVTo: Per-transformation ModelTypes QVT 1.1 QVT 1.3 Closed; No Change closed
QVT13-46 QVTo: multi-valued initialisation from single value QVT 1.2 QVT 1.3 Duplicate or Merged closed
QVT13-43 QVTr: Variable Initialization QVT 1.2 QVT 1.3 Resolved closed
QVT13-41 QVTr: Exact Collection match QVT 1.2 QVT 1.3 Resolved closed
QVT13-40 QVTc/QVTr: abstract mappings/relations QVT 1.1 QVT 1.3 Resolved closed
QVT13-39 QVTo: Redundant argument on matchIdentifier QVT 1.1 QVT 1.3 Resolved closed
QVT13-38 QVTo: AssignExp unclear for OrderedSet QVT 1.1 QVT 1.3 Duplicate or Merged closed
QVT13-37 QVTo: deepclone on Collections QVT 1.1 QVT 1.3 Resolved closed
QVT13-36 QVTo: Extents, Models and Model Parameters QVT 1.1 QVT 1.3 Resolved closed
QVT13-35 QVTo: Incorrect ModelType.additionalCondition multiplicity QVT 1.1 QVT 1.3 Closed; No Change closed
QVT13-50 QVTc: initialized variables QVT 1.2 QVT 1.3 Resolved closed
QVT13-30 QVTo: Inadequate helper/query distinction QVT 1.2 QVT 1.3 Duplicate or Merged closed
QVT13-29 QVTo: invalid in ImperativeOCL QVT 1.2 QVT 1.3 Resolved closed
QVT13-28 QVTo: 'result' for Tuple returns QVT 1.2 QVT 1.3 Resolved closed
QVT13-26 Multiple input models QVT 1.1 QVT 1.3 Resolved closed
QVT13-24 QVTo: when and where as assertions QVT 1.1 QVT 1.3 Resolved closed
QVT13-23 QVTo: Tracing and Resolving QVT 1.1 QVT 1.3 Resolved closed
QVT13-22 QVTo: Trace data for an 'accessed' transformation QVT 1.1 QVT 1.3 Duplicate or Merged closed
QVT13-20 QVTc/QVTr: Queries and their contexts QVT 1.1 QVT 1.3 Resolved closed
QVT13-16 QVTo: Introductory Examples Problems QVT 1.1 QVT 1.3 Resolved closed
QVT13-14 QVTo: ListLiteralExp inheritance QVT 1.1 QVT 1.3 Resolved closed
QVT13-13 QVTo: Typedef for Standard Library predefined types QVT 1.0 QVT 1.3 Resolved closed
QVT13-6 QVTc/QVTr: Imports QVT 1.0 QVT 1.3 Resolved closed
QVT13-4 QVTr: UML to RDBMS Example Problems QVT 1.0 QVT 1.3 Resolved closed
QVT13-2 Missing Identifier Syntax QVT 1.0 QVT 1.3 Resolved closed
QVT13-42 QVTr: Multi-root match QVT 1.2 QVT 1.3 Resolved closed
QVT13-34 QVTo: xcollect is ambiguously flattened QVT 1.1 QVT 1.3 Resolved closed
QVT13-33 QVTo: Passing DataTypes 'by-reference' QVT 1.1 QVT 1.3 Resolved closed
QVT13-101 QVTc/QVTo/QVTr acronyms MOF 1.2 QVT 1.3 Resolved closed
QVT13-21 QVTr: Deletion semantics QVT 1.1 QVT 1.3 Deferred closed
QVT13-19 QVTr: Rule Overriding semantics QVT 1.1 QVT 1.3 Deferred closed
QVT13-18 QVTc/QVTr: View/Transformation discrepancy QVT 1.1 QVT 1.3 Deferred closed
QVT13-17 QVTo: Relationship between QVTo Mapping and QVTr Relation QVT 1.1 QVT 1.3 Deferred closed
QVT13-15 QVTr: syntax mapping (correction to Issue 10646 resolution) QVT 1.1 QVT 1.3 Deferred closed
QVT13-12 QVTo: Standard Library return types QVT 1.0 QVT 1.3 Duplicate or Merged closed
QVT13-11 QVTo: synonyms QVT 1.0 QVT 1.3 Resolved closed
QVT13-10 QVTo: Typedef QVT 1.0 QVT 1.3 Resolved closed
QVT13-9 QVTo: element creation and element attachment/detachment to/from an extent QVT 1.0 QVT 1.3 Duplicate or Merged closed
QVT13-8 QVTo: ImperativeOCL conflicts with EssentialOCL semantics QVT 1.0 QVT 1.3 Resolved closed
QVT13-7 QVTr: BlackBox operation signature difficulties QVT 1.0 QVT 1.3 Deferred closed
QVT13-3 QVTr: Undefined semantics QVT 1.0 QVT 1.3 Deferred closed
QVT13-1 QVTr: Missing Name and Expression syntax QVT 1.0 QVT 1.3 Duplicate or Merged closed
QVT13-45 QVTc/QVTr: Pattern.bindsTo composition QVT 1.2 QVT 1.3 Deferred closed
QVT13-32 Inconsistent multiple inheritance QVT 1.1 QVT 1.3 Deferred closed
QVT13-31 QVTr: working with stereotypes: QVT 1.0 QVT 1.3 Deferred closed
QVT13-52 QVTo: Standard Library mode and namespace QVT 1.2 QVT 1.3 Deferred closed
QVT13-27 QVTo: Inadequate definition of "late" semantics QVT 1.2 QVT 1.3 Deferred closed
QVT13-25 QVTo: Enhance ObjectExp to allow constructors invocation QVT 1.1 QVT 1.3 Deferred closed
QVT13-134 QVTo: How can an UnlinkExp.target be a Property QVT 1.2 QVT 1.3 Deferred closed

Issues Descriptions

QVTo: Mapping Overloading

  • Key: QVT13-99
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    QVTo has one form of mapping overloading provided by disjuncts. This is poorly specified.

    It probably has another provided by name collision. This is unspecified.

  • Reported: MOF 1.2 — Tue, 6 Oct 2015 19:34 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    What are the QVTo mapping overloading semantics?

    QVTo has one form of mapping overloading provided by disjuncts. This is poorly specified.

    It probably has another provided by name collision. This is unspecified.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: xselectOne, xcollectselectOne is Sequence of One not One

  • Key: QVT13-97
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The return type of xselectOne, xcollectselectOne returns a SEquence rather than an optional value.

  • Reported: MOF 1.2 — Tue, 6 Oct 2015 18:42 GMT
  • Disposition: Duplicate or Merged — QVT 1.3
  • Disposition Summary:

    xselectOne, xcollectselectOne is Sequence of One not One

    The return type of xselectOne, xcollectselectOne returns a Sequence rather than an optional value.

    Discussion

    QVT13-34 revealed numerous errors in the pseudocode. This error is just one of many fixed by its resolution.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Mapping and other Identifiers

  • Key: QVT13-93
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The <rulerefs> between mappings has no defined semantics.

    Presumably:

    <package-name>*::<transformation-name>::<context-type>::<mapping-name>

    allowing <package-name>*::<transformation-name> to be omitted defauklting to the current transdformation, and, preserving the current example semantics, resolving an omitted <context-type> by serching all mapping names in the transformation.

  • Reported: MOF 1.2 — Tue, 6 Oct 2015 12:29 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Undefined rulerefs

    The <rulerefs> between mappings has no defined semantics.

    Presumably:

    <package-name>*::<transformation-name>::<context-type>::<mapping-name>

    allowing <package-name>*::<transformation-name> to be omitted defauklting to the current transdformation, and, preserving the current example semantics, resolving an omitted <context-type> by serching all mapping names in the transformation.

    Issue Links

    Discussion

    Since <mapping_id> needs definition, we can take the opportunity to rename the strange <rulerefs>.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: VariableInitExp wording for missing initializer

  • Key: QVT13-78
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    8.2.2.10 VariableInitExp says

    A variable may not declare an initialization value.

    when surely it means

    A variable may omit an initialization value.

  • Reported: MOF 1.2 — Mon, 5 Oct 2015 11:32 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Unfortunate VariableInitExp wording for missing initializer

    8.2.2.10 VariableInitExp says

    A variable may not declare an initialization value.

    when surely it means

    A variable may omit an initialization value.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: object creation in helpers

  • Key: QVT13-120
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The prohibition on creation or update of instances in helpers has no justification. Why?

  • Reported: MOF 1.2 — Tue, 13 Oct 2015 09:58 GMT
  • Disposition: Duplicate or Merged — QVT 1.3
  • Disposition Summary:

    Allow object creation in helpers

    The prohibition on creation or update of instances in helpers has no justification. Why?

    Discussion

    This came up while clarifying wording for QVT13-33.

    The prohibition is presumably intended to ensure that all object creation has a corresponding trace record. A good idea but beyond the pragmatic integrity of QVTo. Untraced objects can be created in mappings anyway, so prohibiting their creation in helpers is just an unhelpful restriction on programming flexibility.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Calling the super implementation of an overriding operation

  • Key: QVT13-61
  • Legacy Issue Number: 19823
  • Status: closed  
  • Source: Heinz Nixdorf Institute, University of Paderborn ( Christopher Gerking)
  • Summary:

    There is currently no way for an overriding operation to call its overridden super implementation. ImperativeOCL should provide something similar to the 'super' reference which is available in Java.

  • Reported: MOF 1.2 — Mon, 3 Aug 2015 04:00 GMT
  • Disposition: Duplicate or Merged — QVT 1.3
  • Disposition Summary:

    Calling the super implementation of an overriding operation

    There is currently no way for an overriding operation to call its overridden super implementation. ImperativeOCL should provide something similar to the 'super' reference which is available in Java.

    Discussion

    QVT13-93 clarifies the concept of a mapping identifier. An arbitrary mapping may therefore be called:

    self.map My::Tx::Your::Type::doIt(withSomething);

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: non-mutating List operation example problem

  • Key: QVT13-60
  • Legacy Issue Number: 19810
  • Status: closed  
  • Source: Heinz Nixdorf Institute, University of Paderborn ( Christopher Gerking)
  • Summary:

    The following helper from the specification is a NOP, because List::append has no side effect in QVT 1.2.

    helper Package::computeCandidates(inout list:List) : List

    { if (self.nothingToAdd()) return list; list.append(self.retrieveCandidates()); return list; }

    Therefore the snippet should rather use List::add.

  • Reported: MOF 1.2 — Thu, 25 Jun 2015 04:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Incorrect use of side-effect free append in example

    The following helper from the specification is a NOP, because List::append has no side effect in QVT 1.2.

    helper Package::computeCandidates(inout list:List) : List

    { if (self.nothingToAdd()) return list; list.append(self.retrieveCandidates()); return list; }

    Therefore the snippet should rather use List::add.

    Discussion

    Yes

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTc/QVTr: Imports

  • Key: QVT13-59
  • Legacy Issue Number: 11690
  • Status: closed  
  • Source: Anonymous
  • 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 ?

  • Reported: QVT 1.0 — Tue, 27 Nov 2007 05:00 GMT
  • Disposition: Duplicate or Merged — QVT 1.3
  • Disposition 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 ?

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Standard Library return types

  • Key: QVT13-53
  • Legacy Issue Number: 19760
  • Status: closed  
  • Source: Anonymous
  • Summary:

    The objectsOf...(T) family of operations (e.g. Element::subobjectsOfKind(T), or Element::allSubobjectsOfType(T), or Model::objectsOfType(T)) returns a set of Elements.

    It should be possible to infer the precise return type from the given T, i.e., return a Set(T) instead of Set(Element).

    BTW, why is there no Model::objectsOfKind(T) ?

  • Reported: QVT 1.2 — Tue, 19 May 2015 04:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Define return type for objectsOf...(T) operations more precisely

    The objectsOf...(T) family of operations (e.g. Element::subobjectsOfKind(T), or Element::allSubobjectsOfType(T), or Model::objectsOfType(T)) returns a set of Elements.

    It should be possible to infer the precise return type from the given T, i.e., return a Set(T) instead of Set(Element).

    BTW, why is there no Model::objectsOfKind(T) ?

    Discussion

    We can make the declaraions using the same approximation to a rigorous declaration as used by selectByKind in OCL 2.4.

    Omission of objectsOfKInd is an easily corrected oversight.

    The incorrect objectsOfKind usage by the current objectsOfType is a confusing error that gets worse when the correct operation is provided. Better to correct it.

    clone and deepClone from QVT13-12 can similarly exploit a T.

    The confusing wording of Model::createEmptyModel can be clarified,

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: List navigation operator example problems

  • Key: QVT13-56
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    Clause 8.1.14 uses "mylist.add(5);" rather than "mylist->add(5);

    and "mydict.put"

  • Reported: QVT 1.2 — Mon, 13 Jul 2015 12:40 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Incorrect navigation operator for LIst operations

    Clause 8.1.14 uses "mylist.add(5);" rather than "mylist->add(5); and "mydict.put"

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: access/extension default for ImportKind

  • Key: QVT13-58
  • Legacy Issue Number: 19816
  • Status: closed  
  • Source: Heinz Nixdorf Institute, University of Paderborn ( Christopher Gerking)
  • Summary:

    For imported compilation units, the specification should clearly state what happens if there is no corresponding ModuleImport for any of the modules included inside the imported unit.

    The Eclipse QVTo implementation applies extends semantics by default. A very bad idea, because it leads to undesired extensions and overridings (especially in case of multiple modules per unit).

    Using access as a default is a much better idea, but maybe clutters the namespaces at AST level with needless module imports.

    Therefore applying neither access nor extends could be another good idea, but lacks a helpful default behavior.

  • Reported: MOF 1.2 — Thu, 9 Jul 2015 04:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Unspecified handling of imports without access/extends

    For imported compilation units, the specification should clearly state what happens if there is no corresponding ModuleImport for any of the modules included inside the imported unit.

    The Eclipse QVTo implementation applies extends semantics by default. A very bad idea, because it leads to undesired extensions and overridings (especially in case of multiple modules per unit).

    Using access as a default is a much better idea, but maybe clutters the namespaces at AST level with needless module imports.

    Therefore applying neither access nor extends could be another good idea, but lacks a helpful default behavior.

    Discussion

    Following some off-JIRA correspondence, the original issue is clearer and simpler.

    The 8.2.1.4 words say that ImportKind has only two possibilities. But the words and model omit a [1] multiplicity or defaultValue so that null is a third possibility. The grammar also permits a missing ImportKind.

    So as suggested we could introduce a third null semantics, or define one of access/extends as the default.

    I see no benefit in a third semantics.

    "extends" is a very serious mutating activity, not a default.

    "access" is harmless and non-mutating. Hardly AST clutter. If the user didn't want the names the user should not have specified an import.

    Let "access" be the default.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: null and AssignExp

  • Key: QVT13-51
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    "A compound assignment is equivalent to perform as much simple assignments as there are expressions. Null values are skipped."

    This is poor English and it conflicts with the OCL specification.

    Pedantically it only skips "Null" values so "null values" are allowed anyway.

    "An assignment may receive a future variable produced by a deferred resolve expression (see ResolveExp). The effect is equivalent to receive a null value except that a side-effect action occurs in order to allow re-executing the assignment at the end of the transformation.
    An assignment expression returns the assigned value unless it is a future value, in which case null is returned."

    This is barely intelligible and presumably related to the SmartQVT implementation. It certainly has confusion about nulls.

    I recommend following OCL and allowing null values. ->excluding(null) is easily added.

  • Reported: QVT 1.2 — Tue, 31 Mar 2015 16:15 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Conflicting exclusion of null during assign

    "A compound assignment is equivalent to perform as much simple assignments as there are expressions. Null values are skipped."

    This is poor English and it conflicts with the OCL specification.

    Pedantically it only skips "Null" values so "null values" are allowed anyway.

    "An assignment may receive a future variable produced by a deferred resolve expression (see ResolveExp). The effect is equivalent to receive a null value except that a side-effect action occurs in order to allow re-executing the assignment at the end of the transformation.
    An assignment expression returns the assigned value unless it is a future value, in which case null is returned."

    This is barely intelligible and presumably related to the SmartQVT implementation. It certainly has confusion about nulls.

    I recommend following OCL and allowing null values. ->excluding(null) is easily added.

    Issue 19238

    AssignExp to an Collection should make clear that the results is

    target->including(source)->excluding(null)

    Issue 19687

    The two examples

    mymultivaluedproperty += object Node

    {…}; // additive semantics
    mymultivaluedproperty := object Node {…}

    ; // the list is reset and re-assigned

    are simple assignments from single valued RHS. These are not covered in the preceding description.

    I consider both to be errors since the RHS is unsuitable for assignment to the LHS. In both cases an asSet() or whatever should be appended.

    More generally, the library operation that exhibits the "additive semantics" should be clearly identified.

    Since addition to OCL collections is not permissible, it may be necessary to define constructors, so that

    var c : Set(String) := Set

    {"a"}

    ;

    invokes the Set(T)(Set(T)) constructor.

    This would allow initialization for a Sequence from a List and vice-versa that is otherwise magic.

    which should exploit an OCL definition of OrderedSet::including to be add at end if necessary.

    Discussion - nulls

    UML does not allow nulls in multi-values, therefore nulls must be excluded during assignments to properties.

    OCL does allow nulls, and even though this may appear to be a mistake, QVTo must support nulls in OCL collections until OCL is changed.

    Discussion - multiple values

    The current wording leaves open the design choice between:

    a) perfect fidelity of nested types, i.e. addition of a Collection of Collections adds the one Collection of Collection element

    b) perfect flattening, i.e. addition of a Collection of Collections adds all the elements in the nested collections.

    c) something in between, perhaps behaving differently depending whether the LHS is a nested collection or not,

    OCL unfortunately started without nested collections so that imploicit-collect flattens requiring the explicit collectNested for perfect Collection type fidelity. a) is not really an option. c) risks a confusing anarchy. b) is what is often wanted. If users want nested collections they can use more explicit operations.

    Discussion - future values

    Premature access to yet-to-be initialized values is obviously bad. Making this an error is an option, but it would be a breaking change; there may be users who poll the variable awaiting initialization. Simplest to just clarify the words to indicate that the value of any yet-to-be-initialized value is null, even when null is not assignable to the value. It is not initialized to null; it is null until initialized.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

allInstances()

  • Key: QVT13-48
  • Legacy Issue Number: 19621
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    OCL's allInstances() applies to the one and only immutable model extent.

    The meaning of this in QVT with multiple, some mutable, extents/domains/typedModels is unclear.

    Suggest that allInstances applies to all the input and original inout extents only.

    Obtaining instances from other domains is available through alternate library operations such as objectsOfType in QVTo.

  • Reported: QVT 1.2 — Thu, 25 Sep 2014 04:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    allInstances() needs clarification

    OCL's allInstances() applies to the one and only immutable model extent.

    The meaning of this in QVT with multiple, some mutable, extents/domains/typedModels is unclear.

    Suggest that allInstances applies to all the input and original inout extents only.

    Obtaining instances from other domains is available through alternate library operations such as objectsOfType in QVTo.

    Discussion - QVTo

    allInstances() could be defined to apply to the initial, prevailing or final state. Since a QVTo execution proceeds through a predictable sequence of states limiting allInstances() to the initial state is unhelpful. A limitation to the final state is almost unuseable and may require a tool to introduce another form of late processing. Therefore the prevailing state is most appropriate for a QVTo allInstances().The returned instances are the mutable instances since any form of caching would impose an unjustified overhead.

    Discussion - QVTr/QVTc

    allInstances() could be defined to apply to the initial, prevailing or final state. The initial state is easy. The prevailing state does not exist declaratively. The final state is harder but may be useful for computing derived output values based on the outputs.

    However consider a cascade of endogeneous transformations A2B, B2C, C2D in which B2C performs an allInstances(). If we now compose the trio into A2B2C2D, the functionality of the allInstances() must not change. Therefore neither initial nor final state will do, since the initial state changes from B to A and the final state from C to D. We must use a prevailing state, which we can define as the final state of the domain in which the invocation of allInstances() occurs. For our example this is one of B or C and does not change as a consequence of the cascade.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Per-transformation ModelTypes

  • Key: QVT13-47
  • Legacy Issue Number: 12370
  • Status: closed  
  • Source: Open Canarias, SL ( Adolfo Sanchez-Barbudo Herrera [X] (Inactive))
  • Summary:

    a production rule seems to be missing: <module_element> ::= <modeltype> Since, a transformation file can define several transformations and libraries (modules), it is desirable having the possibility of defining modeltypes exclusively to a module. These "local" modelTypes should belong to the scope of a module, and it shouldn't be accessible to the remaining defined modules (unless the use of extension mechanisms is specified).

  • Reported: QVT 1.1 — Fri, 4 Apr 2008 04:00 GMT
  • Disposition: Closed; No Change — QVT 1.3
  • Disposition Summary:

    Section 8.7.1a production rule seems to be missing

    a production rule seems to be missing: <module_element> ::= <modeltype> Since, a transformation file can define several transformations and libraries (modules), it is desirable having the possibility of defining modeltypes exclusively to a module. These "local" modelTypes should belong to the scope of a module, and it shouldn't be accessible to the remaining defined modules (unless the use of extension mechanisms is specified).

    Discussion

    A transformation is a major programming element so multiple transformations per file seems as unusual as multiple Java classes per file.

    But we do already support

    transformation X(...) {...}
    transformation Y(...) {...}

    so perhaps we need per transformation modeltypes.

    But if we provided them as suggested: we would have

    transformation X(in q : Q) {
    modeltype Q uses ....;
    }

    allowing an outer declaration to depend on an inner.

    If a user really wants many transformations per file with many distinct conflicting modeltypes, then the user has the option to use distinctive names for each modeltype.

    Much more sensible to use multiple files in the first place.

    Similarly we don't want or support per-transformation imports.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: multi-valued initialisation from single value

  • Key: QVT13-46
  • Legacy Issue Number: 19687
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The two examples

    mymultivaluedproperty += object Node

    {…}; // additive semantics
    mymultivaluedproperty := object Node {…}

    ; // the list is reset and re-assigned

    are simple assignments from single valued RHS. These are not covered in the preceding description.

    I consider both to be errors since the RHS is unsuitable for assignment to the LHS. In both cases an asSet() or whatever should be appended.

    More generally, the library operation that exhibits the "additive semantics" should be clearly identified.

    Since addition to OCL collections is not permissible, it may be necessary to define constructors, so that

    var c : Set(String) := Set

    {"a"}

    ;

    invokes the Set(T)(Set(T)) constructor.

    This would allow initialization for a Sequence from a List and vice-versa that is otherwise magic.

  • Reported: QVT 1.2 — Mon, 15 Dec 2014 05:00 GMT
  • Disposition: Duplicate or Merged — QVT 1.3
  • Disposition Summary:

    Unclear multi-valued initialisation from single value

    The two examples

    mymultivaluedproperty += object Node

    {…}; // additive semantics
    mymultivaluedproperty := object Node {…}

    ; // the list is reset and re-assigned

    are simple assignments from single valued RHS. These are not covered in the preceding description.

    I consider both to be errors since the RHS is unsuitable for assignment to the LHS. In both cases an asSet() or whatever should be appended.

    More generally, the library operation that exhibits the "additive semantics" should be clearly identified.

    Since addition to OCL collections is not permissible, it may be necessary to define constructors, so that

    var c : Set(String) := Set

    {"a"}

    ;

    invokes the Set(T)(Set(T)) constructor.

    This would allow initialization for a Sequence from a List and vice-versa that is otherwise magic.

    Issue Links

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTr: Variable Initialization

  • Key: QVT13-43
  • Legacy Issue Number: 19665
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • 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.

  • Reported: QVT 1.2 — Fri, 28 Nov 2014 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition 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.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTr: Exact Collection match

  • Key: QVT13-41
  • Legacy Issue Number: 19663
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The QVTr AS allows CollectionTemplateExp::rest to be null corresponding to a precisely enumerated list of collection members to be matched.

    The QVTr CS does not support this.

    Suggest changing the

    '++' (restIdentifier=[pivot::Variable|UnrestrictedName] | '_')

    sub-parsing rule to

    ('++' (restIdentifier=[pivot::Variable|UnrestrictedName] | '_'))?

  • Reported: QVT 1.2 — Fri, 28 Nov 2014 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Exact QVTr Collection match

    The QVTr AS allows CollectionTemplateExp::rest to be null corresponding to a precisely enumerated list of collection members to be matched.

    The QVTr CS does not support this.

    Suggest changing the

    '++' (restIdentifier=[pivot::Variable|UnrestrictedName] | '_')

    sub-parsing rule to

    ('++' (restIdentifier=[pivot::Variable|UnrestrictedName] | '_'))?

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTc/QVTr: abstract mappings/relations

  • Key: QVT13-40
  • Legacy Issue Number: 19275
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    When mapping/relation refinement is used, it should be possible to specify via the abstract keyword that a mapping/relation is only intended for use in a refined form.

    Thus in A.3.1, declaring classAttributes abstract could determine whether the execution needs to consider matches not covered by the classPrimitiveAttributes and classComplexAttributes refinements.

  • Reported: QVT 1.1 — Thu, 27 Feb 2014 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Support abstract mappings/relations

    When mapping/relation refinement is used, it should be possible to specify via the abstract keyword that a mapping/relation is only intended for use in a refined form.

    Thus in A.3.1, declaring classAttributes abstract could determine whether the execution needs to consider matches not covered by the classPrimitiveAttributes and classComplexAttributes refinements.

    Discussion

    A simple enhancement

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Redundant argument on matchIdentifier

  • Key: QVT13-39
  • Legacy Issue Number: 19252
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    Issue 19146 removed most of the erroneous matchXXX arguments but omitted to do so for String:: matchIndentifier

  • Reported: QVT 1.1 — Fri, 21 Feb 2014 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Redundant argument on matchIdentifier

    Issue 19146 removed most of the erroneous matchXXX arguments but omitted to do so for String:: matchIdentifier

    Discussion

    Yes

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: AssignExp unclear for OrderedSet

  • Key: QVT13-38
  • Legacy Issue Number: 19238
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    AssignExp to an Collection should make clear that the results is

    target->including(source)->excluding(null)

    which should exploit an OCL definition of OrderedSet::including to be add at end if necessary.

  • Reported: QVT 1.1 — Wed, 12 Feb 2014 05:00 GMT
  • Disposition: Duplicate or Merged — QVT 1.3
  • Disposition Summary:

    AssignExp unclear for OrderedSet

    AssignExp to an Collection should make clear that the results is

    target->including(source)->excluding(null)

    which should exploit an OCL definition of OrderedSet::including to be add at end if necessary.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: deepclone on Collections

  • Key: QVT13-37
  • Legacy Issue Number: 19205
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The Issue 19146 resolution is not sufficiently clear for Collection::deepclone.

    Any nested mutables must be deepcloned, so the specification should require a recursive deepclone that the return decides between self or the clone according to whether any elements need to change

  • Reported: QVT 1.1 — Wed, 5 Feb 2014 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Clarify deepclone on Collections

    The Issue 19146 resolution is not sufficiently clear for Collection::deepclone.

    Any nested mutables must be deepcloned, so the specification should require a recursive deepclone that the return decides between self or the clone according to whether any elements need to change

    Discussion

    Yes

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Extents, Models and Model Parameters

  • Key: QVT13-36
  • Legacy Issue Number: 19204
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • 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?

  • Reported: QVT 1.1 — Wed, 5 Feb 2014 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition 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.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Incorrect ModelType.additionalCondition multiplicity

  • Key: QVT13-35
  • Legacy Issue Number: 19201
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The EBNF:

    <modeltype> ::= 'modeltype' <identifier> <compliance_kind>?
    'uses' <packageref_list> <modeltype_where>? ';'
    <modeltype_where> ::= 'where' <expression_block>

    allows only a single where which may be a BlockExp, so ModelType.additionalCondition should be [0..1] rather than [*].

  • Reported: QVT 1.1 — Thu, 30 Jan 2014 05:00 GMT
  • Disposition: Closed; No Change — QVT 1.3
  • Disposition Summary:

    Incorrect ModelType.additionalCondition multiplicity

    The EBNF:

    <modeltype> ::= 'modeltype' <identifier> <compliance_kind>?
    'uses' <packageref_list> <modeltype_where>? ';'
    <modeltype_where> ::= 'where' <expression_block>

    allows only a single where which may be a BlockExp, so ModelType.additionalCondition should be [0..1] rather than [*].

    Discussion

    Yes, but

    <expression_block> ::= '{' <expression_list>? '}'

    which allows for the multiple expressions.

    The multiple expressions could be shown more clearly by flattening as:

    <modeltype> ::= 'modeltype' <identifier> <compliance_kind>?
    'uses' <packageref_list> ('where' '{' <expression_list>? '}')? ';'

    But in the absence of a CS2AS mapping, implementations are not obliged to create the inappropriate BlockExp.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTc: initialized variables

  • Key: QVT13-50
  • Legacy Issue Number: 19725
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • 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.

  • Reported: QVT 1.2 — Thu, 19 Feb 2015 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition 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.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Inadequate helper/query distinction

  • Key: QVT13-30
  • Legacy Issue Number: 19571
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The Helper class in the AS syntax supports both helpers and queries.

    These two concepts have important distinctions that are poorly differentiated in 8.2.1.12, where as a minimum the two italicized terms 'helper' and 'query' should be used when defining the semantics of each.

    Presumably a 'query' cannot modify anything (other than the log file) anywhere.

    Presumably a 'helper' can modify anything anywhere, except of course sets and tuples that are always immutable.

    The current wording suggests that a 'helper' can modify sets and tuples but cannot modify objects or create objects. Surely a 'helper' cannot modify sets or tuples but can create or update objects?

  • Reported: QVT 1.2 — Wed, 6 Aug 2014 04:00 GMT
  • Disposition: Duplicate or Merged — QVT 1.3
  • Disposition Summary:

    Inadequate helper/query distinction

    The Helper class in the AS syntax supports both helpers and queries.

    These two concepts have important distinctions that are poorly differentiated in 8.2.1.12, where as a minimum the two italicized terms 'helper' and 'query' should be used when defining the semantics of each.

    Presumably a 'query' cannot modify anything (other than the log file) anywhere.

    Presumably a 'helper' can modify anything anywhere, except of course sets and tuples that are always immutable.

    The current wording suggests that a 'helper' can modify sets and tuples but cannot modify objects or create objects. Surely a 'helper' cannot modify sets or tuples but can create or update objects?

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: invalid in ImperativeOCL

  • Key: QVT13-29
  • Legacy Issue Number: 19548
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    OCL defines invalid as the result of a failed evaluation. The QVT specification is almost totally silent on invalid, except for a few library operations that may generate it.

    Presumably an invalid not 'caught' by oclIsInvalid/oclIsUndefined in QVTo causes a to-be-specifued exception to be raised in the problem statement.

    Presumably an invalid not 'caught' by oclIsInvalid/oclIsUndefined in QVTc/QVTr inhibits the detection of matches.

  • Reported: QVT 1.2 — Mon, 28 Jul 2014 04:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    invalid in QVT

    OCL defines invalid as the result of a failed evaluation. The QVT specification is almost totally silent on invalid, except for a few library operations that may generate it.

    Presumably an invalid not 'caught' by oclIsInvalid/oclIsUndefined in QVTo causes a to-be-specifued exception to be raised in the problem statement.

    Presumably an invalid not 'caught' by oclIsInvalid/oclIsUndefined in QVTc/QVTr inhibits the detection of matches.

    Discussion

    But invalid may be temporarily caught by a let variable of QVTo var. It is the use that is a problem.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: 'result' for Tuple returns

  • Key: QVT13-28
  • Legacy Issue Number: 19505
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The current phrasing

    Within a contextual operation <it>result</it> represents the unique result parameter (if there is a unique declared result) or the
    tuple containing the list of declared result parameters.

    suggests that the synthetic Tuple return is accessible as result. This is not necessary and imposes considerable implementation difficulties since a new Tuple would need creation with each mutation.

    Sucggest the new wording.

    Within a contextual operation for which no name is specified for a single return parameter, <it>result</it> is the implicit name of the parameter. If the name is specified explicitly, as is necessary for multiple returns, no pre-defined <it>result</it> variable exists.

  • Reported: QVT 1.2 — Wed, 2 Jul 2014 04:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Clarify availability of 'result' for Tuple returns

    The current phrasing

    Within a contextual operation result represents the unique result parameter (if there is a unique declared result) or the
    tuple containing the list of declared result parameters.

    suggests that the synthetic Tuple return is accessible as result. This is not necessary and imposes considerable implementation difficulties since a new Tuple would need creation with each mutation.

    Suggest the new wording.

    Within a contextual operation for which no name is specified for a single return parameter, result is the implicit name of the parameter. If the name is specified explicitly, as is necessary for multiple returns, no pre-defined result variable exists.

    Discussion

    Yes

  • Updated: Tue, 29 Mar 2016 15:09 GMT

Multiple input models

  • Key: QVT13-26
  • Legacy Issue Number: 19428
  • Status: closed  
  • Source: kustar.ac.ae ( Fatma Mohamed)
  • Summary:

    This is a suggestion:

    A developer may need to take a set of in models that may vary in size each time he runs the transformation.

    So, instead of hard-coding the input/out put models when defining the transformation like this:

    transformation Uml2Rdbms(in uml:UML,out rdbms:RDBMS)

    The developer should be able to define a dynamic set of input models. So that he will not be obligated to change the transformation definition if the number of input models change every time he runs the transformation.

    For example, I defined a transformation that takes multiple input models (conforming to the same meta-model) to merge them. Now, I got different number of in models every time I run the transformation. To make this more dynamic, I need to take an array of models as an input to my transformation without specifying their numbers in the transformation definition each time I run the transformation.

  • Reported: QVT 1.1 — Thu, 22 May 2014 04:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Dynamic set of input models

    This is a suggestion:

    A developer may need to take a set of in models that may vary in size each time he runs the transformation.

    So, instead of hard-coding the input/out put models when defining the transformation like this:

    transformation Uml2Rdbms(in uml:UML,out rdbms:RDBMS)

    The developer should be able to define a dynamic set of input models. So that he will not be obligated to change the transformation definition if the number of input models change every time he runs the transformation.

    For example, I defined a transformation that takes multiple input models (conforming to the same meta-model) to merge them. Now, I got different number of in models every time I run the transformation. To make this more dynamic, I need to take an array of models as an input to my transformation without specifying their numbers in the transformation definition each time I run the transformation.

    Discussion - imperative

    This is already supported by the QVTo grammar. Just define a Collection of models as input or output.

    transformation Uml2Rdbms(in uml:Sequence(UML),out rdbms:Sequence(RDBMS))

    and use collection operations to access the individual models.

    Discussion - declarative

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: when and where as assertions

  • Key: QVT13-24
  • Legacy Issue Number: 18363
  • Status: closed  
  • Source: gmail.com ( Fáo Levy Siqueira)
  • Summary:

    In operational QVT, it is not clear what happens when the "when" or "where" clause of an inherited mapping does not hold.

    Suggestion:
    Considering inheritance is a type (or, maybe, a synonym) of generalization, it would be expected that the semantics of inheritance mimics the semantics of generalization in MOF. The UML, which defines generalization used by CMOF and EMOF, states: "... features specified for instances of the general classifier are implicitly specified for instances of the specific classifier. Any constraint applying to instances of the general classifier also applies to instances of the specific classifier." (UML Infrastructure 2.4.1, p.51). If the "when" and "where" clauses are considered as features of a mapping, the clauses of the inherited mapping should be implicitly specified. Similarly, if they are considered as constraints applying to a mapping, the clauses defined in the inherited mapping should apply to the inheriting mapping. Therefore, a possible solution in both situations is to consider that the "when" and "where" clauses must hold in the inheriting mapping.

    Commentary:
    An interesting discussion is if something similar to the Liskov substitution principle should be applied in this situation.

  • Reported: QVT 1.1 — Fri, 4 Jan 2013 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Undefined semantics for unsatisfied "when" and "where" in inherited mapping

    In operational QVT, it is not clear what happens when the "when" or "where" clause of an inherited mapping does not hold.

    Suggestion:
    Considering inheritance is a type (or, maybe, a synonym) of generalization, it would be expected that the semantics of inheritance mimics the semantics of generalization in MOF. The UML, which defines generalization used by CMOF and EMOF, states: "... features specified for instances of the general classifier are implicitly specified for instances of the specific classifier. Any constraint applying to instances of the general classifier also applies to instances of the specific classifier." (UML Infrastructure 2.4.1, p.51). If the "when" and "where" clauses are considered as features of a mapping, the clauses of the inherited mapping should be implicitly specified. Similarly, if they are considered as constraints applying to a mapping, the clauses defined in the inherited mapping should apply to the inheriting mapping. Therefore, a possible solution in both situations is to consider that the "when" and "where" clauses must hold in the inheriting mapping.

    Commentary:
    An interesting discussion is if something similar to the Liskov substitution principle should be applied in this situation.

    Discussion

    The suggestions regarding constraint inheritance and LSP are appropriate for a declarative language; they are not appropriate for a pragmatic imperative language such as QVTo. Each mapping can be independently specified.

    It can be made clearer that pre and post conditions are assertions that fail accordingly.

    Comparison of QVTr/QVTo when and where highlights the fallacy that a QVTo mapping is a refinement of QVTr relation. In QVTo, failure of a where post-condition is a catastrophic assertion failure, whereas a QVTr where clause is a corrollary to be attempted afterwards and ignored if it fails/fails to match. The claim in 8.1.4 that the QVTo when and where clauses are owned by QVTr is untrue; QVTo owns its own when and where clauses and works very well without any QVTr objects.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Tracing and Resolving

  • Key: QVT13-23
  • Legacy Issue Number: 18324
  • Status: closed  
  • Source: campus.upb.de ( Christopher Gerking)
  • 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.

  • Reported: QVT 1.1 — Thu, 27 Dec 2012 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition 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.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Trace data for an 'accessed' transformation

  • Key: QVT13-22
  • Legacy Issue Number: 18323
  • Status: closed  
  • Source: campus.upb.de ( Christopher Gerking)
  • 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.

  • Reported: QVT 1.1 — Thu, 27 Dec 2012 05:00 GMT
  • Disposition: Duplicate or Merged — QVT 1.3
  • Disposition 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.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTc/QVTr: Queries and their contexts

  • Key: QVT13-20
  • Legacy Issue Number: 15523
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    QVTr already has queries but they are much less user friendly than e.g. MOFM2T's equivelent for which the first parameter is a hidden self, or indeed QVTo.

    Perhaps something closer to Complete OCL would do, allowing def'd attributes or operations.

  • Reported: QVT 1.1 — Fri, 13 Aug 2010 04:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    QVTr already has queries but they are much less user friendly than e.g. MOFM2T's equivelent

    QVTr already has queries but they are much less user friendly than e.g. MOFM2T's equivelent for which the first parameter is a hidden self, or indeed QVTo.

    Perhaps something closer to Complete OCL would do, allowing def'd attributes or operations.

    Discussion

    QVTo has contextual helpers.

    Syntactically it is trivial for QVTc and QVTo to have contextual queries just by allowing a scoped rather than simple name for the query.

    Semantically to avoid duuplicating QVTo AS irregularities we can use the synonym package merges for Complete OCL to make the implementation easy.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Introductory Examples Problems

  • Key: QVT13-16
  • Legacy Issue Number: 15376
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The second example contains

    "if result then return;"

    which has a non-boolean condition expression and a missing endif.

    In the first example, it is not clear that the revisit adds rather than overwrites.

    In the third and fourth examples it is not clear why the second pass reuses the context for the first rather than creates new objects.

  • Reported: QVT 1.1 — Sun, 18 Jul 2010 04:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    8.1.10 Errors in Examples

    The second example contains

    "if result then return;"

    which has a non-boolean condition expression and a missing endif.

    In the first example, it is not clear that the revisit adds rather than overwrites.

    In the third and fourth examples it is not clear why the second pass reuses the context for the first rather than creates new objects.

    Discussion

    The examples are much worse than suggested; verging on the diabolical.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: ListLiteralExp inheritance

  • Key: QVT13-14
  • Legacy Issue Number: 14620
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The resolution for Issue 12375 specifies that ListLiteralExp has
    CollectionLiteralExp
    as a superclass.

    This leaves the behaviour of the inherited kind and part attributes
    unspecified and
    rather embarrassing.

    ListLiteralExp (like DictLiteralExp) should inherit directly from
    LiteralExp.

  • Reported: QVT 1.1 — Wed, 11 Nov 2009 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Inappropriate ListLiteralExp inheritance (Correction to issue 12375 resolution)

    The resolution for Issue 12375 specifies that ListLiteralExp has CollectionLiteralExp as a superclass.

    This leaves the behaviour of the inherited kind and part attributes unspecified and rather embarrassing.

    ListLiteralExp (like DictLiteralExp) should inherit directly from LiteralExp.

    Discussion

    The lack of specification of ListLiteralExp::kind and ListLiteralExp::part is indeed a problem.

    CollectionLiteralExp::kind is inextensible bloat that OCL could usefully eliminate, so no ListLiteralExp::kind is needed in QVTo.

    ListLiteralExp::part is needed if QVTo is truly an extension of OCL. Unfortunately the QVTo BNF omits the ".." operator and support for CollectionRanges.

    Therefore we need to introduce the missing CollectionRange parsing. ListLiteralExp can inherit LiteralExp adding CollectionLiteralExp::part but not CollectionLiteralExp::kind. ListLiteralExp::element is misguided; ListLiteralExp::part replaces it.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Typedef for Standard Library predefined types

  • Key: QVT13-13
  • Legacy Issue Number: 13252
  • Status: closed  
  • Source: Open Canarias, SL ( Adolfo Sanchez-Barbudo Herrera [X] (Inactive))
  • Summary:

    As interpretated from the especification (pag 104), the way of adding new operations to OCL predefined types is creating new Typedef instances
    which must have the OCL predefined type as the base type. The new operations are added to this new typedef. However there are several problems:
    1. The specification doesn't provide any name for these typedefs.
    2. The specification doesn't specify which type (QVT typedef or OCL predefined type) should be used when referencing such OCL predefined types in a QVTo transformation.

    Solution for 1).
    Suggestion a: Name the typedef with the same name of the base type. This provokes name's clash with the predefined type's name, due to there are two different types from two standard libraries
    which have the same name. A possible solution, would be expliciting that typedefs (aliases) will never clash its name with its base type.

    Suggestion b: Name the tpyedef with a different name, such as QVToXXXXXX or XXXX_Alias.

    Solution for 2).
    Suggestion a: Taking the typedef as the referenced type in QVTo transformations.
    Suggestion b: Taking the OCL predefined type as the referenced type in QVTo transformations.
    Suggestion c: Considering resolution of issue 13168, so that only OCL predefined exists, and therefore, the only type which can be referenced.

    It's a little bit weird having 2 different types (a type, and its alias typedef) which represent just the same type, specially when they are related by a reference.
    My solution's preference in order are:
    Suggestion c: Just having one type to refer.
    Suggestion a: Since the typedef "extends" the behaviour of the predefined type (adding new operations), the former must be the referred one.
    Suggestion b: The OCL predefined type is referenced, but we must take into account that the operations added to the typedef are also available.

  • Reported: QVT 1.0 — Tue, 13 Jan 2009 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    QVTo Standard Library and typedefs Issue. Extending OCL predefined types

    As interpretated from the especification (pag 104), the way of adding new operations to OCL predefined types is creating new Typedef instances
    which must have the OCL predefined type as the base type. The new operations are added to this new typedef. However there are several problems:
    1. The specification doesn't provide any name for these typedefs.
    2. The specification doesn't specify which type (QVT typedef or OCL predefined type) should be used when referencing such OCL predefined types in a QVTo transformation.

    Solution for 1).
    Suggestion a: Name the typedef with the same name of the base type. This provokes name's clash with the predefined type's name, due to there are two different types from two standard libraries
    which have the same name. A possible solution, would be expliciting that typedefs (aliases) will never clash its name with its base type.

    Suggestion b: Name the tpyedef with a different name, such as QVToXXXXXX or XXXX_Alias.

    Solution for 2).
    Suggestion a: Taking the typedef as the referenced type in QVTo transformations.
    Suggestion b: Taking the OCL predefined type as the referenced type in QVTo transformations.
    Suggestion c: Considering resolution of issue 13168, so that only OCL predefined exists, and therefore, the only type which can be referenced.

    It's a little bit weird having 2 different types (a type, and its alias typedef) which represent just the same type, specially when they are related by a reference.
    My solution's preference in order are:
    Suggestion c: Just having one type to refer.
    Suggestion a: Since the typedef "extends" the behaviour of the predefined type (adding new operations), the former must be the referred one.
    Suggestion b: The OCL predefined type is referenced, but we must take into account that the operations added to the typedef are also available.

    Discussion

    The offending sentence is:

    This is specifically used in the QVT standard library to attach operations to pre-defined primitive types, like String and Collections.

    This facility is not used anywhere in the specification and there is no grammar that facilitates it. No model of the QVTo library is provided that exploits it. The sentence is therefore just an observation on a particular implementation approach.

    The approach takes no account of the very similar requirement for Complete OCL to extend types. This is being resolved by work towards OCL 2.5 / 3.0 with which QVTo will almost certainly have to comply.

    Therefore, tomorrow this sentence will be embarassing and incompatible. Today it is just irrelevant and confusing.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTc/QVTr: Imports

  • Key: QVT13-6
  • Legacy Issue Number: 12213
  • Status: closed  
  • Source: Siegfried Nolte ( Siegfried Nolte)
  • 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).

  • Reported: QVT 1.0 — Wed, 6 Feb 2008 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition 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

    http://www.omg.org/spec/UML/20131001/UML.xmi
    http://www.omg.org/spec/UML/20131001
    

    But the current syntax is essentially a Java import without the trailing * option.

    import my.model.package;
    

    It cannot reference URIs and it has the wrong separator.

    Something similar to QVTo's ModelType is needed:

    modeltype UML uses SimpleUml ("http://omg.qvt-examples.SimpleUml");
    

    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.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTr: UML to RDBMS Example Problems

  • Key: QVT13-4
  • Legacy Issue Number: 11686
  • Status: closed  
  • Source: Siegfried Nolte ( Siegfried Nolte)
  • Summary:

    top relation AssocToFKey { pKey : Key; ... when

    { ...; pKey = destTbl.key; }

    ... } In my opinion that doesn't work. pKey is of type Key, destTbl.key is of type OrderedSet key, isn't it ?

  • Reported: QVT 1.0 — Mon, 26 Nov 2007 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Section: A1.1.1

    top relation AssocToFKey { pKey : Key; ... when

    { ...; pKey = destTbl.key; }

    ... } In my opinion that doesn't work. pKey is of type Key, destTbl.key is of type OrderedSet key, isn't it ?

    Discussion

    Yes. Well at least it's a Collection; the diagram leaves an ambiguity.

    Comparison with the QVTc solution shows that the 'primary' key should be selected, and initialized on creation.

    Loading the example in the Eclipse QVTr editor reveals many more problems.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

Missing Identifier Syntax

  • Key: QVT13-2
  • Legacy Issue Number: 10935
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The syntax of identifiers is undefined.

    The syntax for mapping clearly prohibits the use of a direction named 'where'.

    Suggest: identifier is an OCL simpleName, less the new reserved words (check default enforce
    imports map realize refines transformation uses where)

    Suggest: a string-literal may be used as an identifier to support awkward identifiers such as 'where'.

  • Reported: QVT 1.0 — Sun, 25 Mar 2007 04:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Identifiers

    The syntax of identifiers is undefined.

    The syntax for mapping clearly prohibits the use of a direction named 'where'.

    Suggest: identifier is an OCL simpleName, less the new reserved words (check default enforce
    imports map realize refines transformation uses where)

    Suggest: a string-literal may be used as an identifier to support awkward identifiers such as 'where'.

    Discussion

    OCL 2.3/2.4 clarified identifiers and strings so we can just exploit the OCL productions including it's underscore-prefixed-string identifier.

    OCL 2.3 also introduced String::_'+' so no special description is needed for a QVTr extension.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTr: Multi-root match

  • Key: QVT13-42
  • Legacy Issue Number: 19664
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The QVTr AS and CS permit only a single pattern to be matched in the input (and output) domains. QVTc permits multi-matches.

    This can be worked around with nested collections as demonstrated by RDomainToMBottomPredicateForEnforcement in RelToCore

    remainingUnBoundDomainVars: Set(essentialocl::Variable);
    predicatesWithVarBindings:Set(qvtbase::Predicate);

    domain relations rdtVarsSeq:Sequence(Set(Element)) {
    rdtSet:Set(Element) {
    r:Relation{},
    rd:RelationDomain{},
    te:ObjectTemplateExp {bindsTo = v:Variable {}}
    ++ _
    }
    ++ _
    };

    rdtVarsSeq->at(2) = predicatesWithoutVarBindings;
    rdtVarsSeq->at(3) = unboundDomainVars;

    The above is hard to read and uses nested collections in ways that are claimed to be unsupported. Much simpler to just write:

    domain relations
    r:Relation{},
    rd:RelationDomain{},
    te:ObjectTemplateExp {bindsTo = v:Variable {}},
    predicatesWithVarBindings:Set(qvtbase::Predicate) {},
    remainingUnBoundDomainVars: Set(essentialocl::Variable) {}
    ;

    Suggest in the AS, RelationDomain.pattern changes to RelationDomain.patterns, RelationDomain.rootVariable moves to DomainPattern.rootVariable.

    Suggest in the DomainCS CS, "pattern=DomainPatternCS" changes to "patterns+=DomainPatternCS (',' patterns+=DomainPatternCS)*"

    As a consequence additional variables may be passed in a RelationCallExp. These can still be in rootVariable order.

  • Reported: QVT 1.2 — Fri, 28 Nov 2014 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    QVTr Multi-root match

    The QVTr AS and CS permit only a single pattern to be matched in the input (and output) domains. QVTc permits multi-matches.

    This can be worked around with nested collections as demonstrated by RDomainToMBottomPredicateForEnforcement in RelToCore

    remainingUnBoundDomainVars: Set(essentialocl::Variable);
    predicatesWithVarBindings:Set(qvtbase::Predicate);

    domain relations rdtVarsSeq:Sequence(Set(Element)) {
    rdtSet:Set(Element) {
    r:Relation{},
    rd:RelationDomain{},
    te:ObjectTemplateExp {bindsTo = v:Variable {}}
    ++ _
    }
    ++ _
    };

    rdtVarsSeq->at(2) = predicatesWithoutVarBindings;
    rdtVarsSeq->at(3) = unboundDomainVars;

    The above is hard to read and uses nested collections in ways that are claimed to be unsupported. Much simpler to just write:

    domain relations
    r:Relation{},
    rd:RelationDomain{},
    te:ObjectTemplateExp {bindsTo = v:Variable {}},
    predicatesWithVarBindings:Set(qvtbase::Predicate) {},
    remainingUnBoundDomainVars: Set(essentialocl::Variable) {}
    ;

    Suggest in the AS, RelationDomain.pattern changes to RelationDomain.patterns, RelationDomain.rootVariable moves to DomainPattern.rootVariable.

    Suggest in the DomainCS CS, "pattern=DomainPatternCS" changes to "patterns+=DomainPatternCS (',' patterns+=DomainPatternCS)*"

    As a consequence additional variables may be passed in a RelationCallExp. These can still be in rootVariable order.

    Discussion

    This seems to be a completely unnecessary restriction that caused the author of relToCore significant difficulties.

    The only downside seems to be a slight increase in complexity of a RelationCallExp. No longer exactly one argument per domain, but linearizing the roots per domain is not exactly hard.

    (The spelling in the discussion is that of the Eclipse QVTr prototype. Changing pattern to patterns is not appropriate for QVT1.x where property names tend to be simple-singulars. Perhaps a change to owned-plurals and so ownedPatterns may be appropriate for QVT 2.0.)

    Exploiting this in relToCore should wait until an executable version has been debugged.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: xcollect is ambiguously flattened

  • Key: QVT13-34
  • Legacy Issue Number: 19177
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    xcolect is specified to like collect, which flattens, however the xcollect pseudocode does not flatten.

  • Reported: QVT 1.1 — Thu, 9 Jan 2014 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition 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
  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Passing DataTypes 'by-reference'

  • Key: QVT13-33
  • Legacy Issue Number: 19019
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    Intuitively List and Dict are objects, so if you pass them to a mapping/query/helper as an inout parameter, the object in the caller may be updated by the call.

    This is the behaviour of a Class Instance not a DataType Value.

    Please use the open https://bugs.eclipse.org/bugs/show_bug.cgi?id=420150 to discuss this topic.

  • Reported: QVT 1.1 — Wed, 23 Oct 2013 04:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    List and Dict Class/DataType confusion

    Intuitively List and Dict are objects, so if you pass them to a mapping/query/helper as an inout parameter, the object in the caller may be updated by the call.

    This is the behaviour of a Class Instance not a DataType Value.

    Discussion

    Equally intuitively List (and Dict) are values. Two distinct 'occurrences' may be equal. This is the behavior of a DataType not a Class.

    List and Dict are specified as CollectionType (DataType) derivations so we just need to fix up indications that List and Dict are Classes.

    While clarifying wording, QVT13-120 is merged to remove the prohibition on object creation/update in helpers.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTc/QVTo/QVTr acronyms

  • Key: QVT13-101
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The full names of the QVT languages are a bit cumbersome and so QVTc/QVTo/QVTr are often found in non-OMG usage.

    Suggest that the QVT specification at least define them and perhaps use them a little too.

  • Reported: MOF 1.2 — Wed, 7 Oct 2015 11:51 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    QVTc/QVTo/QVTr acronyms

    The full names of the QVT languages are a bit cumbersome and so QVTc/QVTo/QVTr are often found in non-OMG usage.

    Suggest that the QVT specification at least define them and perhaps use them a little too.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTr: Deletion semantics

  • Key: QVT13-21
  • Legacy Issue Number: 15886
  • Status: closed  
  • Source: Institute for Defense Analyses ( Steven Wartik)
  • Summary:

    I’m having trouble with the semantics of DELETE on p. 189 of the QVT Specification (v1.1). It reads in part:

    FORALL OBJVAR IN MAKESET(<DOMAIN_K_VARIABLE_SET>) (
    …
    AND BELONGSTO(OBJVAR, MAKESET(<DOMAIN_K_VARIABLE_SET>))

    I guess I don’t understand MAKESET and BELONGSTO. First of all, <DOMAIN_K_VARIABLE_SET> is already a set, so what’s the MAKESET function do? Second, the FORALL iterates OBJVAR over the results of the same MAKESET that BELONGSTO tests. So how can BELONGSTO be false? That is, I would assume BELONGSTO is defined as follows:

    BELONGSTO(e, S) º e ÎS

    except that under this definition the expression above is always satisfied.

    Any and all help appreciated. Thank you very much.

  • Reported: QVT 1.1 — Tue, 12 Oct 2010 04:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    Specification of deletion semantics

    I’m having trouble with the semantics of DELETE on p. 189 of the QVT Specification (v1.1). It reads in part:

    FORALL OBJVAR IN MAKESET(<DOMAIN_K_VARIABLE_SET>) (
    …
    AND BELONGSTO(OBJVAR, MAKESET(<DOMAIN_K_VARIABLE_SET>))

    I guess I don’t understand MAKESET and BELONGSTO. First of all, <DOMAIN_K_VARIABLE_SET> is already a set, so what’s the MAKESET function do? Second, the FORALL iterates OBJVAR over the results of the same MAKESET that BELONGSTO tests. So how can BELONGSTO be false? That is, I would assume BELONGSTO is defined as follows:

    BELONGSTO(e, S) º e ÎS

    except that under this definition the expression above is always satisfied.

    Any and all help appreciated. Thank you very much.

    Discussion

    Well this is very embarrassing. I don't understand it all either, and I certainly do not understand why it is not written using OCL.

    I'm not convinced that QVTr has any delete semantics since declaratively delete occurs as an absence of creation.

    Must await the Eclipse QVTr prototype.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTr: Rule Overriding semantics

  • Key: QVT13-19
  • Legacy Issue Number: 15417
  • Status: closed  
  • Source: NASA ( Maged Elaasar)
  • Summary:

    The abstract syntax of QVTr allows a rule to be an override of another rule.

    Rule::overrides: Rule [0..1]
    The rule that this rule overrides.

    The concrete syntax of QVT allows it too:

    <relation> ::= ['top'] 'relation' <identifier>
    ['overrides' <identifier>]
    '

    {' .... '}

    '

    However, the only semantics I can see for 'overrides' is in clause 7.11.1.4 that says:

    "A rule may conditionally override another rule. The overriding rule is executed in place of the overridden rule when the overriding conditions are satisfied. The exact semantics of overriding are subclass specific. "

    Questions:

    1- Whtat are the overriding conditions? are they implied or specified and if so how?

    2- I have not seen any other discussion of overrding in a subclass or Rule so not sure what is meant by "The exact semantics of overriding are subclass specific"?

    3- I have not seen any example of using 'overrides' what so ever in the spec, shouldn't there be one?

    4 - What is the semantics of overriding? is it related to inheritance in the OO sense ? I think QVTr needs a good "inheritance" model where you can relations can be called polymorphically.

  • Reported: QVT 1.1 — Fri, 13 Aug 2010 04:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    Rule Overriding in QVTr

    The abstract syntax of QVTr allows a rule to be an override of another rule.

    Rule::overrides: Rule [0..1]
    The rule that this rule overrides.

    The concrete syntax of QVT allows it too:

    <relation> ::= ['top'] 'relation' <identifier>
    ['overrides' <identifier>]
    '

    {' .... '}

    '

    However, the only semantics I can see for 'overrides' is in clause 7.11.1.4 that says:

    "A rule may conditionally override another rule. The overriding rule is executed in place of the overridden rule when the overriding conditions are satisfied. The exact semantics of overriding are subclass specific. "

    Questions:

    1- What are the overriding conditions? are they implied or specified and if so how?

    2- I have not seen any other discussion of overriding in a subclass or Rule so not sure what is meant by "The exact semantics of overriding are subclass specific"?

    3- I have not seen any example of using 'overrides' what so ever in the spec, shouldn't there be one?

    4 - What is the semantics of overriding? is it related to inheritance in the OO sense ? I think QVTr needs a good "inheritance" model where you can relations can be called polymorphically.

    Discussion

    This now a much better understood field:

    M. Wimmer, G. Kappel, A. Kusel, W. Retschitzegger, J. Schönböck, W. Schwinger, D. Kolovos, R. Paige, M. Lauder, A. Schürr, D. Wagelaar. Surveying Rule Inheritance in Model-to-Model Transformation Languages. In Journal of Object Technology, vol. 11, no. 2, 2012, pages 3:1–46. doi:10.5381/jot.2012.11.2.a3

    QVTBase currently imposes single overriding which is unnecessary, and causes a problem for an application that needs to extend when B1 overrides A and B2 overrides A. The extending mapping needs C to override both B1 and B2 to ensure that C occludes both B1 and B2. Therefore we need multi-overrides.

    Oops. A QVTc Mapping::refines is an alternative concept that competes without comment with the inherited Rule::overrides. relToCore completely ignores the semantics of overrides translation. Relation::overrides should probably map across unchanged to Mapping::overrides. QVTc and QVTr semantics are unchanged.

    Fixing this textually without a prototype is too much of change.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTc/QVTr: View/Transformation discrepancy

  • Key: QVT13-18
  • Legacy Issue Number: 15411
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • 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

  • Reported: QVT 1.1 — Tue, 10 Aug 2010 04:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition 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.

  • Updated: Tue, 29 Mar 2016 15:09 GMT
  • Attachments:

QVTo: Relationship between QVTo Mapping and QVTr Relation

  • Key: QVT13-17
  • Legacy Issue Number: 15390
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    8.1.4 states "a mapping operation is always a refinement of an implicit relation" but 8.2.15 defines "refinedRelation: Relation [0..1] The refined relation, if any." Clearly a contradiction.

    8.1.4. provides the REL_PackageToSchema example of how an implicit relation might be defined, but no other examples or synthesis rules are supplied.

    enforce and checkonly appear in the REL_PackageToSchema example indicating that these define execution mode of a QVTo trnasformation, but there does not appear to be any description of how a transformation might be executed to for instance update an output model. Perhaps the 'output' parameter is 'inout' for create/update but 'out' for create/overwrite.

  • Reported: QVT 1.1 — Fri, 30 Jul 2010 04:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    8 Unclear mapping operation characteristics

    8.1.4 states "a mapping operation is always a refinement of an implicit relation" but 8.2.15 defines "refinedRelation: Relation [0..1] The refined relation, if any." Clearly a contradiction.

    8.1.4. provides the REL_PackageToSchema example of how an implicit relation might be defined, but no other examples or synthesis rules are supplied.

    enforce and checkonly appear in the REL_PackageToSchema example indicating that these define execution mode of a QVTo trnasformation, but there does not appear to be any description of how a transformation might be executed to for instance update an output model. Perhaps the 'output' parameter is 'inout' for create/update but 'out' for create/overwrite.

    Discussion

    The aspiration that every QVTo mapping has an underlying QVTr relation is fairly dubious. But there is no point respecifying until some prototyping feedback is available.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTr: syntax mapping (correction to Issue 10646 resolution)

  • Key: QVT13-15
  • Legacy Issue Number: 14640
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The numerous problems identified in http://www.omg.org/archives/qvt-rtf/msg00094.html need to be addressed. Apologies too for the long email. This is a very difficult area where precision is important. Provision of
    this resolution demonstrates the need for the resolution, but unfortunately the resolution has an
    erroneous precision that will make QVTr 1.1 unimplementable whereas QVTr 1.0 is just mildly
    ambiguous and conflicting.
    Please do not include the resolution in QVT 1.1 without significantrework.
    I found the definition of the "checkonly"/"enforce" to isCheckable/isEnforceable helpful, although
    different to three of my own intuitive guesses based on attempts to avoid errors in ModelMorf and
    Rel2Core examples.
    The problems identified below are the result of a local review of the resolution. In the absence of a
    coherent Environment semantics it has not been possible to perform a global review. In particular, I
    was unable to review the specification for the arguably redundant bindsTo.
    [Incidentally, the same resolution approach is needed for QVTc and QVTo].
    Disambiguating rules
    --------------------
    The resolution uses a similar approach to the OCL 2.0 specification, but neglects to provide any
    disambiguating rules although many are needed.
    Environments
    ------------
    OCL and the resolution employ environments to carry definitions specific to particular CS constructs,
    so that a CS reference may be resolved with the aid of an environment or the AST.
    In EssentialOCL, all definitions are resolvable with in the immutable AST with the exception of let and
    iterator expressions for which a nestedEnvironment() is used to carry the extra variable declaration
    with the aid of addElement(). The nestedEnvironment supports name occlusion from outer scopes.
    In CompleteOCL, further definitions may be introduced by a definition constraint. The OCL
    specification provides no precise insight into how an environment changes to accommodate the
    definition. Should the name be added to the AST or to the environment? Is the name available for
    forward reference?
    Environment::addElement is defined as a query operation thereby inhibiting side effects. Consequently
    usage such as
    XX.env = YY.env.addElement(Z.name, Z.ast, false)
    leaves the environment of YY unchanged and creates an extended environment for XX.
    A series of such usages creates a series of progressively elaborated environments that support
    backward but not forward referencing. This was not a clear requirement of the QVT 1.0 specification
    and it prevents any variable declarations being introduced in an object template tree being resolved
    through environments in other object template trees or predicate expressions.
    QVT 1.2 RTF Report Page 173 of 190
    Object Management Group
    RTF/FTF Report
    Imposition of no forward referencing seems very undesirable, particularly since the order of domains is
    imposed by the model parameter order. Imagine a Java program in which all methods had to be
    defined in a no-forward reference order.
    As noted above, CompleteOCL neglected to define how AST definitions were added to the AST. QVTr
    must solve this problem since QVTr defines a hierarchically scoped AST rather than an annotation of
    a pre-existing AST.
    I recommend a two stage approach. The inherited attributes section should first compute an
    environment from the pushed-down parent environment augmented by pull-ups from child constructs
    so that a complete immutable and consequently unambiguous environment is associated with each
    construct and then pushed-down to the children. During the pull-up the environment acquires a
    mapping from name to future-AST. During the push-down residual future-AST attributes are populated
    to give a valid AST.
    Reference resolution
    --------------------
    OCL uses lookup functions to resolve variable references. It is necessary either to overload the lookup
    functions so that the the distinct QVTr variable definition sites can be located in the AST, or to use
    some form of Environment::addElement where each definition is defined so that resolution in the
    environment is possible.
    Details
    =======
    Throughout, many disambiguating rules are needed to define illegal semantics. For instance "any" is
    often used to select a syntactically valid value. Corresponding usage in the OCL specification has a
    disambiguating rule to clarify what the consequence of not "one" is.
    My current best attempt at Disambiguating Rules is attached.
    Environment::addElement takes three arguments, the third being a mayBeImplicit argument. This has
    been omitted throughout without explanation.
    identifierCS
    ------------
    OCL defines SimpleNameCS. A degenerate mapping from identifierCS to SimplenameCS is required.
    topLevelCS
    ----------
    The 'imported transformation' environment element is later referenced as 'imported transformations'.
    Typo: TransformationListCS for transformationListCS in Synthesized attributes.
    importListCS
    ------------
    Semantics of import conflicts must be defined.
    unitCS
    ------
    Typo: ast is not a Set.
    Surely the import is of packages (enumerations or operations)or at least transformations (QVTo
    implementations) rather than necessarily relational-transformations?
    transformationCS
    ----------------
    QVT 1.2 RTF Report Page 174 of 190
    Object Management Group
    RTF/FTF Report
    ownedTag is not synthesized.
    keyDeclListCS
    -------------
    Typo: wrong font in synthesized attributes
    modelDeclCS
    -----------
    The [B] grammar:
    modelDeclCS ::= modelIdCS ':' '

    {' metaModelIdListCS '}

    '
    is missing.
    keyDeclCS
    ---------
    Synthesized attributes appear to have experienced a copy and paste error while providing distinct part
    and oppositePart left hand sides.
    keyPropertyCS
    -------------
    The synthesized attributes poke the parent.
    Suggest: it would be clearer for the parent to gather and distribute children similar to the relation/query
    allocation by transformationCS.
    relationCS
    ----------
    Transformation.extends does not appear to be transitive.
    topQualifierCS
    --------------
    Suggest: a boolean or enumerated value rather than a string.
    domainListCS
    ------------
    Typo: missing indentation.
    primitiveTypeDomainCS
    ---------------------
    isCheckable, isEnforceable not synthesized.
    objectTemplateCS
    ----------------
    Variable needs to be added to relation to provide a container.
    Variable needs to be added to relation environment to provide visibility.
    collectionTemplateCS
    --------------------
    Variable needs to be added to relation to provide a container.
    Variable needs to be added to relation environment to provide visibility.
    Suggest: last two if guards are redundant.
    QVT 1.2 RTF Report Page 175 of 190
    Object Management Group
    RTF/FTF Report
    restCS
    ------
    Variable needs to be added to relation to provide a container.
    Non-_ named variable needs to be added to relation environment to provide visibility.
    memberCS
    --------
    Variable needs to be added to relation to provide a container.
    Non-_ named variable needs to be added to relation environment to provide visibility.
    whenCS
    ------
    predicateListCS should be optional.
    whereCS
    -------
    predicateListCS should be optional.
    ExtOclExpressionCS
    ------------------
    This is not present in the QVTr or OCL grammar.
    Presumably it represents the QVTr extension to OCL's OclExpressionCS.
    However it is an extension, since at least RelationCallExpCS can be used in an ordinary
    OclExpressionCS using "not" or "and".
    [A], [B], [C] should therefore follow on from OCL's
    [A], [B], [C]..., [I].
    RelationCallExpressionCS
    ------------------------
    How is a RelationCallExpressionCS distinguished from an OperationCallExpCS?

  • Reported: QVT 1.1 — Mon, 16 Nov 2009 05:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    QVTr syntax mapping (correction to Issue 10646 resolution)

    The numerous problems identified in http://www.omg.org/archives/qvt-rtf/msg00094.html need to be addressed. Apologies too for the long email. This is a very difficult area where precision is important. Provision of
    this resolution demonstrates the need for the resolution, but unfortunately the resolution has an
    erroneous precision that will make QVTr 1.1 unimplementable whereas QVTr 1.0 is just mildly
    ambiguous and conflicting.
    Please do not include the resolution in QVT 1.1 without significantrework.
    I found the definition of the "checkonly"/"enforce" to isCheckable/isEnforceable helpful, although
    different to three of my own intuitive guesses based on attempts to avoid errors in ModelMorf and
    Rel2Core examples.
    The problems identified below are the result of a local review of the resolution. In the absence of a
    coherent Environment semantics it has not been possible to perform a global review. In particular, I
    was unable to review the specification for the arguably redundant bindsTo.
    [Incidentally, the same resolution approach is needed for QVTc and QVTo].
    Disambiguating rules
    --------------------
    The resolution uses a similar approach to the OCL 2.0 specification, but neglects to provide any
    disambiguating rules although many are needed.
    Environments
    ------------
    OCL and the resolution employ environments to carry definitions specific to particular CS constructs,
    so that a CS reference may be resolved with the aid of an environment or the AST.
    In EssentialOCL, all definitions are resolvable with in the immutable AST with the exception of let and
    iterator expressions for which a nestedEnvironment() is used to carry the extra variable declaration
    with the aid of addElement(). The nestedEnvironment supports name occlusion from outer scopes.
    In CompleteOCL, further definitions may be introduced by a definition constraint. The OCL
    specification provides no precise insight into how an environment changes to accommodate the
    definition. Should the name be added to the AST or to the environment? Is the name available for
    forward reference?
    Environment::addElement is defined as a query operation thereby inhibiting side effects. Consequently
    usage such as
    XX.env = YY.env.addElement(Z.name, Z.ast, false)
    leaves the environment of YY unchanged and creates an extended environment for XX.
    A series of such usages creates a series of progressively elaborated environments that support
    backward but not forward referencing. This was not a clear requirement of the QVT 1.0 specification
    and it prevents any variable declarations being introduced in an object template tree being resolved
    through environments in other object template trees or predicate expressions.
    QVT 1.2 RTF Report Page 173 of 190
    Object Management Group
    RTF/FTF Report
    Imposition of no forward referencing seems very undesirable, particularly since the order of domains is
    imposed by the model parameter order. Imagine a Java program in which all methods had to be
    defined in a no-forward reference order.
    As noted above, CompleteOCL neglected to define how AST definitions were added to the AST. QVTr
    must solve this problem since QVTr defines a hierarchically scoped AST rather than an annotation of
    a pre-existing AST.
    I recommend a two stage approach. The inherited attributes section should first compute an
    environment from the pushed-down parent environment augmented by pull-ups from child constructs
    so that a complete immutable and consequently unambiguous environment is associated with each
    construct and then pushed-down to the children. During the pull-up the environment acquires a
    mapping from name to future-AST. During the push-down residual future-AST attributes are populated
    to give a valid AST.
    Reference resolution
    --------------------
    OCL uses lookup functions to resolve variable references. It is necessary either to overload the lookup
    functions so that the the distinct QVTr variable definition sites can be located in the AST, or to use
    some form of Environment::addElement where each definition is defined so that resolution in the
    environment is possible.
    Details
    =======
    Throughout, many disambiguating rules are needed to define illegal semantics. For instance "any" is
    often used to select a syntactically valid value. Corresponding usage in the OCL specification has a
    disambiguating rule to clarify what the consequence of not "one" is.
    My current best attempt at Disambiguating Rules is attached.
    Environment::addElement takes three arguments, the third being a mayBeImplicit argument. This has
    been omitted throughout without explanation.
    identifierCS
    ------------
    OCL defines SimpleNameCS. A degenerate mapping from identifierCS to SimplenameCS is required.
    topLevelCS
    ----------
    The 'imported transformation' environment element is later referenced as 'imported transformations'.
    Typo: TransformationListCS for transformationListCS in Synthesized attributes.
    importListCS
    ------------
    Semantics of import conflicts must be defined.
    unitCS
    ------
    Typo: ast is not a Set.
    Surely the import is of packages (enumerations or operations)or at least transformations (QVTo
    implementations) rather than necessarily relational-transformations?
    transformationCS
    ----------------
    QVT 1.2 RTF Report Page 174 of 190
    Object Management Group
    RTF/FTF Report
    ownedTag is not synthesized.
    keyDeclListCS
    -------------
    Typo: wrong font in synthesized attributes
    modelDeclCS
    -----------
    The [B] grammar:
    modelDeclCS ::= modelIdCS ':' '

    {' metaModelIdListCS '}

    '
    is missing.
    keyDeclCS
    ---------
    Synthesized attributes appear to have experienced a copy and paste error while providing distinct part
    and oppositePart left hand sides.
    keyPropertyCS
    -------------
    The synthesized attributes poke the parent.
    Suggest: it would be clearer for the parent to gather and distribute children similar to the relation/query
    allocation by transformationCS.
    relationCS
    ----------
    Transformation.extends does not appear to be transitive.
    topQualifierCS
    --------------
    Suggest: a boolean or enumerated value rather than a string.
    domainListCS
    ------------
    Typo: missing indentation.
    primitiveTypeDomainCS
    ---------------------
    isCheckable, isEnforceable not synthesized.
    objectTemplateCS
    ----------------
    Variable needs to be added to relation to provide a container.
    Variable needs to be added to relation environment to provide visibility.
    collectionTemplateCS
    --------------------
    Variable needs to be added to relation to provide a container.
    Variable needs to be added to relation environment to provide visibility.
    Suggest: last two if guards are redundant.
    QVT 1.2 RTF Report Page 175 of 190
    Object Management Group
    RTF/FTF Report
    restCS
    ------
    Variable needs to be added to relation to provide a container.
    Non-_ named variable needs to be added to relation environment to provide visibility.
    memberCS
    --------
    Variable needs to be added to relation to provide a container.
    Non-_ named variable needs to be added to relation environment to provide visibility.
    whenCS
    ------
    predicateListCS should be optional.
    whereCS
    -------
    predicateListCS should be optional.
    ExtOclExpressionCS
    ------------------
    This is not present in the QVTr or OCL grammar.
    Presumably it represents the QVTr extension to OCL's OclExpressionCS.
    However it is an extension, since at least RelationCallExpCS can be used in an ordinary
    OclExpressionCS using "not" or "and".
    [A], [B], [C] should therefore follow on from OCL's
    [A], [B], [C]..., [I].
    RelationCallExpressionCS
    ------------------------
    How is a RelationCallExpressionCS distinguished from an OperationCallExpCS?

    Discussion

    These issues cannot be sensibly addressed until the auto-generation being pioneered for OCL can be re-used.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Standard Library return types

  • Key: QVT13-12
  • Legacy Issue Number: 13181
  • Status: closed  
  • Source: Open Canarias, SL ( Adolfo Sanchez-Barbudo Herrera [X] (Inactive))
  • Summary:
      • QVTo Standard Library. Some operation's returned values would better return the TemplateParameterType **
        Several stdlib operations would be better changed to avoid doing unnecessary castings on the returned value of the operation.

    For AnyType::oclAsType(oclType) operation I could write:

    var aClass : Class := anotherVar.oclAsType(Class);

    However, for Model::objectsOfType(OclType) operation I can't do:

    var aClassSet : Set(Class) := aModel.objectsOfType(Class);

    I have to do the following, instead:

    var aClassSet : Set(Class) := aModel.objectsOfType(Class).oclAsType(Set(Class));

    Therefore, for end-user usability, I propose exploiting TemplateParameterType and changing some QVTo Standard Library operations

    Element::subobjectsOfType(OclType) : Set(T)
    Element::allSubobjects(OclType) : Set(T)
    Element::subobjectsOfKind(OclType) : Set(T)
    Element::allSubobjectsOfKind(OclType) : Set(T)
    Element::clone() : T
    Element::deepclone() : T
    Model::objectsOfType(OclType) : Set(T)
    Model::copy() : T
    Model::createEmptyModel(): T

    Note: this approach is made in the Object::asOrderedTuple() : OrderedTuple(T) operation.

  • Reported: QVT 1.0 — Fri, 19 Dec 2008 05:00 GMT
  • Disposition: Duplicate or Merged — QVT 1.3
  • Disposition Summary:

    8.3.5.7 createEmptyModel static Model::createEmptyModel() : Model Creates and initializes a model of the given type. This operation is useful when creating intermediate models within a transformation.

    QVTo Standard Library. Some operation's returned values would better return the TemplateParameterType **
    Several stdlib operations would be better changed to avoid doing unnecessary castings on the returned value of the operation.

    For AnyType::oclAsType(oclType) operation I could write:

    var aClass : Class := anotherVar.oclAsType(Class);

    However, for Model::objectsOfType(OclType) operation I can't do:

    var aClassSet : Set(Class) := aModel.objectsOfType(Class);

    I have to do the following, instead:

    var aClassSet : Set(Class) := aModel.objectsOfType(Class).oclAsType(Set(Class));

    Therefore, for end-user usability, I propose exploiting TemplateParameterType and changing some QVTo Standard Library operations

    Element::subobjectsOfType(OclType) : Set(T)
    Element::allSubobjects(OclType) : Set(T)
    Element::subobjectsOfKind(OclType) : Set(T)
    Element::allSubobjectsOfKind(OclType) : Set(T)
    Element::clone() : T
    Element::deepclone() : T
    Model::objectsOfType(OclType) : Set(T)
    Model::copy() : T
    Model::createEmptyModel(): T

    Note: this approach is made in the Object::asOrderedTuple() : OrderedTuple(T) operation.

    Discussion

    subobjectsOfType etc duplicate QVT13-53

    clone/deepclone merged into QVT13-53

    Model::copy/createEmptyModel - NO. Model is the correct return type.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: synonyms

  • Key: QVT13-11
  • Legacy Issue Number: 13180
  • Status: closed  
  • Source: Open Canarias, SL ( Adolfo Sanchez-Barbudo Herrera [X] (Inactive))
  • Summary:

    his section (8.3.2) is very confusing for the reader. What does synonym means ? - Is just like a shorthand of the concrete syntax ? - Is just a new operation included in the QVTo Standard Library semantically equivalent?. Ideally, just one type/operation must exist (the OCL predefined type and the operation of an OCL predefined type), so that, writing Void (a type) or asType (operation) should produce the same AST as if I write OclVoid or oclAsType. With this idea, I'm really puzzled with the third paragraph of the section. Please revise this section so that it is less confusing.

  • Reported: QVT 1.0 — Fri, 19 Dec 2008 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    section (8.3.2) is very confusing for the reader

    This section (8.3.2) is very confusing for the reader. What does synonym means ? - Is just like a shorthand of the concrete syntax ? - Is just a new operation included in the QVTo Standard Library semantically equivalent?. Ideally, just one type/operation must exist (the OCL predefined type and the operation of an OCL predefined type), so that, writing Void (a type) or asType (operation) should produce the same AST as if I write OclVoid or oclAsType. With this idea, I'm really puzzled with the third paragraph of the section. Please revise this section so that it is less confusing.

    Discussion - Ocl type prefixes

    As an OCL user, I find the attempt and recommendation to hide the underlying OCL functionality very confusing, particularly when it introduces potential collisions whose prevention is inaccurately described.

    Since the description of the M1 types does not enumerate them, I am not clear which types are intended. If Eclipse QVTo is any guide, it would be OclAny/Any, OclVoid/Void, but not OclElement, OclInvalid, OclMessage, OclState, OclType.

    If this policy is to remain recommended, it must also apply to all of the above. I find the injection of Element and Type into the user's namespace particularly offensive.

    I recommend that the recommendation be reversed, so that we just observe that QVTo implementations offering backward compatibility may permit the seven enumerated synonyms to be used as shortforms of the full spelling.

    Discussion - ocl operation prefixes

    The references to the "Ocl" prefix are inaccurate for operations where it is "ocl".

    As an OCL user, I find the attempt and recommendation to hide the underlying OCL functionality a bit confusing, particularly since the abbreviated forms are used very little used in the editorial text and have no definition.

    I recommend eliminating their editorial usage and defining them as synonyms that a QVTo implementation offering backward compatibility may support as an alternate spelling that is mapped to the full spelling when used within the abstract syntax

    Discussion - Operation name synonyms

    This section was written for OCL 2.0 which has no String::+ operator. String::+ is available in OCL 2.4 so there is no need for QVT 1.2 to define it as a synonym.The other mathematical operators have always been part of OCL, so the purpose of enumerating them is unclear and indeed confusing. Is there actually an operation with the spelling "operator+"? I see no need for one. In the concrete syntax, "+" is fully available. In UML and OCL "+" is a permissible internal spelling for an operation name. The _'+' escape enables its use in arbitrary name contexts.

    The only question is whether a particular implementation might choose to use "plus" as a spel;ling to avoid problems in languages that do not allow arbitrary spellings. But that is an implementation language-specific choice that does not affect QVT or OCL; perhaps relevant to the Java-binding for OCL specification if written. FWIW, Eclipse QVTo has no "operator+" operation.

    Conversely, is the specification actually saying that "plus" may be used rather than "+"? This might be a way of elevating an implementation language workaround into the source, which seems rather perverse. FWIW, Eclipse QVTo provides no "divide" operation.

    The operation synonym sentences can be eliminated without any loss.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Typedef

  • Key: QVT13-10
  • Legacy Issue Number: 13168
  • Status: closed  
  • Source: Open Canarias, SL ( Adolfo Sanchez-Barbudo Herrera [X] (Inactive))
  • Summary:

    Creating aliases seems to be a good idea specially when dealing with complex types. However, for that purpose, it is not clear to me that we need to create a (useless) typedef just to represent an alias in the concrete syntax. In practice aliases are very useful when writing transformations (in concrete syntax), but they are useless in the abstract syntax (extra unnecessary classes in modules). One may still think that a typedef as an alias (no extra condition) may be needed to add operations to existing types, as specification suggests doing in order to include new operations for the OCL standard library predefined types. However, this still can be done by means of helpers. Suggestions: - Remove the statements related to aliases in the section 8.2.2.24 - Make Typedef.condition reference be mandatory in Figure 8.7 since, now, Typedef in the abstract syntax will be used to constrain existing types. - Add statements in the concrete syntax section, to clarify the use of aliases to rename existing types. Maybe, a new keyword (like alias) could be included to avoid confusions with the typedef one. - Change the grammar to adapt it to these suggestions. - Clarify in the Standard Library section that helpers will be used to add new operations to the OCL Std Lib predefined type.

  • Reported: QVT 1.0 — Thu, 18 Dec 2008 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    Typedef aliases issue

    Creating aliases seems to be a good idea specially when dealing with complex types. However, for that purpose, it is not clear to me that we need to create a (useless) typedef just to represent an alias in the concrete syntax. In practice aliases are very useful when writing transformations (in concrete syntax), but they are useless in the abstract syntax (extra unnecessary classes in modules). One may still think that a typedef as an alias (no extra condition) may be needed to add operations to existing types, as specification suggests doing in order to include new operations for the OCL standard library predefined types. However, this still can be done by means of helpers. Suggestions: - Remove the statements related to aliases in the section 8.2.2.24 - Make Typedef.condition reference be mandatory in Figure 8.7 since, now, Typedef in the abstract syntax will be used to constrain existing types. - Add statements in the concrete syntax section, to clarify the use of aliases to rename existing types. Maybe, a new keyword (like alias) could be included to avoid confusions with the typedef one. - Change the grammar to adapt it to these suggestions. - Clarify in the Standard Library section that helpers will be used to add new operations to the OCL Std Lib predefined type.

    Discussion

    Ignoring the QVT Standard Library usage eliminated by the resolution of Issue 13252, http://solitaire.omg.org/browse/QVT13-13, there are two distinct usages of typedef.

    a) to create an alias
    b) to create a new constrained type

    Discussion - alias

    If an alias introduces a new type as the inheritance of Typedef from Type would suggest, we have semantic nightmares. Which type conforms to which? How do we ensure that all functionality understands the typedef equivalence? As observed, a typedef is a concrete syntax text macro that should be eliminated during conversion to the abstract syntax to avoid ambiguities. However an AS concept is needed to persist the macro. A Tag is sufficient.

    Discussion - constrained type

    The typedef syntax with a constraint introduces a new type. However all the important semantics of this type are unspecified. What are the superclasses of this type? What does it conform to? How do its operations and properties interact with the unconstrained type? Can a Constrained Integer be used as a Sequence index?

    The only example of a constrained type is:

    typedef TopLevelPackage = Package [container()=null];

    suggesting that perhaps self is to be interpreted as the type instance. If container() is the proposed oclContainer() then the example is particularly interesting. If a TopLevelPackage is assigned to a container, how does the type change? Are all assignments supposed to have a predicate evaluation to ensure that typedef constraints are not violated? Are assigned types to be changed by an assignment? Does an assignment that violates a constrained type constraint render a transformation invalid and require some form of failure?

    Look at it another way. Suppose we used bland UML. We can add an invariant to a class, which can inherit/aggregate another type to re-use it. We and general purpose tooling understand these semantics. What does a typedef constrained type offer that is new? just magic undefined semantics that cannot be used with any non-QVTo tool.

    The constrained typedef appears to be a clear case of misguided syntax sugar. If metamodeling syntax sugar is really needed, let it have a clear relationship to UML.

    Conclusion

    The alias usage is a concrete syntax synonym that has no need of a Typedef class; a Tag will do.

    The constrained type is underspecified syntax sugar. The Typedef class can be deprecated.

    FWIW: neither of these forms of typedef is implemented by Eclipse QVTo.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: element creation and element attachment/detachment to/from an extent

  • Key: QVT13-9
  • Legacy Issue Number: 13103
  • Status: closed  
  • Source: Open Canarias, SL ( Victor Sanchez)
  • 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?

  • Reported: QVT 1.0 — Fri, 21 Nov 2008 05:00 GMT
  • Disposition: Duplicate or Merged — QVT 1.3
  • Disposition 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.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: ImperativeOCL conflicts with EssentialOCL semantics

  • Key: QVT13-8
  • Legacy Issue Number: 13082
  • Status: closed  
  • Source: Anonymous
  • Summary:

    Major Problem:
    (1) The current abstract syntax of ImperativeOCL introduces a couple of
    unclear situations. This may lead to incompatible QVT implementations.
    Further Problems:
    (2) Control flow constructs introduced by ImperativeOCL are redundant
    compared with existing conventional OCL constructs.
    (3) Several OCL equivalence rules break when ImperativeOCL is present.
    Detailed problem description:
    (1) The current abstract syntax of ImperativeOCL introduces a couple of
    unclear situations. This may lead to incompatible QVT implementations.
    In the abstract syntax, ImperativeOCL expressions / statements are
    inherited from OclExpression. Therefore, conventional OCL
    expressions may (and will) contain sub-expressions that are
    actually ImperativeOCL expressions.
    In conventional OCL, the interpretation of an expression under a
    given environment is a value. In ImperativeOCL, the interpretation
    of an expression is a value and a new environment
    (state,variables). This extended interpretation is not given for
    conventional OCL expressions, leading to undefined operational
    semantics of those expressions.
    Example: Given the following compute expression:
    compute(z:Boolean) {
    var x : Boolean := true
    var y : Boolean := true
    if ((x:=false) and (y:=false))

    { ... }

    z := y
    }
    What is the value of this expression: is it true or false (It
    depends on whether the 'and' operator is evaluated short-circuit
    or strict). The situation is similar for the evaluation of the
    other logical connectives, forAll, and exists when these
    expressions contain imperative sub-expressions.
    (2) Control flow constructs introduced by ImperativeOCL are redundant
    compared with existing conventional OCL constructs.
    Some of the new language features in ImperativeOCL such as forEach
    and the imperative conditional are not really necessary. Their
    effect can already be achieved using conventional OCL expressions:
    For example:
    company.employees->forEach(c)

    { c.salary := c.salary * 1.1}

    has the same effect as
    company.employees->iterate(c; r:OclAny=Undefined |
    c.salary := c.salary * 1.1
    )
    and
    if ( x < 0 )

    { x := 0 }

    else

    { x := 1 }

    endif is the same as
    if x < 0 then x := 0 else x := 1 endif
    (3) Several OCL equivalence rules break when ImperativeOCL is present.
    In conventional OCL, several equivalence rules well known from
    logic hold. Allowing OCL expression to contain imperative
    sub-expressions breaks these equivalence rules.
    Examples:
    let x=e1 in e2 equiv. e2

    { all occurences of x replaced by e1 }

    e1 and e2 equiv. e2 and e1
    These equivalences do not necessarily hold if e1 or e2 are allowed
    to have side-effects.
    Proposed solution:
    (A) - (The cheap solution.) State textually that conventional OCL
    expressions (as described in the OMG OCL spec.) are not
    allowed to have side effects unless used as part of a top
    level ImperativeOCL expression. Therefore, even in a system
    supporting ImperativeOCL, class invariants, and pre- and
    postconditions (e.g.) will not be allowed to contain
    ImperativeOCL sub-expressions.
    State explicitly that the redundant flow control statements
    have been introduced (solely) to write concise imperative
    programs and that the side-effect free forms of conditional
    evaluation ( 'if-then-else-endif' and 'iterate' ) shall not be
    used to program side-effects (instead, the ImperativeOCL forms
    shall be used).
    (B) - (Major rework.) Rework the abstract syntax to reuse OCL
    expressions by composition rather than by inheritance.
    Imperative expressions ( => rename to 'statements' ) then may
    contain sub-statements and OCL expressions; OCL expressions
    are reused unchanged from the OCL spec (no imperative
    sub-expressions, no side-effects).
    These issues have been discussed on the MoDELS 2008 OCL Workshop,
    more details can be found at
    http://www.fots.ua.ac.be/events/ocl2008/PDF/OCL2008_9.pdf

  • Reported: QVT 1.0 — Sat, 15 Nov 2008 05:00 GMT
  • Disposition: Resolved — QVT 1.3
  • Disposition Summary:

    current abstract syntax of ImperativeOCL introduces a couple of unclear situations

    Major Problem:
    (1) The current abstract syntax of ImperativeOCL introduces a couple of unclear situations. This may lead to incompatible QVT implementations.
    Further Problems:
    (2) Control flow constructs introduced by ImperativeOCL are redundant compared with existing conventional OCL constructs.
    (3) Several OCL equivalence rules break when ImperativeOCL is present.
    Detailed problem description:
    (1) The current abstract syntax of ImperativeOCL introduces a couple of unclear situations. This may lead to incompatible QVT implementations.
    In the abstract syntax, ImperativeOCL expressions / statements are inherited from OclExpression. Therefore, conventional OCL expressions may (and will) contain sub-expressions that are actually ImperativeOCL expressions. In conventional OCL, the interpretation of an expression under a given environment is a value. In ImperativeOCL, the interpretation of an expression is a value and a new environment (state,variables). This extended interpretation is not given for conventional OCL expressions, leading to undefined operational semantics of those expressions.
    Example: Given the following compute expression:
    compute(z:Boolean) {
    var x : Boolean := true
    var y : Boolean := true
    if ((x:=false) and (y:=false))

    { ... }

    z := y
    }
    What is the value of this expression: is it true or false (It depends on whether the 'and' operator is evaluated short-circuit or strict). The situation is similar for the evaluation of the other logical connectives, forAll, and exists when these expressions contain imperative sub-expressions.

    (2) Control flow constructs introduced by ImperativeOCL are redundant compared with existing conventional OCL constructs.
    Some of the new language features in ImperativeOCL such as forEach and the imperative conditional are not really necessary. Their effect can already be achieved using conventional OCL expressions:
    For example:
    company.employees->forEach(c)

    { c.salary := c.salary * 1.1}

    has the same effect as
    company.employees->iterate(c; r:OclAny=Undefined |
    c.salary := c.salary * 1.1
    )
    and
    if ( x < 0 )

    { x := 0 }

    else

    { x := 1 }

    endif is the same as
    if x < 0 then x := 0 else x := 1 endif

    (3) Several OCL equivalence rules break when ImperativeOCL is present.
    In conventional OCL, several equivalence rules well known from logic hold. Allowing OCL expression to contain imperative sub-expressions breaks these equivalence rules.
    Examples:
    let x=e1 in e2 equiv. e2

    { all occurences of x replaced by e1 }

    e1 and e2 equiv. e2 and e1
    These equivalences do not necessarily hold if e1 or e2 are allowed to have side-effects.
    Proposed solution:
    (A) - (The cheap solution.) State textually that conventional OCL expressions (as described in the OMG OCL spec.) are not allowed to have side effects unless used as part of a top level ImperativeOCL expression. Therefore, even in a system supporting ImperativeOCL, class invariants, and pre- and postconditions (e.g.) will not be allowed to contain ImperativeOCL sub-expressions.
    State explicitly that the redundant flow control statements have been introduced (solely) to write concise imperative programs and that the side-effect free forms of conditional evaluation ( 'if-then-else-endif' and 'iterate' ) shall not be used to program side-effects (instead, the ImperativeOCL forms shall be used).
    (B) - (Major rework.) Rework the abstract syntax to reuse OCL expressions by composition rather than by inheritance.
    Imperative expressions ( => rename to 'statements' ) then may contain sub-statements and OCL expressions; OCL expressions are reused unchanged from the OCL spec (no imperative sub-expressions, no side-effects).
    These issues have been discussed on the MoDELS 2008 OCL Workshop, more details can be found at http://www.fots.ua.ac.be/events/ocl2008/PDF/OCL2008_9.pdf

    Discussion - 1 short circuit semantics

    It is possible to weasel out of this narrowly described problem by observing that OCL only supports short-circuit semantics once it is proven that no invalid lurks beyond the short-circuit. An extension to this could inhibit short-circuit semantics if any imperative expression is involved.

    Discussion - (2) redundant control flow

    The first suggestion is contradictory. The replacement for forEach is noticeably longer and uses a side effect within an iterate, which the author argues against elsewhere.

    The second suggestion incorrectly assumes that an else clause is present. The imperative if (SwitchExp) allows one-sided functionality including selective control flow adjustment.

    Discussion - (3) broken equivalence

    The example is unreadable, but the point is unarguable; imperative semantics within functional semantics subvert the functional.

    (A) - (The cheap solution.) is simple and adopted here.

    (B) - (Major rework.) is a breaking structural change and so forked off to http://solitaire.omg.org/browse/QVT13-87 for consideration by QVT 2.0.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTr: BlackBox operation signature difficulties

  • Key: QVT13-7
  • Legacy Issue Number: 13054
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • 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.

  • Reported: QVT 1.0 — Fri, 31 Oct 2008 04:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition 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.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTr: Undefined semantics

  • Key: QVT13-3
  • Legacy Issue Number: 10936
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The whole Concrete Syntax section deserves a much more substantial description.

    In particular...

    The mechanism by which a package name is located is unresolved, perhaps deliberately,
    but the omission should be explicit.

    What constraints exist on forward referencing of names?

    Transformations and mappings could be ordered so that forward references are avoided,
    but large modules benefit from an alphabetical ordering of elements, so requiring
    a parser friendly order is not user friendly.

  • Reported: QVT 1.0 — Sun, 25 Mar 2007 04:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    9.18 Undefined semantics

    The whole Concrete Syntax section deserves a much more substantial description.

    In particular...

    The mechanism by which a package name is located is unresolved, perhaps deliberately,
    but the omission should be explicit.

    What constraints exist on forward referencing of names?

    Transformations and mappings could be ordered so that forward references are avoided,
    but large modules benefit from an alphabetical ordering of elements, so requiring
    a parser friendly order is not user friendly.

    Discussion

    This isn't going to happen until a QVT 2.0 rewrite adopts the autogeneration approaches underway for OCL.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTr: Missing Name and Expression syntax

  • Key: QVT13-1
  • Legacy Issue Number: 10934
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    9.18 Undefined syntax
    ---------------------

    The syntax for TransformationName, DirectionName, MappingName, PropertyName and VariableName
    is undefined. Presumably each of these is an Identifier (below) when defining, but a PathNameCS
    when referencing.

    The syntax for PackageName is undefined. Presumably it is an OCL PathNameCS.

    The syntax for ValueOCLExpr is undefined. This is presumably an OclExpressionCS.

    The syntax for BooleanOCLExpr is undefined. This could be an OclExpressionCS of Boolean type but ...

    The syntax for SlotOwnerOCLExpr is undefined. This could be an OclExpressionCS of Class type but ...

    If BooleanOCLExpr and SlotOwnerOCLExpr are parsed as OclExpressionCS the 'default' prefix
    causes a major ambiguity for 'default(...).xx' as a parenthesised slot owner or function call.
    It is necessary to make 'default' a reserved word within OCL expressions.

    Suggest: define BooleanOCLExpr and SlotOwnerOCLExpr very narrowly.

    Predicate ::= SimpleNameCS ("." SimpleNameCS)* "=" OclExpressionCS
    Assignment ::= ["default"] SimpleNameCS ("." SimpleNameCS)* ":=" OclExpressionCS

  • Reported: QVT 1.0 — Sun, 25 Mar 2007 04:00 GMT
  • Disposition: Duplicate or Merged — QVT 1.3
  • Disposition Summary:

    Undefined syntax

    9.18 Undefined syntax
    ---------------------

    The syntax for TransformationName, DirectionName, MappingName, PropertyName and VariableName
    is undefined. Presumably each of these is an Identifier (below) when defining, but a PathNameCS
    when referencing.

    The syntax for PackageName is undefined. Presumably it is an OCL PathNameCS.

    The syntax for ValueOCLExpr is undefined. This is presumably an OclExpressionCS.

    The syntax for BooleanOCLExpr is undefined. This could be an OclExpressionCS of Boolean type but ...

    The syntax for SlotOwnerOCLExpr is undefined. This could be an OclExpressionCS of Class type but ...

    If BooleanOCLExpr and SlotOwnerOCLExpr are parsed as OclExpressionCS the 'default' prefix
    causes a major ambiguity for 'default(...).xx' as a parenthesised slot owner or function call.
    It is necessary to make 'default' a reserved word within OCL expressions.

    Suggest: define BooleanOCLExpr and SlotOwnerOCLExpr very narrowly.

    Predicate ::= SimpleNameCS ("." SimpleNameCS)* "=" OclExpressionCS
    Assignment ::= ["default"] SimpleNameCS ("." SimpleNameCS)* ":=" OclExpressionCS

    Discussion

    Merged with the inadequate definition of identifiers.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTc/QVTr: Pattern.bindsTo composition

  • Key: QVT13-45
  • Legacy Issue Number: 19673
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The author of Issue 9379 misunderstood the poor description of Pattern::bindsTo and consequently removed the

    {composes} qualifier.

    Issue 10938 observed that this totally broke QVTc and introduced CorePattern::variables to compensate.

    The QVTr to QVTc transformation remains broken since it continues to assume that bindsTo {composes}

    .

    There was actually nothing wrong with bindsTo that could not have been fixed by clearer wording to the effect that bindsTo was a dustbin container for variables not contained elsewhere.

    The above kind of emphasises the benefits of an ownedPlurals naming policy. Therefore suggest that:

    a) the AST bloat from the redundant bindsTo be replaced by definition of a suitable derived property that satisfies the intent of all variables.

    b) that variables be renamed ownedVariables and used throughout the QVTr to QVTc transformation

  • Reported: QVT 1.2 — Tue, 9 Dec 2014 05:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    Rewind Issues 9379, 10938

    The author of Issue 9379 misunderstood the poor description of Pattern::bindsTo and consequently removed the

    {composes} qualifier.

    Issue 10938 observed that this totally broke QVTc and introduced CorePattern::variables to compensate.

    The QVTr to QVTc transformation remains broken since it continues to assume that bindsTo {composes}

    .

    There was actually nothing wrong with bindsTo that could not have been fixed by clearer wording to the effect that bindsTo was a dustbin container for variables not contained elsewhere.

    The above kind of emphasises the benefits of an ownedPlurals naming policy. Therefore suggest that:

    a) the AST bloat from the redundant bindsTo be replaced by definition of a suitable derived property that satisfies the intent of all variables.

    b) that variables be renamed ownedVariables and used throughout the QVTr to QVTc transformation

    Discussion

    The problem is genuine, but further Eclipse QVTr prototyping reveals two distinct cases, one requiring containment, another not. Further work is needed to specify these accurately.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

Inconsistent multiple inheritance

  • Key: QVT13-32
  • Legacy Issue Number: 18912
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The pragmatic decision to define Module/Transformation as inheriting both Package and Class violates UML inheritance.

    For a Package: self.nestingPackage.nestedPackages->includes(self)

    For a Class:
    self.package.ownedTypes->includes(self)

    But self cannot have two containers.

    The problem is easily resolved by extending only Package and adding those Class features that are actually required.

  • Reported: QVT 1.1 — Mon, 16 Sep 2013 04:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    Inconsistent multiple inheritance

    The pragmatic decision to define Module/Transformation as inheriting both Package and Class violates UML inheritance.

    For a Package: self.nestingPackage.nestedPackages->includes(self)

    For a Class:
    self.package.ownedTypes->includes(self)

    But self cannot have two containers.

    The problem is easily resolved by extending only Package and adding those Class features that are actually required.

    Discussion

    Transformation is mostly a Class that may have arbitrary Package scoping. This has been successfully prototyped by the Eclipse QVT projects, but not in sufficient detail to justify this slightly breaking change.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTr: working with stereotypes:

  • Key: QVT13-31
  • Legacy Issue Number: 13158
  • Status: closed  
  • Source: Siegfried Nolte ( Siegfried Nolte)
  • Summary:

    QVT Relations and working with stereotypes: Is there something like a QVT-R standard library with methods on stereotypes in it? There is none in the specification; compare QVT-R, there are some methods. Are there some else options for accessing stereotypes with QVT-R?

  • Reported: QVT 1.0 — Mon, 15 Dec 2008 05:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    QVT Relations and working with stereotypes:

    QVT Relations and working with stereotypes: Is there something like a QVT-R standard library with methods on stereotypes in it? There is none in the specification; compare QVT-R, there are some methods. Are there some else options for accessing stereotypes with QVT-R?

    Discussion

    Good question. Recent progress on ensuring that typesafe OCL navigation works for stereotypes may render the answer trivial, but until such time as a stereotyped QVTr transformation has been executed it is too soon to respond.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Standard Library mode and namespace

  • Key: QVT13-52
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The QVTo Standard Library has no model and consequently no namespace.

    This encourages a major confusion:

    The QVToLib::Model and QVToLib::Transformation types used in the QVTo Standard Library are at a different meta-level to UML::Model and QVTbase::Transformation. We have the uncomfortable situation that a QVToLib::Model is an instance of a QVTbase::TypedModel and a QVToLib::Transformation is an instance of a QVTbase::Transformation.

    As a minimum the distinct namespaces should be identified and modeled.

    Possibly QVToLib::Model and QVToLib::Transformation should be renamed. Since they have no namespace they are currently unuseable in code; their sole purpose is for specification of implementation behavior.

  • Reported: QVT 1.2 — Thu, 30 Apr 2015 08:21 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    QVTo Standard Library mode and namespace

    The QVTo Standard Library has no model and consequently no namespace.

    This encourages a major confusion:

    The QVToLib::Model and QVToLib::Transformation types used in the QVTo Standard Library are at a different meta-level to UML::Model and QVTbase::Transformation. We have the uncomfortable situation that a QVToLib::Model is an instance of a QVTbase::TypedModel and a QVToLib::Transformation is an instance of a QVTbase::Transformation.

    As a minimum the distinct namespaces should be identified and modeled.

    Possibly QVToLib::Model and QVToLib::Transformation should be renamed. Since they have no namespace they are currently unuseable in code; their sole purpose is for specification of implementation behavior.

    Discussion

    It is difficult to make sensible progress until the OCL work in progress modeling libraries provides the solution.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Inadequate definition of "late" semantics

  • Key: QVT13-27
  • Legacy Issue Number: 19429
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The specification of "late" semantics uses the "conceptually" word; a sure sign of missing semantics. It is followed by a magic null value that stores information for later use and with an unspecified trace interaction.

    The interaction of "late" and implicit collect is not handled so in

    generalizations := self.eSuperTypes->collect(t | t.late resolve(UML::Generalization))

    the direct association of "late" with asssignment is no longer direct; the "late"s must be aggregated. Potentuially this may occur in arbitrary complexd expressions including mapping calls!

    An alternate multi-pass interpretation of "late" is given.

    This seems like the correct approach; an MtoM transformation from a with-late to multi-pass without-late transformation.

  • Reported: QVT 1.2 — Thu, 22 May 2014 04:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    Inadequate definition of "late" semantics

    The specification of "late" semantics uses the "conceptually" word; a sure sign of missing semantics. It is followed by a magic null value that stores information for later use and with an unspecified trace interaction.

    The interaction of "late" and implicit collect is not handled so in

    generalizations := self.eSuperTypes->collect(t | t.late resolve(UML::Generalization))

    the direct association of "late" with asssignment is no longer direct; the "late"s must be aggregated. Potentially this may occur in arbitrary complex expressions including mapping calls!

    An alternate multi-pass interpretation of "late" is given.

    This seems like the correct approach; an MtoM transformation from a with-late to multi-pass without-late transformation.

    Discussion

    Yes, but such an MtoM is non-trivial. Needs development and testing before it can be included as part of the specification.

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: Enhance ObjectExp to allow constructors invocation

  • Key: QVT13-25
  • Legacy Issue Number: 19023
  • Status: closed  
  • Source: Open Canarias, SL ( Adolfo Sanchez-Barbudo Herrera [X] (Inactive))
  • Summary:

    Problem:

    ObjectExp seems to be an enhancement to the InstantationExp due to the additional semantics, however it gets limited due to the fact that every time we need to use it we have to define the constructor body (in constrast to the instantiation expression usage). Although, ObjectExp was conceived to inline object instantiations, this limitation is not justified.

    However, this limitation could be removed by also allowing an ObjectExp-Constructor combination, in the same way we have for InstantiationExp. The problem relies on a flaky concrete syntax which we could enhance to exploit an ObjectExp with an already defined constructor operation:

    constructor Column::ColumnConstructor (n:String,t: String)

    { name:=n; type:=t; }

    object result1 : Column (“name”, “String”);
    object result2 : Column (“age”, “Integer”);

    Providing a constructor body (from ObjectExp) and a list of arguments (from InstantiationExp) should be prohibited in both, the concrete syntax and the abstract syntax. Regarding the abstract syntax this could be expression with a constraint.

    context ObjectExp
    inv : argument->size() > 0 implies body.oclIsUndefined()

    Discussion:
    This enhancement seems convenient with no apparent drawbacks, since the old ObjectExp usage remains valid.

    Proposed solution:

    In section 8.2.1.24 add the following subsection:

    Constraints

    If an object expression contains a constructor body, no arguments for a constructor are allowed (and vice versa):

    context ObjectExp
    inv: argument->notEmpty() > 0 implies body.oclIsUndefined() and
    not body.oclIsUndefined() implies argument->isEmpty()

    In section 8.2.1.24 add the following to the the end notation subsection:

    Similarly to InstantiationExp, an object expression could be used to invoke a constructor operation, rather than inlining a constructor body:

    object result1 : Column (“name”, “String”);
    object result2 : Column (“age”, “Integer”);

    Note that this notation allows us to use object expression to instantiate (or update) objects, while having a reusable constructor in order to initialize (or update) the properties of the object subject to be created (or updated).

    In section 8.4.7:

    Replace:

    <object_exp> ::= 'object' ('(' <iter_declarator> ')')? <object_declarator>
    <expression_block>

    By:

    <object_exp> ::= 'object' ('(' <iter_declarator> ')')? <object_declarator>
    (<expression_block> | '(' (<declarator_list>)? ')' )

  • Reported: QVT 1.1 — Wed, 23 Oct 2013 04:00 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    Enhance ObjectExp to allow constructors invocation

    Problem:

    ObjectExp seems to be an enhancement to the InstantationExp due to the additional semantics, however it gets limited due to the fact that every time we need to use it we have to define the constructor body (in constrast to the instantiation expression usage). Although, ObjectExp was conceived to inline object instantiations, this limitation is not justified.

    However, this limitation could be removed by also allowing an ObjectExp-Constructor combination, in the same way we have for InstantiationExp. The problem relies on a flaky concrete syntax which we could enhance to exploit an ObjectExp with an already defined constructor operation:

    constructor Column::ColumnConstructor (n:String,t: String)

    { name:=n; type:=t; }

    object result1 : Column (“name”, “String”);
    object result2 : Column (“age”, “Integer”);

    Providing a constructor body (from ObjectExp) and a list of arguments (from InstantiationExp) should be prohibited in both, the concrete syntax and the abstract syntax. Regarding the abstract syntax this could be expression with a constraint.

    context ObjectExp
    inv : argument->size() > 0 implies body.oclIsUndefined()

    Discussion:
    This enhancement seems convenient with no apparent drawbacks, since the old ObjectExp usage remains valid.

    Proposed solution:

    In section 8.2.1.24 add the following subsection:

    Constraints

    If an object expression contains a constructor body, no arguments for a constructor are allowed (and vice versa):

    context ObjectExp
    inv: argument->notEmpty() > 0 implies body.oclIsUndefined() and
    not body.oclIsUndefined() implies argument->isEmpty()

    In section 8.2.1.24 add the following to the the end notation subsection:

    Similarly to InstantiationExp, an object expression could be used to invoke a constructor operation, rather than inlining a constructor body:

    object result1 : Column (“name”, “String”);
    object result2 : Column (“age”, “Integer”);

    Note that this notation allows us to use object expression to instantiate (or update) objects, while having a reusable constructor in order to initialize (or update) the properties of the object subject to be created (or updated).

    In section 8.4.7:

    Replace:

    <object_exp> ::= 'object' ('(' <iter_declarator> ')')? <object_declarator>
    <expression_block>

    By:

    <object_exp> ::= 'object' ('(' <iter_declarator> ')')? <object_declarator>
    (<expression_block> | '(' (<declarator_list>)? ')' )

    Discussion

    This was extensively discussed on the Eclipse qvto-dev mailing list.

    The conclusion was that the inheritance of ObjectExp from InstantiationExp is pragmatic and causes more problems that it solves. It should be eliminated.

    Allowing objects to be constructed by a constructor expression rather field assignment is a nice syntax enhancement for significant utility classes.

    It is hoped that a resolution will be prototyped by:

    https://bugs.eclipse.org/bugs/show_bug.cgi?id=479657

  • Updated: Tue, 29 Mar 2016 15:09 GMT

QVTo: How can an UnlinkExp.target be a Property

  • Key: QVT13-134
  • Status: closed  
  • Source: Model Driven Solutions ( Ed Willink)
  • Summary:

    The description of UnlinkExp.target specifies an OclExpression but describes a Property.

    Is this an error? Is it introducing a new PropertyLiteralExp?

  • Reported: QVT 1.2 — Wed, 21 Oct 2015 16:48 GMT
  • Disposition: Deferred — QVT 1.3
  • Disposition Summary:

    This Issue was not resolved in this Task Force and was automatically deferred to the next Task Force

  • Updated: Tue, 22 Dec 2015 15:31 GMT