4.3 Abordagem CORE
4.3.1 Cláusulas SQL Alteradas pelas Diretivas
Quando realizamos a definição de uma abordagem de reescrita de consultas relacionais usando as definições da arquitetura Texere, notamos a necessidade de definir quais as cláusulas de uma consulta SQL que serão alteradas por cada tipo de diretiva definida pela arquitetura de referência.
É possível perceber na definição realizada neste trabalho que uma diretiva no Texere pode realizar alterações em mais de uma cláusula de uma consulta. Isso ocorre porque a CORE trata apenas o modelo relacional, mas o Texere se propõe a abranger outros modelos. Por exemplo, quando se tem uma diretiva do tipo Entidade, esta alterará as entidades de uma consulta; no caso do modelo relacional, alterará a cláusula From e, consequentemente, poderão existir alterações na cláusula Where, as quais realizarão as junções entre tabelas.
Para a abordagem CORE, as cláusulas SQL seguem o padrão ANSI [ANSI; 2014] do SQL 92. Com base neste padrão, uma adaptação foi realizada a partir da inclusão dos operadores de reescrita definidos neste trabalho.
Na CORE, a diretiva é traduzida para alterar uma cláusula SQL padrão e, posteriormente, é usada para modificar a consulta original. A Tabela 7 apresenta as diretivas que podem ser retornadas pelo Texere e a formalização das cláusulas SQL definidas neste trabalho para adaptação das diretivas.
Tabela 7 - Diretivas Texere e Cláusulas CORE.
Tipo de Diretiva Cláusula
Atributo <select clause>::= SELECT <lista de atributos[operadores de reescrita]> <where clause>::= WHERE <condição de consulta[operador de reescrita]> Entidade <from clause>::= FROM <lista de tabelas>
Agrupamento <group by clause>::= GROUP BY <lista de atributos de agrupamento> Ordenação <order clause>::= Order by <lista de atributos>
As cláusulas definidas para cada diretiva apresentam operações próprias para uma consulta SQL. As operações de expansão, relaxamento e formatação não são aplicadas a todas as cláusulas de uma consulta. Assim, cada cláusula pode contemplar as três operações ou apenas uma delas. Cada possibilidade é apresentada a seguir.
Select clause
A <select clause> realiza alterações sobre os valores presentes na cláusula SELECT da consulta original. Assim, uma <select clause> pode conter uma operação de expansão (Exp), de relaxamento (Rel) ou formatação (F) que atuará sobre uma consulta Q, gerando uma consulta reescrita Q’. A expansão pode ocorrer com a inclusão de uma nova coluna; a formatação pode ser obtida quando a resposta de uma coluna sofre uma alteração de exibição e o relaxamento pode ser executado, quando se solicita a retirada de uma coluna da cláusula. Por exemplo, para a consulta Q:
SELECT titulo, conteudo, subTitulo FROM livro
submetida em uma aplicação, e as diretivas D2 = “remove conteudo” de relaxamento e D3 = “include estoque” de expansão do tipo <select clause>, temos:
I. A diretiva D2 solicita a remoção da coluna conteúdo da consulta original, pois verificou-se que, para o contexto do usuário atual, não foi permitido que ele visualize o conteúdo do livro.
II. A mesma consulta Q sofre uma operação de expansão. A diretiva D3 solicita a inclusão de coluna estoque, que não estava presente na cláusula SELECT da consulta original. Assim, a nova consulta será Q = SELECT titulo, subTitulo, estoque FROM livro.
Para essa cláusula, é possível também realizar operações de formatação de dados. Assim, uma consulta Q, alterada por uma diretiva D originará uma nova consulta Q’. Essas operações de formatação buscam apresentar os dados de uma maneira que facilite a visualização ou exibição dos dados considerados mais relevantes logo nas primeiras respostas. Por exemplo, tomemos a situação de uma consulta Q:
SELECT titulo, revisão, subTitulo FROM Livro
e uma diretiva D2 = “revisão trunk 200” do tipo <select clause>, temos:
A operação de reescrita faz uso do operador trunk. A diretiva D2 solicita a exibição de apenas 200 caracteres do atributo revisão, sendo assim, o campo
revisão será substituído na cláusula SELECT por substring(revisão, 1, 200) AS revisão.
From clause
A cláusula <from clause> realiza alterações sobre o FROM de uma consulta SQL. Ela possibilita a expansão, com a inclusão de entidades na consulta original. Mas também é possível remover alguma entidade através de uma operação de relaxamento. Por exemplo, a CORE recebe uma consulta Q2:
SELECT titulo, revisão, subTitulo, autor FROM livro, autores
após o processamento das regras foi gerada uma diretiva de expansão D2 = “incluir entidade categoria” na <from clause>, temos, então:
Em D2 é solicitada a inclusão da entidade “categoria” na consulta original Q2. Após a rescrita de Q2, a nova consulta expandida será Q2’:
SELECT titulo, revisão, subTitulo, autor FROM livro, autores, categoria
WHERE autores.id = livro.autor.
Where clause
A <where clause> realiza alterações sobre o WHERE de uma consulta SQL. Assim, uma consulta Q pode ser reescrita sofrendo alterações sobre suas restrições por meio de uma diretiva D, onde esta diretiva pode ser composta por um operador OP.
A cláusula permite o uso de operadores como, por exemplo, like, IN em sua composição e executa operações de expansão ou relaxamento, ou seja, permitem incluir, remover ou suavizar restrições em uma consulta original. Por exemplo, considere uma consulta Q3:
SELECT titulo, revisão, subTitulo, autor FROM livro
WHERE quantidade = 10 e uma diretiva D1 = “quantidade <= 10”, assim temos:
A diretiva D1 suaviza a restrição (quantidade = 10) da consulta Q3. A CORE retira a restrição (quantidade = 10) da consulta original e substitui pela restrição informada na diretiva D1 = “quantidade <= 10”. Dessa forma, mais respostas relevantes podem ser retornadas ao usuário. A consulta reescrita Q’ passa a ser:
SELECT titulo, revisão, subTitulo, autor FROM livro
WHERE quantidade <= 10.
Uma diretiva que altera a <where clause> pode ainda requisitar uma expansão não originada explicitamente a partir de uma diretiva. Por exemplo, uma diretiva D2 de expansão solicita a inclusão de uma restrição D2 = “autores in (‘Carlos Drummond de Andrade’, ‘Camões’)” na consulta Q3 executada pelo usuário. Nesse caso, quando se encontra uma diretiva que solicita a inclusão de uma restrição na cláusula WHERE e essa restrição usa um atributo de uma entidade ainda não incluída na consulta original, gera-se uma expansão na cláusula FROM automaticamente.
A expansão pode correr ainda, quando uma diretiva de expansão D3 = “incluir nome.autor”, solicita a inclusão de um novo atributo na projeção da consulta Q: SELECT titulo, revisão, subTitulo FROM livro. Essa diretiva, por conseguinte, também exige a inclusão da entidade autor na cláusula FROM, bem como a inserção das restrições de junção na cláusula WHERE. Essas inclusões derivadas são identificadas e incluídas automaticamente pela CORE, sem que seja necessário o recebimento de uma diretiva solicitando essa inserção explicitamente.
Order clause
A cláusula <order clause> realiza alterações sobre o ORDER BY. Nesse tipo de cláusula são permitidas operações de formatação. Para tanto, realizam-se alterações na consulta original de forma que os dados obtidos mais relevantes sejam apresentados primeiro. A ordenação torna-se útil, pois apresenta os dados a quem executou a consulta seguindo um critério de ordenamento. Essa ordenação facilita a análise dos dados e elimina o esforço manual de ordenar as informações. Por exemplo, a CORE recebe uma consulta Q3:
FROM livro
WHERE quantidade = 10
e uma diretiva D1 = “título, autor ordenar decrescente” de formatação. Assim, temos:
Em D1 é solicitada a alteração da consulta original Q3, incluindo o comando de ordenação traduzido pela CORE (order by título, autor desc). Ao final da reescrita, a consulta será Q3’:
SELECT titulo, revisão, subTitulo, autor FROM livro
WHERE quantidade = 10 ORDER BY título, autor DESC.
Group by clause
Por fim, a cláusula <group by clause> realiza alterações sobre o GROUP BY de uma consulta SQL. Essa cláusula permite realizar operações de formatação. Tal funcionalidade é importante, pois auxilia quem vai analisar os dados a visualizar as informações de maneira agrupada, eliminando o esforço de realizar esse agrupamento manualmente. Por exemplo, a CORE recebe a consulta Q3:
SELECT titulo, revisão, subTitulo, autor FROM livro
WHERE quantidade = 10
e uma diretiva D1 = “agrupar por autor” de agrupamento de respostas. A diretiva D1 traduzida na CORE solicita a alteração da consulta original Q1. Assim, temos:
Uma operação que inclui um comando de agrupamento (group by autor). Ao final da reescrita, a consulta será Q3’:
SELECT titulo, revisão, subTitulo, autor FROM livro
WHERE quantidade = 10 GROUP BY autor.
Em resumo, as cláusulas SQL que instanciam as diretivas de reescrita permitem as seguintes operações:
Inserção de novas colunas na cláusula select, retirada de colunas da cláusula
select e formatação de respostas de colunas da cláusula select, por exemplo,
com o uso do operador trunk.
Inserção de restrições na cláusula where, e relaxamento de restrições da cláusula where;
Inserção de uma cláusula order by;
Inserção de uma cláusula group by;
União de consultas utilizando a cláusula union no operador proposto constraint_order;
Inserção ou exclusão de entidades na cláusula from.
Vale salientar que, na estratégia de reescrita de consultas da CORE, não utilizamos o operador join na cláusula FROM, isto foi um padrão definido neste trabalho com o intuito de uniformizar o processo de reescrita. A operação de junção é realizada por meio das equações de junção definidas na cláusula WHERE da consulta.