View
112
Download
0
Category
Preview:
Citation preview
II- Padrão ODMGII- Padrão ODMGII- Padrão ODMGII- Padrão ODMG
Object Query Language - OQLObject Query Language - OQL
A Linguagem OQL• Consultas a repositórios de classes
- ODL • OQL combina os aspectos
declarativos da linguagem SQL com o paradigma de programação OO
• Apresentação by example
Consultas Intra-Classe• Qual o ano do filme "E o vento levou“?
– f é uma variável do tipo Filme que "varre" o repositório Filmes (isto é, pode receber cada valor da repositório corrente Filmes)
SELECT f.anoFROM Filmes fWHERE f.título = "E o vento levou?"
Consultas Inter-Classes• Quais os nomes das estrelas do filme
"Casablanca"?
– Note o tratamento unificado para atributos e relacionamentos
SELECT e.nomeFROM Filmes f, f.estrelado_por eWHERE f.título = "Casablanca"
For each f in Filmes do If f.título = "Casablanca" then For each e in f.estrelado_por then Add e.nome to output bag
Consultas Com Método• Quais os títulos e anos dos filmes com mais de 2
horas de duração?
– Note o tratamento unificado para atributos, relacionamentos e métodos
SELECT f.título, f.anoFROM Filmes fWHERE f.duração_em_horas( ) > 2.0;
/* pode ser também duração_em_horas(f) */
Path Expressions • Se o denota um objeto pertencendo a uma
classe C, e p é uma propriedade da classe, então o.p é o resultado de aplicar p a o – Se p é um atributo, então o.p é o valor do atributo
no objeto o – Se p é um relacionamento, então o.p é o objeto ou
coleção de objetos relacionados com o através do relacionamento p
– Se p é um método (talvez, com parâmetros), então o.p é o resultado de aplicar o método a o
• Pode ser usado o símbolo -> em lugar do ponto
• O valor de meu_filme.duração é a duração
do filme, isto é, o valor do atributo duração para o objeto Filme denotado por meu_filme
• O valor de meu_filme.duração_em_horas() é um número real, a duração do filme em horas, calculada pela aplicação do método duração_em_horas() ao objeto meu_filme
• O valor de meu_filme.estrelado_por é o conjunto
de objetos Estrela que estrelaram o filme meu_filme
• A expressão meu_filme.estrelas (nomes) não retorna valor (em C++, o tipo de função void). Entretanto retorna o conjunto dos nomes das estrelas de meu_filme (parâmetro de saída nomes, do tipo coleção)
• O que significa meu_filme.realizado_por.nome?
Expressões OQL• Estilo SQL
– Select-From-Where
• A palavra-chave SELECT seguida por uma lista de expressões
• A palavra-chave FROM seguida por uma ou mais declarações de variáveis simples. Uma variável é declarada por dar– uma expressão cujo valor tem um tipo coleção, isto
é, um conjunto, ou bag, ou lista, ou array – A palavra-chave opcional AS – O nome da variável simples, que “varre” a coleção
• Tipicamente, a expressão de (a) é o repositório de alguma classe, como o repositório Filmes da classe Filme. Entretanto, qualquer expressão que produza uma coleção de objetos pode ser utilizada, incluindo outra expressão Select-From-Where
• A palavra-chave WHERE e uma expressão booleana. Este expressão, como a expressão seguindo o SELECT, pode usar somente constantes e variáveis declaradas na cláusula FROM
• Uma consulta produz um bag de objetos
Eliminação de Duplicatas
SELECT DISTINCT e.nomeFROM Filmes f, f.estrelado_por eWHERE f.realizado_por.nome =
"Disney"
Objetos ComplexosSet<Struct N {string c1, string c2}> N1 N1 = SELECT DISTINCT Struct(estrela1: e1.nome, estrela2: e2.nome) FROM Estrelas e1, Estrelas e2 WHERE e1.endereço = e2.endereço AND e1.nome < e2.nome
Sub-consultasSELECT DISTINCT e.nomeFROM (SELECT f FROM Filmes f WHERE f.realizado_por.nome
= "Disney") d, d.estrelado_por e
Resultado como ListaSELECT fFROM Filmes fWHERE f.realizado_por.nome =
"Disney"ORDER BY f.duração, f.título
Expressões com Quantificadores
• FOR ALL x IN C : C(x), onde C é um conjunto, x é uma variável, e C(x) é uma condição
SELECT e FROM Estrelas e WHERE ALL f IN e.estrelou_em : f.realizado_por.nome = "Disney"
• EXISTS x IN C : C(x)
SELECT e FROM Estrelas e WHERE EXISTS f IN e.estrelou_em : f.realizado_por.nome = "Disney"
Expressões com Agregação
• OQL usa os mesmos cinco operadores de agregação usados em SQL: AVG, COUNT, SUM, MIN, e MAX. – Aplicáveis a qualquer coleção cujos
membros são de tipos apropriados
SELECT ... AVG(SELECT f.duração FROM Filmes f)...
Expressões com GROUP BY
• A forma de uma cláusula GROUP BY em OQL é – As palavras chave GROUP BY– Uma lista de atributos-partição ("partition
attributes"). Cada atributo-partição consiste de • Um nome de uma variável (um critério de agregação) • Dois pontos • Uma expressão mencionando uma variável na
cláusula FROM
• Na lista do SELECT, só podem aparecer os
critérios de agregação, e os valores agregados • O valor retornado pela cláusula GROUP BY é
um conjunto de estruturas • Cada estrutura tem a forma
Struct(critério_agregação1:v1, ..., critério_agregaçãon:vn, lista_de_valores_agregados)
• Os valores agregados referem-se a uma
partição (um conjunto de valores de atributos-partição)
SELECT nome_estúdio, ano_filme, média_durações: AVG(SELECT p.f.duração FROM partition p) FROM Filmes f GROUP BY nome_estúdio: f.realizado_por.nome,
ano_filme: f.ano HAVING MAX(SELECT p.f.duração FROM
partition p) > 120
Operadores sobre Coleções
• Pode-se aplicar os operadores de união (UNION), interseção (INTERSECT) e diferença (EXCEPT) a duas coleções compatíveis de objetos
(SELECT DISTINCT f FROM Filmes f, f.estrelado_por e WHERE e.nome = "Harrison Ford") EXCEPT (SELECT DISTINCT f FROM Filmes f WHERE f.realizado_por = "Disney")
Variáveis Hospedeiras (Binding)
Set<Filme> Velhos_filmes
Velhos_filmes = SELECT DISTINCT f FROM Filmes f WHERE f.ano <
1920;
List<Filme> Minha_lista
Minha_lista = SELECT f FROM Filmes f ORDER BY f.título, f.ano
Extraindo o Elemento de uma Coleção
UnitáriaFilme Meu_filme
Meu_filme = ELEMENT(SELECT f FROM Filmes f WHERE f.título = "E o Vento
Levou")
Exercícios • Considere a
classe
Class Empregado (extent Empregados key matricula){ attribute string matricula; attribute string nome; attribute float salario; relationship Set<Empregado> gerencia inverse Empregado::eh_gerenciado_por; relationship Empregado eh_gerenciado_por inverse Empregado::gerencia; ...;}
Escreva em OQL Quais o nome e o
salário do gerente de Natasha?
• Seja o esquema de filmes, estrelas e
estúdios visto em aula. Escrever em OQL as seguintes perguntas – Quais os estúdios que realizaram algum
filme com duração maior que a duração de cada filme realizado pela Eurofilmes?
– Quais os estúdios que realizaram mais filmes?
– Quais os estúdios que não realizaram filmes antes de 1960?
– Quais as estrelas dos filmes com duração maior que pelo menos a de um filme realizado pela Disney?
– Quais as estrelas que estrelaram em todos os filmes do estúdio Cinecittá?
– Quais os estúdios que menos realizaram filmes?
Omissões da Linguagem OQL
• Não oferece abstrações como visões SQL
• Linguagem de consulta stricto sensu
Recommended