blendb issueshttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues2018-05-02T13:27:09Zhttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/62Realizar inserção 1 por 1 em fontes de dados2018-05-02T13:27:09ZLucas Fernandes de OliveiraRealizar inserção 1 por 1 em fontes de dadosFazer com que a rota de coleta realmente insira os dados nas fontes.
* [x] Alterar o arquivo da rota -- ```src/api/constrollers/collect.ts```
* [x] Tradução de objeto para consulta
Passo a Passo de tradução:
* Na camada de API realiz...Fazer com que a rota de coleta realmente insira os dados nas fontes.
* [x] Alterar o arquivo da rota -- ```src/api/constrollers/collect.ts```
* [x] Tradução de objeto para consulta
Passo a Passo de tradução:
* Na camada de API realizar a validação dos dados
* Isso incluí verificar se a fonte existe
* Depois verificar se os campos do JSON de entrada fazem parte da fonte
* Validar os tipos de dados do json em relação as fontes
* Uma vez os dados validados chamar a função de inserção do adapter
* Na camada de Adapter
* Criar uma função que recebe dois parametros, uma fonte e os dados (sincrona, privada/protegida)
* Essa função deve gerar uma consulta de inserção para o banco de dados em questão
* Criar uma função que executa a consulta no banco de dados (asincrona, publica)
* Essa função será chamada pela API
Lembretes:
* A classe abstrata de Adapter deve receber essa função pública
* Cada um dos adapters pode ter uma implementação diferente da função pública, entretanto a função privada/protegiada provavelmente pode ser aproveitada nos adaptadores sql1.0Rafael DiasRafael Diashttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/78Adicionar yarn e npm shrinkwrap2018-05-07T12:19:25ZLucas Fernandes de OliveiraAdicionar yarn e npm shrinkwrapO yarn promete ser uma evolução do npm. Não se sabe se o yarn subtituirá completamente o npm mas o principal motivo para realizar a mudança é o fato de o yarn utilizar por padrão o travamento preciso da versão dos pacotes.
Essa funciona...O yarn promete ser uma evolução do npm. Não se sabe se o yarn subtituirá completamente o npm mas o principal motivo para realizar a mudança é o fato de o yarn utilizar por padrão o travamento preciso da versão dos pacotes.
Essa funcionalidade está disponível com o npm utilizando o comando npm shrinkwrap.
Como o docker está sendo utilizado, a versão dos pacotes deve ser precisa.
Alterar configurações necessaŕias e arquivos Docker para utilização de versão precisa.1.0Rafael DiasRafael Diashttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/67Validar dataType2018-05-15T13:02:06ZRafael DiasValidar dataTypeÈ necessario validar o dataType contido no arquivo de configuração ```config/config.yaml```.È necessario validar o dataType contido no arquivo de configuração ```config/config.yaml```.1.0Rafael DiasRafael Diashttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/77Definir local para os tipos2018-05-15T13:02:19ZRafael DiasDefinir local para os tiposQuais são e aonde estão definidos os tipos que serão usados como padrão no BlendbQuais são e aonde estão definidos os tipos que serão usados como padrão no Blendb1.0Rafael DiasRafael Diashttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/73Gerar cobertura de código como artefato do pipeline2018-05-16T13:40:42ZLucas Fernandes de OliveiraGerar cobertura de código como artefato do pipelineAo executar um pipeline a bobertura de código deve ser devolvida como uma artefato, assim é possível verificar as linhas dos novos arquivos que adicionadosAo executar um pipeline a bobertura de código deve ser devolvida como uma artefato, assim é possível verificar as linhas dos novos arquivos que adicionados1.0Rafael DiasRafael Diashttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/66Redefinir algoritmo de junção2018-05-16T13:40:51ZLucas Fernandes de OliveiraRedefinir algoritmo de junçãoO algoritmo de junção possui uma regra: Quando agregações de granularidade diferentes são unidas, não é possível agregagar. Essa regra atrapalha alguns casos onde a ordem das junções afeta o resultado final. Buscar uma solução. Possíveis...O algoritmo de junção possui uma regra: Quando agregações de granularidade diferentes são unidas, não é possível agregagar. Essa regra atrapalha alguns casos onde a ordem das junções afeta o resultado final. Buscar uma solução. Possíveis soluções incluir utilizar dependência funcional e salvar esse tipo de informação na agregação ou dimensão.1.0Lucas Fernandes de OliveiraLucas Fernandes de Oliveirahttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/44Mover metricas dimensionais para Engine2018-05-16T13:40:54ZLucas Fernandes de OliveiraMover metricas dimensionais para EngineAtualmente as métricas dimensionais são tratadas apenas pelo adapter. Esse efeito surge ao realizar certos Joins entre as views sobre certas condições.
Descobrir se esse problema já pode ser detectado na Engine, e resolvido nesse ponto....Atualmente as métricas dimensionais são tratadas apenas pelo adapter. Esse efeito surge ao realizar certos Joins entre as views sobre certas condições.
Descobrir se esse problema já pode ser detectado na Engine, e resolvido nesse ponto. Provavelmente se isso for possivel, a view deverá ter uma estrutura mais elaborada do que um vetor de childViews para passar ao adapter para gerar a consulta. Provavelmente terá que indicar exatamente quais joins devem ser feitos e quais agregações devem ser feitas.
Com essa alteração o adapter terá que ser refatorado (Novamente), mas provavelmente deverá ficar mais simples.1.0Lucas Fernandes de OliveiraLucas Fernandes de Oliveirahttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/84Utilização da ferramenta Typedoc2018-05-24T14:35:52ZLucas Fernandes de OliveiraUtilização da ferramenta Typedoc[Typedoc](https://github.com/TypeStrong/typedoc) é um gerador de documentação de código Typescript.
Atualmente o código é parcialmente documentado utilizando a Wiki do Gitlab. O principal problema dessa abordagem é que o processo não é ...[Typedoc](https://github.com/TypeStrong/typedoc) é um gerador de documentação de código Typescript.
Atualmente o código é parcialmente documentado utilizando a Wiki do Gitlab. O principal problema dessa abordagem é que o processo não é integrado e não é versionado. Utilizando essa ferramenta cada uma dos branchs poderia ser documentado separadamente e não é necessária a utilização de uma ferramenta externa, basta modificar o próprio código (através da inserção de comentários)1.0Lucas Fernandes de OliveiraLucas Fernandes de Oliveirahttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/79Criar Views (materializadas) quando não existem2018-06-06T12:04:37ZLucas Fernandes de OliveiraCriar Views (materializadas) quando não existemAtualmente existe uma variável **BLENDB_ST_CREATE** que quando é verdadeira cria as tabelas de teste e quando é falsa apenas trunca.
Remover essa váriavel e em caso de teste criar as tabelas que não existem ao invés de falhar a execuçãoAtualmente existe uma variável **BLENDB_ST_CREATE** que quando é verdadeira cria as tabelas de teste e quando é falsa apenas trunca.
Remover essa váriavel e em caso de teste criar as tabelas que não existem ao invés de falhar a execução1.0Rafael DiasRafael Diashttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/83Correção dos testes de Fonte2018-06-11T12:42:15ZLucas Fernandes de OliveiraCorreção dos testes de FontePara testar as fontes é utilizada a classe **Fixture** que carrega os dados nos bancos de dados.
Por falta de um **runner** do gitlab-ci que contenha o monetdb, durante o processo de integração continua testes nesse banco de dados não s...Para testar as fontes é utilizada a classe **Fixture** que carrega os dados nos bancos de dados.
Por falta de um **runner** do gitlab-ci que contenha o monetdb, durante o processo de integração continua testes nesse banco de dados não são utilizados. Entretanto esses testes podem ser executados localmente. Ao se executar os testes localmente para o MonetDB os testes falham pois não foram escritos métodos para tratamento de fontes na classe **Fixture** do Monetdb.
Além disso alguns métodos utilizados pela **Fixture** no PostgreSQL não seguem os padrões de nome. Exemplos são **LoadSource** e **ExtractData**. Nomes de métodos sempre devem começar com a letra minúscula.
* Corrigir a **Fixture** para Monetdb, permitindo realizar testes autométicos nesse banco
* Corrigir a **Fixtures** para PostgreSQL, colocando os métodos no padrão de nome1.0Rafael DiasRafael Diashttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/81Corrigir erros de ortografia em mensagens de erro2018-07-09T11:40:24ZLucas Fernandes de OliveiraCorrigir erros de ortografia em mensagens de erroA seguinte mensagem de erro é detectada no arquivo ```src/api/collect/collect.spec.ts```
Could not construct query with the paramters given."
Corrigir para
**Could not construct query with the given parameters.**A seguinte mensagem de erro é detectada no arquivo ```src/api/collect/collect.spec.ts```
Could not construct query with the paramters given."
Corrigir para
**Could not construct query with the given parameters.**1.0Rafael DiasRafael Diashttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/58Adicionar testes automatizados para o Adaptador de MonetDB2018-07-10T12:03:46ZLucas Fernandes de OliveiraAdicionar testes automatizados para o Adaptador de MonetDBA propósta é utilziar os mesmos testes tanto para o MonetDB quanto para o Postgres.
Essa issue está impedida pelo fato de não haver um *runner* adequaqdo para executar testes no postgres e no monet
Adicionar uma opções de adaptador tes...A propósta é utilziar os mesmos testes tanto para o MonetDB quanto para o Postgres.
Essa issue está impedida pelo fato de não haver um *runner* adequaqdo para executar testes no postgres e no monet
Adicionar uma opções de adaptador test (que deve ser usada apenas para testes) que executas os testes em todos os adaptadores.
Quando outra opções além dessa é usada deve-se pular os testes dos outros adaptadoresRevisionRafael DiasRafael Diashttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/80Centralizar parsers para enums2018-07-31T14:27:01ZLucas Fernandes de OliveiraCentralizar parsers para enumsAtulamente as funções que traduzem strings para Enums e vice-versa espalhadas em diversas classes, as que tem maior necessidade de utilizar essas funções, porém isso se torna incoveniente se mais de uma classe precisa do parser.
Criar u...Atulamente as funções que traduzem strings para Enums e vice-versa espalhadas em diversas classes, as que tem maior necessidade de utilizar essas funções, porém isso se torna incoveniente se mais de uma classe precisa do parser.
Criar um arquivo no diretório **utils** chamado **enumHandler** que deve contém métodos estáticos para manipulação dos enums1.0Rafael DiasRafael Diashttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/82Campo opcicional para Enumtype2018-08-07T13:50:42ZLucas Fernandes de OliveiraCampo opcicional para EnumtypeQuando uma dimensão ou campo de uma fonte possui tipo como tipo enumeravel, a exibir essas informações como string (quando são retornadas pelas rotas) o valor do **enumtype** sobrescreve o **dataType**. Seria mellhor que o datatype fosse...Quando uma dimensão ou campo de uma fonte possui tipo como tipo enumeravel, a exibir essas informações como string (quando são retornadas pelas rotas) o valor do **enumtype** sobrescreve o **dataType**. Seria mellhor que o datatype fosse marcado como **enum** e uma nova chave **enumtype** que seria opcional recebesse o valor do **enumtype**.
Essa mudança se deve a maior facilidade para geração de interfaces automáticas.
Além disso, se essa mesma lógica for aplicada ao arquivo de configuração a sua leitura deve ser mais simples.1.0Rafael DiasRafael Diashttps://gitlab.c3sl.ufpr.br/c3sl/blendb/-/issues/71Permitir links em arquivos de configuração para views e sources2018-08-13T13:25:41ZLucas Fernandes de OliveiraPermitir links em arquivos de configuração para views e sourcesOs objetos *views* e *sources* são os mais complexos (os que podem possuir mais propriedades) e tornam o arquivo de configuração grande e ilegivel. Permitir que eles recebam um link para outro arquivo ao invés da definição da estrutura. ...Os objetos *views* e *sources* são os mais complexos (os que podem possuir mais propriedades) e tornam o arquivo de configuração grande e ilegivel. Permitir que eles recebam um link para outro arquivo ao invés da definição da estrutura. Assim pode-se definir cada um desses componentes em arquivos separados.1.0Rafael DiasRafael Diashttps://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/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/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)Revision