Bug 529130 - [qvtr2qvtc] Abandon QVTr2QVTc
Summary: [qvtr2qvtc] Abandon QVTr2QVTc
Status: NEW
Alias: None
Product: QVTd
Classification: Modeling
Component: Core (show other bugs)
Version: unspecified   Edit
Hardware: PC Windows 10
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Project Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 515236 515327 530773
  Show dependency tree
 
Reported: 2017-12-22 04:45 EST by Ed Willink CLA
Modified: 2018-02-06 06:25 EST (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ed Willink CLA 2017-12-22 04:45:30 EST
Bug 515327 identifies a need to partition a non-top overriding relation tree to involve:
three middle/trace hierarchies
-- invocation required
-- guard matches
-- execution status
two relation/mapping hierarchies
-- guard/predicate evaluation => match/mis-match
-- execution => success/fail

This is necessary to use the simple QVTc all mappings are 'top' with adequate guards to enforce sequencing. The basic QVTr2QVTc synthesis is painful. The non-trivial processing to split guard/execution is too painful.

----

In QVTs, the simple pattern a:B{b1=b; b2=b} requires two pattern nodes for "a" and "b", and two navigation edges for "b1" and "b2". In QVTr a PropertyTemplateItem for each "b1" and "b2" is similar to a QVTs edge, but the containments for ObjectTemplateExp+VariableExp+Variable for each node is the source of the pain (and CollectionTemplateExp's have no corresponding 'edges').

In QVTs a shared variable has a node that is shared by its use as the end of many edges.

In QVTr a shared variable has a distinct VariableExp and ObjectTemplateExp for each 'edge' end.

----

Choice:
- carry on with QVTr2QVTc pain
- introduce a graphical QVTrs (or QVTg) so that we do QVTr2QVTg2QVTs2QVTi...

Disadvantages
- non-trivial work to introduce a new QVTs-based model
- impossible to support an OMG QVTr2QVTc formulation

Advantages
- expression terms are expanded to nodes
- representation is normalized
- trace can be synthesized later
- no spurious guard/bottom intermediate contortions
- QVTc's no mapping calls no longer applies 

----

If we continue with QVTr2QVTc, the non-top overrides might be the 'last' problem, but more likely the failure to understand the complexities of expressions will bite. Contorting QVTr to QVTc semantics has cost a huge amount of time. It isn't going to get better. Time to change.

----

OMG QVTr2QVTc. A possible solution is to (re)define:
- QVTr2QVTg (? bidirectionally)
- QVTc2QVTg (bidirectionally)
- UMLX2QVTg (bidirectionally)
- QVTg2QVTs (? bidirectionally)
- QVTg2trace
but this requires that QVTg forms part of the QVT specification.

The above could be implemented as yet more Java cutting; copying large amounts of similar code. But perhaps the tooling has reached a level where we can attempt QVTr2QVTg and QVTr2trace in QVTr subject to some severe idiomatic constraints:
- e.g. overrides must be a family of non-failing leaf overrides of a never-invoked abstract 'interface'.
- OCL expressions may exploit a 'blackbox'
Comment 1 Ed Willink CLA 2018-01-20 10:00:52 EST
(In reply to Ed Willink from comment #0)
> - introduce a graphical QVTrs (or QVTg) so that we do QVTr2QVTg2QVTs2QVTi...

What does QVTrs/QVTg offer? Surely we can jump revamp QVTm2QVTs as QVTr2QVTs. Once the ensuing QVTs2QVTs2QVTs2QVTs chain clarifies, an early QVTs might be richer than a later QVTs. That might then justify a QVTg.