blendb issueshttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues2018-08-29T13:51:58Zhttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/63Controle de transformações2018-08-29T13:51:58ZLucas Fernandes de OliveiraControle de transformaçõesConstrução das agregações a partir das fontes.
* A construção de uma agregação é a construção de suas métricas e dimensões a partir dos campos de uma fonte.
* Para cada registro na fonte será gerado um único registro na agregação.
* A ...Construção das agregações a partir das fontes.
* A construção de uma agregação é a construção de suas métricas e dimensões a partir dos campos de uma fonte.
* Para cada registro na fonte será gerado um único registro na agregação.
* A construção de uma métrica ou dimensão é o resultado de uma expressão dos campos da fonte e de constantes
Para resolver o problema será necessário:
* Alteração do arquivo de configuração. Transformações devem estart no arquivo de configuração
* Criação de um *parser* para verificar a validade das expressões de construção
* Tradução das transformações pelos adaptadores
* Definição de uma técnica de atualização
Sugestões para solucionar os tópicos acima:
* [ ] Adição de um campo *transformers* na definição da agregação. Esse campo será uma lista com identificadores de transformações que são usados para criar essa agregação
* [ ] Adição de uma novo campo no nível 0 do arquivo de configuração chamado *transformers*. Esse campo contém uma lista de definição de transformações. Uma transformação pode ser definida por:
* **name**: nome/identificador da transformação (utilizado na definição da agregação)
* **source**: fonte na qual a transformação é aplicada
* **dimensions**: objeto onde cada chave é uma dimenção criada pela transformação
* Uma dimensão é definida como uma lista de condições seguidas de expressões
* A propósta é utilziar essa lista como um **CASE/WHEN** de SQL
* **metrics**: objeto onde cada chave é uma métrica criada pela transformação
* Uma métricas é definida como uma lista de condições seguidas de expressões
* A propósta é utilziar essa lista como um **CASE/WHEN** de SQL
* [ ] Utilização do pacote **sintax-cli** para criação de um parser de expressões. A principal função do parser é validar as expressões e devolver os tipos (int, float, bool, ...) das expressões para validação
* [ ] Criação de uma nova variável de ambiente para definir a politica de atualização, chamada **BLENDB_UPDATE**
* Para a primeira versão está sendo considerado que existira uma única política de atualização para o Blendb todo
* Outras alternativas seriam uma politica para cada transformer ou para cada fonte
* Há duas politicas propóstas. **Temporal**, a cada **X** tempo é realizada a transformação. **Frequência**, a cada **X** inserções é realizada a transformação.
* [ ] Adição de uma função no adaptador (abstrato) para aplicação de transformações
1.0Lucas Fernandes de OliveiraLucas Fernandes de Oliveirahttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/85Conexão em múltiplos bancos de dados simultâneamente2018-10-03T14:53:04ZLucas Fernandes de OliveiraConexão em múltiplos bancos de dados simultâneamente# Problema
Foi detectado que para a realização da tarefa #58, é necessário se conectar em diversos bancos de dados simultâneamente. Foi detectada que essa não seria uma atualização trivial de ser realizada e terá grandes impactos em dive...# Problema
Foi detectado que para a realização da tarefa #58, é necessário se conectar em diversos bancos de dados simultâneamente. Foi detectada que essa não seria uma atualização trivial de ser realizada e terá grandes impactos em diversas partes do código, por essa razão uma tarefa separada foi criada.
Por enquanto o objetivo da tarefa é permitir a conexão a vários bancos que **compartilham o mesmo esquema**. No futuro pretende-se utilizar esquemas diferentes para cada um dos bancos, entretanto essa alteração seria muito grande e será delegada a uma outra tarefa futura.
Atualmente, conectar-se em múltiplos bancos de dados possui dois benefícios imediatos.
* Realização de testes simultâneos em SGBDs diferentes (garantindo corretude em todos os SGBD's)
* Distribuição de carga entre bases de dados (Que podem ser de SGBD's diferentes)
Além disso a inserção pode ser disparada para todos os adaptadores, mantendo a consistência da base. Ainda não é necessário decidir para qual base uma determinada inserção é enviada.
# Alterações necessárias
* [x] Modificar as variáveis de ambiente para conexão com o banco.
* Uma nova variável deve ser criada: **BLENDB_N_DATABASES** que indica o número de bancos de dados simultâneos sendo utilizados. Ela deve ter como valor *default* 1
* As variáveis **BLENDB_DB_*** devem ser modificadas para **BLENDB_DBN_** onde **DBN** será substituido por **DB0** para o primeiro banco, **DB1** para o segundo e assim sucessivamente
* A variável **BLENDB_ADAPTER** deve ser trocada para **BLENDB_DBN_ADAPTER**, já que cada banco pode ter o seu próprio adaptador
* Uma nova váriavel deve ser criada **BLENDB_SCHEMA** que contém o caminho para o esquema do banco de dados (relativo a raiz do projeto ou absoluto)
* [x] Alterações na leitura da configuração
* No **ConfigParser** trocar a criação da conexão de um objeto **Connection** para uma lista de conexões, uma para cada base.
* Realizar a leitura do arquivo de esquema a partir da váriavel de ambiente **BLENDB_SCHEMA**
* [x] Alterações na inicialização (**main.ts**)
* Remover a leitura *hardcoded* do arquivo de definição de esquema (Atualmente config.yaml ou test.yaml).
* Modificação da *middleware* de adapatdores para receber uma lista e não apenas uma conexão.
* [x] Modificação das *midlewares* de adaptador
* Unificar as *middlewares* de cada adaptador em uma única middleware que devolve uma lista de adaptadores e atribui a uma váriavel req.adapters
* [ ] Alterações nos controladores da API de leitura/escrita
* Criação de uma politica de leitura, sugestão: **round robin**, ou seja, cada nova requisição é enviada para o banco que foi o último a atender uma requisição
* Criação de uma politica de escrita, realizar a escrita em todos os bancos
* Caso 2 bancos na realidade forem o mesmo banco, a inserção será duplicada (inserções com data devem resolver)Revisionhttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/69Ferramenta de bulk insert2018-08-29T13:50:38ZLucas Fernandes de OliveiraFerramenta de bulk insertO projeto de API atualmente preve inserções uma a uma. Porém inserção através de uma API não parece a melhor abordagem para inserção de grandes quantiaddes de dados de uma única vez. Uma proposta é criar um script de *bulk insert* utili...O projeto de API atualmente preve inserções uma a uma. Porém inserção através de uma API não parece a melhor abordagem para inserção de grandes quantiaddes de dados de uma única vez. Uma proposta é criar um script de *bulk insert* utilizando o npm como interface.
A proposta é criar um script que execute com o comando ```npm run bulk <source> <file>``` que insira o arquivo utilizando inserção em massa em uma fonte.
Alterações no comando podem ser necessárias.1.0https://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/70Aprimorar arquivo de configuração para permitir transformações2018-08-29T13:51:58ZLucas Fernandes de OliveiraAprimorar arquivo de configuração para permitir transformaçõesA proposta atual de transformação é **copiar** dados de uma *source* para uma *view*. Essa cópia deve estar mapeada no arquivo de configuração.
Atualizar o arquivo de configuração para que quando uma view, quando marcada como *origin*, ...A proposta atual de transformação é **copiar** dados de uma *source* para uma *view*. Essa cópia deve estar mapeada no arquivo de configuração.
Atualizar o arquivo de configuração para que quando uma view, quando marcada como *origin*, tenha a informação de como gerar suas métricas e dimensões a partir das fontes.
# Proposta
Adicionar como propriedade de uma *view* um campo *sources*, onde cada chave dentro de sources representa uma *source* que será utilizada para gerar a *view*. A propriedade *source* tem um campo para cada métrica e dimensão da *view* que por sua vez tem a regra de formação a partir da *source* para gerar a métrica/dimensão.
# Observações
* Essa proposta assume uma *view* é criada pela **UNION** das sources, ou seja, as *sources* **não podem** ser combinadas para criar um **único** registro.
* Ou seja não é possível fazer : se na fonte1 o valor é x e na fonte2 o valor é y coloque z
* A proposta tem como objetivo facilitar a criação de uma *materialized view*, onde as regras definem como os campos são criados.
* Provavelmente essas regras gerarão um SQL (ou equivalente) para construir uma *materialized view*.
* As transformações possíveis ainda não estão bem definidas, devem sex esclarecidas para a execução da tarefa.
* Essa tarefa apenas **MODIFICA** o arquivo de configuração e não **APLICA** as transformações. Seu objetivo é **LER** e **VALIDAR** as transformações.1.0https://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/87Implementação de dependecia funcional para definir escopo de métricas2018-08-22T12:43:58ZLucas Fernandes de OliveiraImplementação de dependecia funcional para definir escopo de métricasPode-se ocorrer casos em que uma métrica não pode ser dividida no conjunto de métricas fornecido. Nesse caso ocorre a replicação do valor. Anteriormente acreditava-se que esse era o comportamento desejado, mas existem casos que a respost...Pode-se ocorrer casos em que uma métrica não pode ser dividida no conjunto de métricas fornecido. Nesse caso ocorre a replicação do valor. Anteriormente acreditava-se que esse era o comportamento desejado, mas existem casos que a resposta é erronêa.
Um exemplo: Supondo que os dados de rede são coletados em nível de cidade, e uma outra métrica de inventário é coletado em nível de escola. O resultado da consulta **dados de rede por escola**, seria o seguinte: todas as escolas da mesma cidade apresentariam o mesmo valor, que é o total de tráfego da cidade.
Para evitar esse problema deve-se identificar quais dimensões podem ser utilizadas em conjunto com as métricas. Para isso basta utilizar a depêndencia funcional dos atributos.
A métrica deve possuir uma chave (conjunto de dimensões) e todas as dimensões são dependentes funcionais dessa chave (podem ser inferidas a partir da chave) são as dimensões que podem ser utilizadas em conjunto com a métrica.
## Especificação
* Na definição das dimensões (arquivo de configuração), deve existir um novo campo: uma lista de dimensões que podem ser utilizadas para inferir a dimensão atual
* Se A -> C e B -> C, então em C existe uma lista com os valores [A, B]
* Métricas devem possuir uma chave
* A chave pode ser inferida da **visão origem** da métrica
* O conjunto de dimensões dessa visão pode ser utilizado como chave
* Deve-se adicionar a verficação de unicidade da métrica e da **visão origem** da métrica
* As métricas devem conter uma lista de dimensões permitidas, para serrem utilizadas em conjunto
* Essa lista pode ser calculada na leitura do arquivo de configuração
* Basta criar um grafo com as informações de dependencia funcional e calcular o fecho transitivo (realizar uma busca em largura)
* Uma vez com a lista basta verificar se a lista de dimensões é um sub-conjunto da lista de dimensões permitidas para cada uma das métricas da consulta
## Implementação
* [ ] Adicionar novo campo no arquivo de configuração para as dimensões, contendo a informação de dependencia
* [ ] Adicionar novo campo a classe das métricas, com a lista de dimensões permitidas
* [ ] Criar um grafo a partir das informações de dependência no momento da leitura do arquivo de configuração
* [ ] Calcular o conjunto de dimensões permitidas por métrica, utilizando o grafo, realizando uma busca (provavelmente em, largura)
* [ ] Modificar a API para verificar se o conjunto de dimensões é um sub-conjunto do conjunto de dimensões permitidas. Caso o conjunto seja inválido, informar o erro.1.0Lucas Fernandes de OliveiraLucas Fernandes de Oliveirahttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/95Adicionar script de criação do banco2018-11-20T11:21:17ZLucas Fernandes de OliveiraAdicionar script de criação do bancoCriar um script que é executado utilizando ```npm run init-db``` que cria todas as tabelas necessárias para o funcionamento do Blendb (utilizando o arquivo de configuração).
Caso as tabelas já existam, não devem ser alteradas. Caso este...Criar um script que é executado utilizando ```npm run init-db``` que cria todas as tabelas necessárias para o funcionamento do Blendb (utilizando o arquivo de configuração).
Caso as tabelas já existam, não devem ser alteradas. Caso estejam utilizando o *alias* como nome, deve-se verificar se o *id* confere. Caso não confira, deve-se retornar um erro.
Para evitar atualização parcial, essas operações devem ser executadas como uma única transação.
Esse código já está parcialmente escrito na seção de fixtures. Esse código deve ser realocado para o código dos adaptadores. O script a ser criado deve simplesmente chamar as funções de criação dos adaptadores.1.0https://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/101Criar Classe para gerenciar mensagens de erro.2018-12-13T13:14:24ZLucas Fernandes de OliveiraCriar Classe para gerenciar mensagens de erro.Criar uma classe que gera as mensagens de erro.
Essa classe poderia ser chamada de ErrorHandler ou ErrorMsgHandler cujo objetivo é criar as mensagens de erro. Para cada mensagem de erro a classe deve ter um método para gerar uma mensage...Criar uma classe que gera as mensagens de erro.
Essa classe poderia ser chamada de ErrorHandler ou ErrorMsgHandler cujo objetivo é criar as mensagens de erro. Para cada mensagem de erro a classe deve ter um método para gerar uma mensagem específica. Caso a mensagem tenham parametros ela deve receber como argumento de função. A ideia da classe é padronizar as mensagens de erro e reduzir a quantidade de código repleta de strings gigantes.
Uma vez que a classe foi criada substituir as mensagens de erros por chamadas de funções dessa classe.https://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/106Adicionar resposat de consulta em formato csv2019-07-01T18:20:52ZLucas Fernandes de OliveiraAdicionar resposat de consulta em formato csvPermitir que as respostas da api sejam respondidas através de arquivos csv.
A API passará a ter um novo parametro **format** que por padrão receberá o valor json mas também pode receber o valor csv para exportar os dados em formato csv.Permitir que as respostas da api sejam respondidas através de arquivos csv.
A API passará a ter um novo parametro **format** que por padrão receberá o valor json mas também pode receber o valor csv para exportar os dados em formato csv.Lucas Fernandes de OliveiraLucas Fernandes de Oliveirahttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/107Adicionar marcadores as métricas e dimensões2019-07-26T14:50:11ZLucas Fernandes de OliveiraAdicionar marcadores as métricas e dimensõesAdicionar a descrição das métricas e dimensões marcadores.
Será adicionado um campo tags que é opicional. Esse campo pode ser preenchido de duas formas. Diretamente nas mérticas e dimensões ou através das visões na qual elas estão
As v...Adicionar a descrição das métricas e dimensões marcadores.
Será adicionado um campo tags que é opicional. Esse campo pode ser preenchido de duas formas. Diretamente nas mérticas e dimensões ou através das visões na qual elas estão
As visões também podem receber tags. Todas as métricas e dimensões nessa visão receberão a tag indcada.
Também deverá existir uma rota de tags que retorna as tags existentes.
Essas tags podem ser adicionadas no arquivo de configuração.1.0Lucas Fernandes de OliveiraLucas Fernandes de Oliveira