• Nenhum resultado encontrado

C APÍTULO 4 ViXQueL

4.4 A geração do código XQuery

4.4

A geração do código XQuery

Através da criação da linguagem de modelagem específica de domínio ViXQueL, é possível alcançar um aumento significativo no nível de abstração que é necessário para a criação de consultas a serem realizadas em um SGBD XML nativo. Tal linguagem permite o uso de conceitos e regras que são parte do problema específico que está sendo endereçado. Através da formalização deste modelo em um metamodelo, é possível implementar transformações que levam a modelos mais específicos, semelhantemente a um modelo de consulta XQuery que, após novas transformações, tornam-se uma consulta em código XQuery.

A geração do código XQuery é baseada nos conceitos do MDA e usa as tecnologias MOF da OMG no Eclipse Modeling Framework (EMF) [Fou08b]. O EMF é um framework de mo- delagem e geração de código do Eclipse [Fou08a] para construção de ferramentas e aplicações baseadas em modelos de dados estruturados. Este implementa um subconjunto do núcleo pa- drão do MOF que é suficiente para trabalhar com metamodelagem [Fou08b].

Este subconjunto do MOF no EMF é chamado de Ecore e especifica os metamodelos usados pela ViXQueL para a geração de consultas XQuery. Dois metamodelos são usados para realizar esta tarefa. Um deles é o metamodelo ViXQueL, o qual define o conjunto de elementos e estruturas que podem ser usados para a criação de consultas. O outro é o metamodelo que representa as construções da linguagem XQuery que são usadas pela ViXQueL para a criação de consultas. Este último metamodelo é representativo o bastante para permitir a geração do código XQuery em formato de texto, que por sua vez permite a realização da consulta em um SGBD XML nativo.

4.4.1 Metamodelos

O metamodelo da ViXQueL, que tem seu diagrama apresentado na Figura 4.6, tem como ele- mento principal a entidade ViXQueL, que representa uma consulta e, através do seu atributo

4.4 A GERAÇÃO DO CÓDIGO XQUERY 47

database, especifica a base de dados à qual esta consulta deve ser aplicada. A entidade ViX- QueL contém ainda um elemento rootNode, que representa o nó principal do documento XML e é uma instância da entidade DatabaseNode.

Uma entidade DatabaseNode contém zero ou mais elementos childNodes que são instân- cias da entidade Database, que, por sua vez, podem ser instâncias das entidades DatabaseNode ou DatabaseAttribute. A entidade Database representa os elementos de XML que estão sendo utilizados na consulta e contém três atributos que determinam seu papel na consulta, são estes: um nome, um indicador que informa se é um elemento que deve ser retornado pela consulta, e ainda um indicador de como a ordenação deve ser feita. As entidades especializadas Databa- seNodee DatabaseAttribute representam, respectivamente, um elemento e um atributo XML.

A ordenação dos elementos e/ou atributos é definida utilizando a enumeração OrderModi- fier. Os valores que representam a ordenação são ascending e descending.

Uma entidade Database contém zero ou mais elementos constraints que são instâncias da entidade ExpressionVix, que, por sua vez, podem ser instâncias das entidades Equals, Different, LessThan, GreaterThan, LessThanOrEqual, e GreaterThanOrEqual. Os elementos constraints são utilizados para adicionar restrições às consultas.

A entidade ExpressionVix é utilizada como operador nas comparações entre instâncias da entidade Node. As entidades ValueNode e Database, que são especializações da entidade Node, representam, respectivamente, um valor concreto definido pelo usuário e um elemento ou atri- buto XML. A entidade ValueNode representa seu valor através do atributo val. A Figura 4.7 apresenta um exemplo de um modelo em conformidade com o metamodelo da ViXQueL.

4.4 A GERAÇÃO DO CÓDIGO XQUERY 48

Figura 4.6: Diagrama de estrutura do metamodelo ViXQueL

<xmi:XMI x m i : v e r s i o n = " 2 " x m l n s : x m i = " h t t p : / / www. omg . o r g / XMI" x m l n s : x s i = " h t t p : / / www. w3 . o r g / 2 0 0 1 / XMLSchema−i n s t a n c e " xmlns:ViXQueL = " p l a t f o r m : / r e s o u r c e / m e t a m o d e l s / ViXQueL . e c o r e " > <ViXQueL:ViXQueL d a t a b a s e = " b i b l i o t e c a " > < r o o t N o d e name= " b i b l i o t e c a " > < c h i l d N o d e s h r e f = " # / 4 " / > < / r o o t N o d e > < / ViXQueL:ViXQueL> < V i X Q u e L : D a t a b a s e N o d e name= " n a c i o n a l i d a d e " t y p e = " s t r i n g " r e t u r n e d = " t r u e " / > < V i X Q u e L : D a t a b a s e N o d e name= " nome " t y p e = " s t r i n g " r e t u r n e d = " t r u e " o r d e r = " a s c e n d i n g " / > < V i X Q u e L : D a t a b a s e N o d e name= " a u t o r " > < c h i l d N o d e s h r e f = " # / 2 " / > < c h i l d N o d e s h r e f = " # / 1 " / > < / V i X Q u e L : D a t a b a s e N o d e > < V i X Q u e L : D a t a b a s e N o d e name= " l i v r o " > < c h i l d N o d e s h r e f = " # / 3 " / > < / V i X Q u e L : D a t a b a s e N o d e > < / xmi:XMI>

