-- @path rl=/er2rl/metamodelB.ecore -- @path er=/er2rl/metamodelA.ecore module er2rl; create OUT : rl from IN : er; helper def: inverse1_qualifier(r:e!role) : er!qualifier = r.has_role.is_role->select(r | not r.navigable)->collect(e|e.is); helper def: inverse2_qualifier(r:er!role) : er!role = r.has_role.is_role->select(r | not r.navigable); helper def: inverse2_row(q:er!qualifier) : er!role = q.has.has_role.is_role->select(r | r.navigable)->first(); rule table1_er2rl { from p:er!data to t:rl!table( name <- p.container, has <- r ), r:rl!row( name <- p.name, table <- t, is_key <- thisModule.resolveTemp(p.attr_of,'k'), is_col <- thisModule.resolveTemp(p.attr_of,'c') ) } rule table2_er2rl { from p:er!role (p.navigable and p.max=-1) to t:rl!table( name <- p.name, has <- r ), r:rl!row( name <- p.name + p.is_data.name, table <- t, is_foreign <- Sequence{ thisModule.resolveTemp(Tuple{p1:er!qualifier=p.is, p2:er!role=p},'f1'), thisModule.resolveTemp(Tuple{p1:er!qualifier=thisModule.inverse1_qualifier(p), p2:er!role=thisModule.inverse2_qualifier(p)},'f2')} ) } rule key_er2rl { from p:er!attribute (p.key) to k:rl!key( name <- p.name, type <- p.type, has_key <- thisModule.resolveTemp(p.is,'r') ) } rule col_er2rl { from p:er!attribute (not p.key) to c:rl!col( name <- p.name, type <- p.type, has_col <- thisModule.resolveTemp(p.is,'r') ) } rule foreign1_er2rl { from p:er!qualifier, q:er!role (p.has=q and q.navigable) to f1:rl!foreign( name <- (q.name + q.is_data.name) + p.name, type <- p.type, has_foreign <- thisModule.resolveTemp(q,'r') ) } rule foreign2_er2rl { from p:er!qualifier, q:er!role (p.has=q and not q.navigable) to f2:rl!foreign( name <- (q.name + q.is_data.name) + p.name, type <- p.type, has_foreign <- thisModule.resolveTemp(thisModule.inverse2_row(p),'r') ) }