Skip to content

Operations: Application Layer

taranpe edited this page Apr 27, 2013 · 7 revisions

Atomic Operations

AddStandardClass

addStandardClass(_name : String, _isAbstract : Boolean, _inheritanceType : InheritanceType)

Popis: Vytvoření třídy typu StandardClass (standardní třída jakou známe z JAVA). InheritanceType představuje typ mapování třídy v databázi (Single Table, Joined, Table Per Class)

AddPrimitiveClass

addPrimitiveClass(_name : String, _primitiveType : PrimitiveType)

Popis Vytvoření primitivní třídy. Tedy třídy zastupující primitivní typ (int, char, atd.). Třída může mít libovolný název ale stále zastupuje pouze daný primitivní typ (Integer -> int, Popokatepetl -> char).

AddEmbeddedClass

addEmbeddedClass(_name : String)

Popis: Vytvoření embedované třídy. Nezaměňovat za Nested Class z jazyka JAVA (tedy vnitřní třídu). U nás se jedná spíše o jakou si výčtovou třídu, kterou využíváme v jiných třídách (v databázi jsou pak její sloupce vloženy do tabulky, která jí využívá - nemá své databázové zastoupení).

RenameEntity

renameEntity(_name : String, _newName : String)

Popis: Entita je v našem meta-modelu předkem všech typů tříd (StandardClass, EmbeddedClass, PrimitiveClass). Tato operace je dovoluje přejmenovat.

RemoveEntity

removeEntity(_name : String)

Popis: Smazání entity z modelu.

AddProperty

addProperty(_owningClassName : String, _name : String, _type : String, defaultValue : String, lowerBound : Integer, upperBound : Integer, isOrdered : Boolean, isUnique : Boolean)

Popis: Vytvoření atributu (property) v zadané třídě. Atribut může být i kolekcí - lowerBound nastavuje minimální hodnotu, upperBound maximální. Je-li upperBound -1, jedná se o nekonečno. Seřazení kolekce nastavíme parametrem isOrdered (v databázi to pro nás znamená vytvoření speciálního sloupečku s pořadím). Unikátnost prvků v kolekci parametrem isUnique.

RenameProperty

renameProperty(_owningClassName : String, _name : String, _newName : String)

Popis: Přejmenování atributu ve třídě.

RemoveProperty

removeProperty(_owningClassName : String, _name : String)

Popis: Smazání atributu ze třídy.

SetOpposite

setOpposite(_firstClassName : String, _firstPropertyName : String, _secondClassName : String, _secondPropertyName : String, _isOpposite : Boolean)

Popis: Operace vytvoří spojení mezi dvěma atributy. Spojením v našem případě máme namysli opositum. Atribut v první třídě má jako oppositeProperty nastaven atribut ve třídě druhé. A obráceně. Parametr isOpposite slouží k tomu, že zapojuje, nebo následně rozpojuje dané spojení. Pokud spojení existuje a mi ho chceme zrušit, zadáme oba atributy a isOpposite nastavíme na FALSE. V opačném případě obráceně.

SetAbstract

setAbstract(_name : String, _isAbstract : Boolean)

Popis: Nastaví třídu jako abstraktní. V případě, že již abstraktní je, můžeme abstrakci zrušit parametrem isAbstract nastaveným na FALSE.

SetParent

setParent(_name : String, _parentName : String)

Popis: Nastavení předka dané třídě.

SetType

setType(_owningClassName : String, _name : String, _type : String)

Popis: Změna typu atributu. Atribut může být typu PrimitiveClass nebo StandardClass (tyto dva typy tříd v našem metamodelu zastřešuje entita AbstractClass, která je jich předky).

SetBounds

setBounds(_owningClassName : String, _name : String, _lowerBound : Integer, _upperBound : Integer)

Popis: Změna velikosti kolekce.

SetOrdered

setOrdered(_owningClassName : String, _name : String, _isOrdered : Boolean)

Popis: Aktivování nebo deaktivování kolekce jako seřazené.

SetUnique

setUnique(_owningClassName : String, _name : String, _isUnique : Boolean)