Figura 4.7: Exemplo de um modelo da ViXQueL

O metamodelo da linguagem XQuery, que tem seu diagrama apresentado na Figura 4.8, tem como elemento principal a entidade XQueryProgram que representa uma consulta. A enti-

4.4 A GERAÇÃO DO CÓDIGO XQUERY 49

dade XQueryProgram contém um elemento command que é uma instância da entidade FLWOR [W3C08h] (acrônimo para For, Let, Where, Order By, Return). Para representar a completa fun- cionalidade de um comando FLWOR, a entidade de mesmo nome contém as entidades Clause, Where, OrderBy e Return.

A entidade Clause permite representar as cláusulas For e Let da construção FLWOR da XQuery. Para tal, foram definidas três especializações para a entidade Clause, que são: For, Let e ClauseSequence. A entidade ClauseSequence contém os elementos clause1 e clause2, permitindo assim a definição de mais de uma cláusula (For ou Let). A entidade Clause contém ainda um elemento variable que é uma instância do elemento Declaration.

A entidade Declaration permite definir as variáveis e seus respectivos caminhos na consulta. Para tal, foram definidas duas especializações para a entidade que são: VariableDeclaration e DeclarationSequence. A entidade DeclarationSequence foi definida com o intuito de permitir a declaração de mais do que uma variável. Isto se torna possível através dos seus dois elementos, declaration1e declaration2, que são instâncias de Declaration.

A entidade VariableDeclaration é a entidade que de fato permite a declaração de uma va- riável na consulta e contém dois atributos para representá-la: o nome e o tipo. Esta entidade contém ainda um elemento in que é uma instância da entidade Expression e representa o cami- nho ou consulta FLWOR onde a variável será associada. Os tipos das variáveis são definidos utilizando a enumeração DataType. Os valores que representam os tipos das variáveis são: string, date e integer.

Continuando com a explicação sobre a entidade FLWOR, depois da entidade Clause, foi definida a entidade Where. Esta entidade contém um elemento expression que é uma instância da entidade Expression que é utilizado na representação das restrições da consulta. A entidade FLWOR contém um elemento where que é uma instância da entidade Where.

A entidade FLWOR contém também um elemento orderBy que é uma instância da entidade OrderBy. A entidade OrderBy representa a ordenação da consulta e contém um atributo order- Modifier para definir a forma de ordenação. A entidade OrderBy contém ainda um elemento

4.4 A GERAÇÃO DO CÓDIGO XQUERY 50

expque é uma instância da entidade Expression com o intuito de definir qual será o elemento que será ordenado. A ordenação dos elementos e/ou atributos é definida utilizando a enumera- ção OrderModifier. Os valores que representam a ordenação são ascending e descending.

A entidade FLWOR contém ainda um elemento return que é uma instância da entidade Returne representa o retorno da consulta. A entidade Return contém um elemento expression que é uma instância da entidade Expression com o intuito de definir quais serão os elementos retornados pela consulta.

Por fim, as entidades SequenceExp, BinaryExp, UnaryExp e FLWOR são especializações da entidade Expression. A entidade SequenceExp contém os elementos exp1 e exp2 e tem o intuito de permitir a declaração de uma sequência de expressões.

A entidade BinaryExp contém os elementos left e right e tem o intuito de permitir a declara- ção de operações binárias. A entidade BinaryExp é utilizada como operador entre elementos e pode assumir uma instância de qualquer uma de suas especializações, que são: EqualsExp, Dif- ferentExp, LessThanExp, LessThanOrEqualExp, GreaterThanExp, GreaterThanOrEqualExp, ou ainda, AndExp.

A última especialização da entidade Expression é a entidade UnaryExp. As entidades Va- lueExpe XPathExp são especializações da entidade UnaryExp e representam, respectivamente, um valor literal especificado pelo usuário e um caminho de um elemento. A entidade ValueExp contém dois atributos para representar um valor literal, são estes: val e type. Para representar um caminho, a entidade XPathExp se constitui de um elemento node que contém um atributo patharmazenando o caminho. A Figura 4.9 apresenta um exemplo de um modelo em confor- midade com o metamodelo da XQuery.

4.4 A GERAÇÃO DO CÓDIGO XQUERY 51

Documentos relacionados