turicas / brasil.io

Backend do Brasil.IO (para código dos scripts de coleta de dados, veja o link na página de cada dataset)
https://brasil.io/
GNU General Public License v3.0
910 stars 144 forks source link

Pesquisar formato para guardar consultas #518

Open turicas opened 3 years ago

turicas commented 3 years ago

Uma das dificuldades atuais em criar novos paineis facilmente na plataforma (com gráficos a partir dos dados vindos dos datasets) reside no fato de termos que escrever as consultas manualmente e criar views específicas para serví-las. Se existisse uma forma de salvar no banco de dados os filtros/agrupamentos de uma consulta (ex: de um QuerySet do Django), seria fácil criar uma view que recuperasse essas "perguntas" salvas, fizesse a desserialização dos filtros/agrupamentos, executasse as operações no banco e então serializasse os registros resultantes em JSON. Poderíamos simplesmente adotar alguma ferramenta de BI (como o PowerBI e o QlikView), mas isso vai na contramão dos valores do projeto: não são software livre, dificultam o download dos dados por trás dos gráficos etc. Testei bastante o Metabase, mas não vi uma maneira simples de se fazer integração (o custo da integração talvez seja o mesmo ou maior de que aproveitar algo já implementado para o Django, com algumas eventuais personalizações para nossas necessidades). Creio que o ideal, para resolver esse problema de maneira mais consistente, seria adotar algum padrão de filtros/agrupamentos em datasets que pudesse ser serializável/desserializável para JSON, algo como uma DSL genérica para consultas em datasets (SQL parece ser essa DSL, mas requer um parser mais complexo que algo baseado em JSON - talvez o moz-sql-parser possa resolver). Qualquer ferramenta de BI ou análise de dados deve utilizar algum formato interno - a pergunta é: existe algum formato aberto para isso? O mais perto que cheguei de encontrar algo nesse sentido foi na padronização de filtros para query strings em APIs, como em:

O problema de todas as abordagens da lista acima é a dificuldade de trabalhar com agrupamentos em consultas em múltiplas tabelas (como um simples SELECT coluna, COUNT(*) FROM tabela GROUP BY coluna).

O Microsoft PowerBI suporta múltiplos datasets e agrupamentos "por baixo dos panos", no seu JSON verborrágico que é trafegado entre o front e o backend.

GraphQL poderia resolver, mas talvez possa adicionar complexidade desnecessária também. Hasura.io também é super interessante.

Estou pensando em algo como pegar essa consulta:

SELECT
    cnpj
FROM empresa
WHERE
    uf = "SP"
    AND municipio != "SAO PAULO"
ORDER BY cnpj;

ou mesmo esse QuerySet:

Empresa.objects.filter(uf="SP").exclude(municipio="SAO PAULO").order_by("cnpj").values_list("cnpj", flat=True)

e transformar em algo como:

{
  "select": [
    "empresa.cnpj"
  ],
  "filter": [
    [
      "empresa.uf",
      "eq",
      "SP"
    ],
    [
      "empresa.municipio",
      "neq",
      "SP"
    ]
  ],
  "order": [
    "empresa.cnpj"
  ]
}
fabriziomello commented 3 years ago

No PostgreSQL existe a libpg_query para efetuar o parser SQL corretamente: https://github.com/pganalyze/libpg_query