splor-mg / spreadmart

Data mart com dados orçamentários
0 stars 0 forks source link

Criar link table de forma declarativa usando `relationships.toml` #14

Open fjuniorr opened 9 months ago

fjuniorr commented 9 months ago

Atualmente inserir uma nova base de dados na link table demanda diversas alterações manuais no script scripts/transform.R.

Faz sentido otimizarmos essa operação focando em:

fjuniorr commented 9 months ago

Esboço inicial para a declaração da link table em um arquivo de configuração relationships.toml

[keys] 

"chave_rec" = ["ANO", "UO_COD", "FONTE_COD", "MDE"]
"chave_desp" = ["ANO", "UO_COD", "FUNCAO_COD", "ACAO_COD", "GRUPO_COD", "FONTE_COD", "IPU_COD", "MDE"]

[packages.reest]

"reest_rec" = "chave_rec"
"reest_desp" = "chave_desp"

[packages.sisor]

"base_orcam_receita_fiscal" = "chave_rec"
"base_qdd_fiscal" = "chave_desp"
"base_orcam_despesa_item_fiscal" = "chave_desp"
fjuniorr commented 7 months ago

Um snippet quase funcional em R

library(frictionless)
library(data.table)
library(relatorios)
library(spreadmart)
library(purrr)
library(glue)

create_fact_table_ <- function(resource_name, package_name, config) {
  datapackage <- read_package(glue("datapackages/{package_name}/datapackage.json"))
  resource <- read_resource(datapackage, resource_name) |> as.data.table()
  key_name <- config$packages[[package_name]][[resource_name]]
  create_fact_table(resource, config$keys[key_name])
}

create_fact_tables <- function(package_name, config) {
  map(names(config$packages[[package_name]]), create_fact_table_, package_name, config)  
}

config <- RcppTOML::parseTOML("relationships.toml")

fact_tables <- map(names(config$packages), create_fact_tables, config)

# does not work yet
link_table <- create_link_table(fact_tables, keys = config$keys)

Mas definitivamente essa funcionalidade deve fazer parte do dpm (https://github.com/splor-mg/dpm/issues/59) e portanto uma conversão para python será necessária.

fjuniorr commented 6 months ago

does not work yet

Why?? Please do tell

fjuniorr commented 6 months ago

Vai ser necessário adicionar uma etapa para geração do datapackage.json raiz após alterações em relationships.toml

frictionless describe data/*.csv --type package --json > datapackage.json 

Caso contrário o dpm load não vai ser capaz de fazer carga no banco de dados.

fjuniorr commented 3 months ago

Na reunião gerencial de 10/06 discutimos a ideia que seria interessante poder fazer uma definição de chaves com referência a chaves pré-existentes para permitir uma melhor compreensão do relacionamento entre elas. Por exemplo:

[keys] 

"chave_rec" = ["ANO", "UO_COD", "FONTE_COD", "MDE"]
"chave_rec_reest" = [chave_rec, -"MDE"] # exclusão de colunas
"chave_desp" = [chave_rec, "FUNCAO_COD", "ACAO_COD", "GRUPO_COD", "IPU_COD"] # inclusão de colunas

Vamos avaliar o quanto sentimentos falta disso em https://github.com/splor-mg/atividades/issues/126