blendb issueshttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues2018-08-22T12:43:58Zhttps://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/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)Revision