Popis: Nastavení nebo deaktivování kolekce jako unikátní

CopyProperty

copyProperty(owningClassName : String, _name : String, _targetClassName : String, _type : APP::ops::MergeType)

Popis: Kopírování atributu funguje pouze v rámci hierarchie - směrem dolu i směrem nahoru. Důvod omezení přesunu pouze v rámci hierarchie je zakořeněný až u skutečných datových instancí(záznamů) v databázi. Problémem je přiřazení. Představme si, že v databázi chceme kopírovat sloupeček plný dat z jedné tabulky do druhé, přičemž tabulky mezi sebou nemají žádnou vazbu, ani hierarchickou. Jakým způsobem by jsme nadefinovali přiřazovací pravidlo pro jednotlivé řádky (instance) tabulke? Ne vždy je totiž správné řešení typu - první řádek z tabulky A přiřadit k prvnímu z tabulky B. Je to tedy docela oříšek. Samozřejmě není neřešitelný, ale my, v rámci zjednodušení, pracujeme pouze v hierarchii, kde máme všechny instance provázané společným ID od kořenové tabulky.

MergeType je parametr, který má svůj původ také v samotných instancích. Pokud nastane, že při přesunu z tabulky A do tabulky B, bude mít A více či méně instancí než B, musíme programu říci, jak se má zachovat - k tomu nám slouží MergeType.

MergeType má tři stavy - strict, force, tolerant. Strict - pokud má tabulka jiný počet instancí, neprováděj přenos. Force - pokud má tabulka jiný počet instancí, klidně proveď přenos - přebytečná data se oříznou. Tolerant - pokud má tabulka nižší počet instancí, klidně proveď přenos (Tolerant je slabší odvar Strict omezení).

MoveProperty

moveProperty(_owningClassName : String, _name : String, _targetClassName : String, _type : APP::ops::MergeType)

Popis: Myšlenka MovePropety se zdá být stejná jako u operace CopyProperty. Zase jde o přesun atributu v rámci hierarchie. Zde je ale rozdíl v tom, že MoveProperty uplně přesune atribut jinam, kdežto CopyProperty pouze zduplikovala atribut

ExtractClass

extractClass(_sourceClassName : String, _associationPropertyName : String, _extractClassName : String)

Restrictions:

  • @restriction : Class with @sourceClassName must exist in model
  • @restriction : Class with @extractClassName cannot exist in model
  • @restriction : Class name @extractClassName must be valid
  • @restriction : Property name @associationPropertyName cannot exists in class @sourceClassName

Description: The meaning of ExtractClass operation is to create a new class with name extractClassName and connect this new empty class with sourceClassName by unidirectional association with cardinality 1:1 (that means create pointer with associationPropertyName in sourceClassName).

extractClass2

ORM mapping: The main idea of ORM mapping is that operation ExtractClass create "empty" instances in extracted class. Empty means, that they are represent (in database) just by number in ID column of extracted class. So operation ExtractClass create new class and in the database create new instances which belong to new extracted class.

  // addition of the extracted table to the schema
  addTable(schemaName, extractClassName);
  // addition of a column to extracted table
  addColumn(schemaName, extractClassName, idColumnName, type);
  // addition of a primary key to extracted table
  addPrimaryKey(schemaName, extractClassName, idColumnName, pkName);
  // generate new sequence number to id column of extract class
  generateSequenceNumbers(schemaName, extractClassName, idColumnName, sequenceName);
  // addition of a new column (pointer to extracted class) to source class
  addColumn(schemaName, sourceClassName, associationPropertyName, type);
  // add FK contraint on new pointer column
  addForeignKey(schemaName, sourceClassName, associationPropertyName, fkName, extractClassName);
  // add values to FK
  insertRow(schemaName, extractClassName, idExtractClassName, sourceClassName, associationPropertyName);

Dekompoziční operace

ExtractParent

extractParent(_sourceClassName : String, _extractPropertiesNames : OrderedSet(String), _extractParentName : String)

Popis:

Clone this wiki locally