Aula de Laboratório Caché: DGBD Pós-Relacional • Principais características • Criação de Classes, Propriedades e Métodos • Linguagem para codificação de métodos • Execução de métodos O que é o Caché • SGBD pós-relacional • Um ambiente de desenvolvimento orientado a objetos • Acesso integrado a objeto e SQL Caché Caché Arquitetura Estrutura Básica Namespaces Bancos de Dados Universidade E Empresa B A D C Classes e objetos Cuma classe é uma definição dos dados juntos com sua aplicação lógica; • uma definição de classe consiste: <propriedades; <métodos; <consultas SQL; <parâmetros: constantes para a classe; Cum objeto é uma instância de uma classe; Criação de classes Criação de classes Criação de classes Criação de propriedades Criação de propriedades Criação de propriedades Criação de métodos Criação de métodos Criação de métodos Métodos <nome, valor de retorno <especificação formal de argumentos, características e o seu código. Características <um método privado pode ser usado somente por outros métodos de sua classe; <um méotod Final não pode ser sobre-escrito por subclasses que o herdem; <um método que não é um método de Classe é um método de instância; Métodos Métodos de instância: <sempre é chamado para um objeto particular aberto; do cust.%Save() ; salva este cliente! do cust.%Close() ; fecha este cliente! Métodos de classe: <não referencia um objeto aberto e deve usar a sintaxe ##class set cus = ##class(User.Customer).%OpenId(id) set mi = ##class(User.MenuItem).%New() Codificação <cada linha do código precisa começar com o caracter <tab>; <para especificar o valor retornado pelo método, use o comando Quit com um argumento; <erros de sintaxe serão indicados por uma marca vermelha; Any syntax errors will be indicated by a red mark; <para métodos de expressão, entre sem o <tab>; <a sintaxe “..” é usada para se referir a outro método ou propriedade da mesma classe; exemplo: ..Print() ..<prop> (acessando propriedades deste objeto) ..<método de instância> (outro método desta classe) ..<método de classe> (outro método desta classe) Codificação Loops For For <valor inicial>:<valor do incremento>:<valor final { <bloco de código> } Condição: if <condição> {código} elseif <condição> {código} else {código} Salvando um objeto em um método: set st = cust.%Save() if (st '= 1) {quit st} Script para Objetos Básico Criar um novo objeto: set <oref> = ##class(<pack>.<class>).%New() Abrir um objeto existente: set <oref> = ##class(<pack>.<class>).%OpenId(<id>) Salvar um objeto: set st = <oref>.%Save() Fechar um objeto: do <oref>.%Close() Básico Remover um objeto: do ##class(<package>.<class>).%DeleteId(<id>) Remover todos os objetos salvos: do ##class(<package>.<class>).%KillExtent() Escrever uma propriedade: write <oref>.<prop> Atribuir valor para uma propriedade: set <oref>.<prop> = <value> Básico Ligando dois objetos: set <oref1>.<prop> = <oref2> Populando uma classe: do ##class(<package>.<class>).Populate(<count>) Fechando todos os objetos na memória: do $system.OBJ.CloseObjects() Listar todos os objetos em memória: do $system.OBJ.ShowObjects() ; "d" for details Listas Criar uma nova lista: set <oref>=##class(%Library.ListOfDataTypes).%New() Inserir um elemento em uma lista: do <oref>.Insert(<value>) Mostrar um elemento de uma lista: write <oref>.GetAt(<position>) Mostrar o tamanho de uma lista: write <oref>.Count() Limpar os elementos de uma lista: do <oref>.Clear() Arrays Criar um novo array: set <oref>=##class(%Library.ArrayOfDataTypes).%New() Inserir um elemento em um array: do <oref>.SetAt(<value>,<key>) Mostrar um elemento de um array: write <oref>.GetAt(<key>) Mostrar o tamanho de um array: write <oref>.Count() Limpar os elementos de um array: do <oref>.Clear() Exercício Implementação do exemplo: Banco de Dados de Projeto (simplificado) Projeto BuscaProjeto CadastraProjeto MostraDocumentos EliminaProjeto codigo objetivo documentos nome coordenador topicos inícioValidade fimValidade Documento Mostra Relatório Técnico CadastraRT Mostra Artigo CadastraArt Mostra Pesquisador BuscaPesquisador CadastraPesquisador BD de Projeto simplificado codigoDoc nome classificação autPrinc tipoPubl localPubl dataPubl artigos nome especialização salário bônusProdução Classe Projeto método CadastraProjeto (nomeCoord: %Library.String, codigo:%Library.Integer, obj: %Library.String, nomeProjeto: %Library.String) retorna %Library.Status set pesq = ##class(Aula.Pesquisador).BuscaPesquisador(nomeCoord) if pesq = 0 quit 0 set proj = ##class(Aula.Projeto).%New() set proj.codigo = codigo set proj.objetivo = obj set proj.nome = nomeProjeto set proj.coordenador = pesq do proj.%Save() quit 1 Classe Pesquisador método BuscaPesquisador(nome: %Library.String) retorna Pesquisador &sql(DECLARE iterator CURSOR FOR SELECT ID FROM Aula.Pesquisador WHERE nome = :nome) &sql(OPEN iterator) ;"roda" a consulta (depois de “;” vem um comentário) &sql(FETCH iterator INTO :identificador) quit:(SQLCODE '= 0) 0 ;retorna 0 se der algum erro write "identificador: " write identificador,! ; “!” indica uma quebra de linha &sql(CLOSE iterator) set resposta = ##class(Aula.Pesquisador).%OpenId(identificador) quit resposta Classe Projeto método BuscaProjeto (codigoProj: %Library.Integer) retorna Projeto &sql(DECLARE iterator CURSOR FOR SELECT ID FROM Aula.Projeto WHERE codigo = :codigoProj) &sql(OPEN iterator) ;"roda" a consulta &sql(FETCH iterator INTO :identificador) quit:(SQLCODE '= 0) 0 write "identificador: " write identificador,! &sql(CLOSE iterator) set resposta = ##class(Aula.Projeto).%OpenId(identificador) quit resposta Classe Projeto método MostraDocumentos (codProjeto: %Library.Integer) set p= ##class(Aula.Projeto).BuscaProjeto(codProjeto) set docs = p.documentos ;recupera todos os documentos for y=1:1:docs.Count() ;percorre esses documentos { set d = docs.GetAt(y) do d.Mostra( ) } Classe Documento método Mostra( ) write “execucao do método Documento.Mostra",! Classe Artigo método Mostra() write "tipo", ! write ..tipoPubl write "nome", ! write ..nome Classe RelatórioTécnico método Mostra() write "inicio: " write $zd(..inicioValidade) ;converte para o formato de data write !,"fim: " write $zd(..fimValidade) ;converte para o formato de data write !,"nome: “, ..nome Classe Projeto método EliminaProjeto (codProj: %Library.Integer) retorna %Library.Status set proj = ..BuscaProjeto(codProj) if proj = 0 { write "nao existe o projeto especificado",! quit 0 } set oid = proj.%Oid() write “oid encontrado: ", oid, ! do ##class(Aula.Projeto).%Delete(oid) quit 1 Classe Pesquisador método CadastraPesquisador (nome: %Library.String, especializacao: %Library.String, salario: %Library.Float, bonus: %Library.Float ) retorna %Library.Status set pesq = ##class(Aula.Pesquisador).%New() set pesq.bonus = bonus set pesq.salario = salario set pesq.nome = nome set pesq.especializacao = especializacao do pesq.%Save() quit 1 Classe RelatorioTecnico método CadastraRT (codDoc: %Library.Integer, nomeDoc: %Library.String, classific: %Library.String, topicos: %Library.String, codProj: %Library.Integer, inicioVal: %Library.Date, fimVal: %Library.Date) retorna %Library.Status set projeto = ##class(Aula.Projeto).BuscaProjeto(codProj) if projeto = 0 { write "Nao existe o projeto especificado" quit 0 } set relatorio = ##class(Aula.Relatorio).%New() set relatorio.codigodoc = codDoc set relatorio.nome = nomeDoc set relatorio.classificacao = classific set relatorio.tópicos = topicos set relatorio.inicio = $zdh(inicioVal) ;converte para o formato de data set relatorio.fim = $zdh(fimVal) ;converte para o formato de data do relatorio.%Save() ;inserir o relatório no projeto set documentos = projeto.documentos do documentos.Insert(relatorio) do projeto.%Save() quit 1 Terminal • zn “Aula" //muda para o namespace que se deseja trabalhar • set teste = ##class(Aula.Pesquisador).%New() //cria um novo objeto • set value = teste.%Save() • set resultado = ##class(Aula.Pesquisador).BuscaPesquisador("pesquisador1")//chama o método de classe • do teste.%Close() • set teste = ##class(Aula.Pesquisador).%OpenId(5) • set teste.bonus = 50 • set teste.salario = 5000 • set teste.nome = "pesquisador5" • set teste.especializacao = "especializacao5" • do teste.%Save() • do ##class(Aula.Projeto).CadastraProjeto("pesquisador3",3,"objetivo3","projeto3") • do ##class(Aula.Relatorio).CadastraRT(4,"relatorio4","classif4", "topico4", "4/4/40", "4/4/44",2) • set x = ##class(Aula.Projeto).BuscaProjeto(1) • do ##class(Aula.Projeto).MostraDocumentos(1) • set x = ##class(Aula.Pesquisador).CadastraPesquisador("pesquisador7","especializacao7", 700, 70) • set x = ##class(Aula.Projeto).EliminaProj(1) Classe Pesquisador método CadastraPesquisador (nome: %Library.String, especializacao: %Library.String, salario: %Library.Float, bonus: %Library.Float ) retorna %Library.Status set pesq = ##class(Aula.Pesquisador).%New() set pesq.bonus = bonus set pesq.salario = salario set pesq.nome = nome set pesq.especializacao = especializacao do pesq.%Save() quit 1 Classe Artigo método CadastraArt (codDoc: %Library.Integer, nomeDoc: %Library.String, classific: %Library.String, tipoPubl: %Library.String, localPubl: %Library.String, data: %Library.Date, autPrinc: %Library.String, codProj : %Library.String) retorna %Library.Status { write "começou o método CadastraArt",! set projeto = ##class(Aula.Projeto).BuscaProjeto(codProj) if projeto = 0 { write "Nao existe o projeto especificado" quit 0 } set pesquisador = ##class(Aula.Pesquisador).BuscaPesquisador(autPrinc) if pesquisador = 0 { write "Nao existe o pesquisador especificado" quit 0 } set artigo = ##class(Aula.Artigo).%New() set artigo.codigoDoc = codDoc set artigo.nome = nomeDoc set artigo.classificacao = classific set artigo.tipoPubl = tipoPubl set artigo.dataPubl = $zdh(data) ;converte para o formato de data set artigo.localPubl = localPubl set artigo.autPrinc = pesquisador do artigo.%Save() ;inserir o artigo no projeto set documentos = projeto.documentos do documentos.Insert(artigo) do projeto.%Save() write "terminou o método CadastraArt",! quit 1 } Classe Pesquisador método MostraArtigos ( ) retorna null write "Artigos publicados por ", ..nome, ":", ! set arts = ..artigos for i=1:1:arts.Count() { set temp = arts.GetAt(i) write "Nome do artigo: ", temp.nome,! write "Local da publicacao: ", temp.localPubl,! write "Classificacao: ", temp.classificacao,! write "Data da publicacao: ", $zd(temp.data),!! } write "Fim da lista de artigos de ", ..nome