turicas/brasil.io

Pesquisar formato para guardar consultas

Open

#518 opened on Mar 22, 2021

View on GitHub
 (1 comment) (0 reactions) (0 assignees)Python (150 forks)github user discovery
apifrontendhelp wantedidea

Repository metrics

Stars
 (1,032 stars)
PR merge metrics
 (PR metrics pending)

Description

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"
  ]
}

Contributor guide