--- title: ER 2 RE Metamodel ... ```{.clafer} //ER2RE is a metamodel describing a model transformation from an entity-relationship schema to a relational model. //Not including methods of classes and constraints related with method invocation. abstract BaseNamed name : string //Names have a non-zero length, and consist of letters, digits and the underscore. abstract BaseValue content : string dataType -> BaseDataType [parent in this.value] attrMap -> BaseAttrMap * [parent in this.value] [all self2:BaseValue|(self2!=this) => (this.content.ref != self2.content.ref || this.dataType.ref != self2.dataType.ref)] abstract BaseAttrMap attribute -> BaseAttribute [parent in this.attrMap] value -> BaseValue [parent in this.attrMap] instance -> ErSemInstance ? [parent in this.attrMap] erState -> ErSemErState * [parent in this.attrMap] link -> ErSemLink ? [parent in this.attrMap] relDBState -> RelSemRelDBState * [parent in this.attrMap] tuple -> RelSemTuple ? [parent in this.attrMap] [this.attribute.dataType = this.value.dataType] [all self2:BaseAttrMap|(self2 != this && this.instance && self2.instance) =>((this.attribute.ref = self2.attribute.ref && this.instance.ref = self2.instance.ref)=>(this.erState.ref != self2.erState.ref && this.value.ref != self2.value.ref))] [all self2:BaseAttrMap|(self2 != this && this.link && self2.link) =>((this.attribute.ref = self2.attribute.ref && this.link.ref = self2.link.ref)=>(this.erState.ref != self2.erState.ref && this.value.ref != self2.value.ref))] [all self2:BaseAttrMap|(self2 != this && this.tuple && self2.tuple) =>((this.attribute.ref = self2.attribute.ref && this.tuple.ref = self2.tuple.ref)=>(this.relDBState.ref != self2.relDBState.ref && this.value.ref != self2.value.ref))] [attribute.entity = instance.entity] [attribute.relship = link.relship] [attribute.relSchema = tuple.relSchema] [instance => (erState in instance.erState)] [link => (erState in link.erState)] [tuple => (relDBState in tuple.relDBState)] [#instance + #link + #tuple = 1] [relDBState xor erState] abstract BaseDataType : BaseNamed attribute -> BaseAttribute * [parent in this.dataType] value -> BaseValue * [parent in this.dataType] [all self2:BaseDataType|self2.name.ref = this.name.ref => self2 = this] abstract BaseAttribute : BaseNamed isKey ? dataType -> BaseDataType [parent in this.attribute] attrMap -> BaseAttrMap * [parent in this.attribute] entity -> ErSynEntity ? [parent in this.attribute] relship -> ErSynRelship ? [parent in this.attribute] relSchema -> RelSynRelSchema ? [parent in this.attribute] [#entity + #relship + #relSchema = 1] abstract ErSynRelend : BaseNamed relship -> ErSynRelship [parent in this.relend] entity -> ErSynEntity [parent in this.relend] relendMap -> ErSemRelendMap * [parent in this.relend] [this.entity.erSchema = this.relship.erSchema] //In this constraint, "ref" is not needed, since entity and relship have different types. abstract ErSynErSchema : BaseNamed entity -> ErSynEntity + [parent in this.erSchema] relship -> ErSynRelship * [parent in this.erSchema] erState -> ErSemErState * [parent in this.erSchema] trans -> Er2RelTrans ? [parent in this.erSchema] [all self2:ErSynErSchema|self2.name.ref = this.name.ref => self2 = this] [all disj e1;e2:entity|e1.name.ref != e2.name.ref] [all disj r1;r2:relship|r1.name.ref != r2.name.ref] [all e:entity|all r:relship| e.name.ref != r.name.ref] //In this constraint, "ref" is needed. But it's easy to be forgotten, since e and r have different types. abstract ErSynRelship : BaseNamed erSchema -> ErSynErSchema [parent in this.relship] relend -> ErSynRelend 2..* [parent in this.relship] attribute -> BaseAttribute * [parent in this.relship] link -> ErSemLink * [parent in this.relship] [all disj r1;r2:relend|r1.name.ref != r2.name.ref] [all disj a1;a2:attribute|a1.name.ref != a2.name.ref] [all r:relend|all a:attribute| r.name.ref != a.name.ref] [no a:attribute|a.isKey] abstract ErSynEntity : BaseNamed erSchema -> ErSynErSchema [parent in this.entity] attribute -> BaseAttribute * [parent in this.entity] relend -> ErSynRelend * [parent in this.entity] instance -> ErSemInstance * [parent in this.entity] [all disj a1;a2:attribute|a1.name.ref != a2.name.ref] abstract ErSemRelendMap relend -> ErSynRelend [parent in this.relendMap] link -> ErSemLink [parent in this.relendMap] erState -> ErSemErState + [parent in this.relendMap] instance -> ErSemInstance [parent in this.relendMap] [all self2:ErSemRelendMap|(this != self2) => ((this.relend.ref = self2.relend.ref && this.link.ref = self2.link.ref)=>(this.erState.ref != self2.erState.ref && this.instance.ref != self2.instance.ref))] [relend.entity = instance.entity] [relend.relship = link.relship] [erState in instance.erState] [erState in link.erState] [link.erState in instance.erState] abstract ErSemInstance attrMap -> BaseAttrMap * [parent in this.instance] relendMap -> ErSemRelendMap * [parent in this.instance] entity -> ErSynEntity [parent in this.instance] erState -> ErSemErState + [parent in this.instance] [entity.attribute = attrMap.attribute] [entity.erSchema = erState.erSchema] abstract ErSemLink erState -> ErSemErState + [parent in this.link] attrMap -> BaseAttrMap * [parent in this.link] relendMap -> ErSemRelendMap 2..* [parent in this.link] relship -> ErSynRelship [parent in this.link] [relship.attribute = attrMap.attribute] [relship.relend = relendMap.relend] [relship.erSchema = erState.erSchema] abstract ErSemErState attrMap -> BaseAttrMap * [parent in this.erState] link -> ErSemLink * [parent in this.erState] relendMap -> ErSemRelendMap * [parent in this.erState] instance -> ErSemInstance * [parent in this.erState] erSchema -> ErSynErSchema [parent in this.erState] trans -> Er2RelTrans ? [parent in this.erState] relDBState -> RelSemRelDBState ? [parent in this.erState] abstract RelSynRelDBSchema : BaseNamed relSchema -> RelSynRelSchema + [parent in this.relDBSchema] relDBState -> RelSemRelDBState * [parent in this.relDBSchema] trans -> Er2RelTrans ? [parent in this.relDBSchema] [all self2:RelSynRelDBSchema|self2.name.ref = this.name.ref => self2 = this] [all disj r1;r2:relSchema|r1.name.ref != r2.name.ref] abstract RelSynRelSchema : BaseNamed attribute -> BaseAttribute + [parent in this.relSchema] relDBSchema -> RelSynRelDBSchema [parent in this.relSchema] tuple -> RelSemTuple * [parent in this.relSchema] [all disj a1;a2:attribute|a1.name.ref != a2.name.ref] abstract RelSemRelDBState tuple -> RelSemTuple * [parent in this.relDBState] attrMap -> BaseAttrMap * [parent in this.relDBState] relDBSchema -> RelSynRelDBSchema [parent in this.relDBState] trans -> Er2RelTrans ? [parent in this.relDBState] erState -> ErSemErState ? [parent in this.relDBState] abstract RelSemTuple relDBState -> RelSemRelDBState + [parent in this.tuple] attrMap -> BaseAttrMap + [parent in this.tuple] relSchema -> RelSynRelSchema [parent in this.tuple] [relSchema.attribute = attrMap.attribute] [relSchema.relDBSchema = relDBState.relDBSchema] abstract Er2RelTrans erSchema -> ErSynErSchema [parent in this.trans] relDBSchema -> RelSynRelDBSchema [parent in this.trans] erState -> ErSemErState * [parent in this.trans] relDBState -> RelSemRelDBState * [parent in this.trans] [all e:erSchema.entity|one rl:relDBSchema.relSchema|((e.name.ref = rl.name.ref)&&(all ea:e.attribute|one ra:rl.attribute|(ea.name.ref = ra.name.ref && ea.dataType.ref = ra.dataType.ref && (ea.isKey <=> ra.isKey))))] [all erSt:erState|one relSt:relDBState|all i:erSt.instance|one t:relSt.tuple|all amEr:i.attrMap|one amRel:t.attrMap|amEr.attribute.name = amRel.attribute.name && amEr.value = amRel.value] [all erSt:erState|one relSt:relDBState|erSt.relDBState = relSt] [all relSt:relDBState|one erSt:erState|relSt.erState = erSt] [erState => (erState.erSchema = erSchema)] [relDBState => (relDBState.relDBSchema = relDBSchema)] ``` ```{.clafer .summary} ```