From f7959651bbf01cca43d8f4d7f222b607d69a4ae7 Mon Sep 17 00:00:00 2001 From: bcbernardo Date: Wed, 14 Sep 2022 17:38:13 -0300 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20:sparkles:=20Adiciona=20macro=20pra?= =?UTF-8?q?=20filtrar=20iter=C3=A1veis=20por=20express=C3=A3o=20regular?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- macros/utilidades/filtrar_regex.sql | 18 +++++++++++++++++ macros/utilidades/filtrar_regex.yml | 31 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 macros/utilidades/filtrar_regex.sql create mode 100644 macros/utilidades/filtrar_regex.yml diff --git a/macros/utilidades/filtrar_regex.sql b/macros/utilidades/filtrar_regex.sql new file mode 100644 index 0000000..8a87620 --- /dev/null +++ b/macros/utilidades/filtrar_regex.sql @@ -0,0 +1,18 @@ +{# +SPDX-FileCopyrightText: 2022 ImpulsoGov + +SPDX-License-Identifier: MIT +#} + + + +{%- macro filtrar_regex(iteravel, expressao_regular) -%} +{% set re = modules.re %} +{% set filtrado = [] %} +{%- for texto in iteravel -%} +{%- if re.match(expressao_regular, texto) -%} +{%- set _ = filtrado.append(texto) -%} +{%- endif -%} +{%- endfor -%} +{{- return(filtrado) -}} +{%- endmacro -%} \ No newline at end of file diff --git a/macros/utilidades/filtrar_regex.yml b/macros/utilidades/filtrar_regex.yml new file mode 100644 index 0000000..dd52e5d --- /dev/null +++ b/macros/utilidades/filtrar_regex.yml @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: 2022 Impulso Gov +# +# SPDX-License-Identifier: MIT + + +version: 2 + +macros: + + - name: filtrar_regex + description: > + A partir de um iterável e um padrão de expressão regular, retorna uma + lista apenas com os elementos que correspondem ao padrão. + + docs: + show: true + + arguments: + - name: iteravel + type: Iterable[str] + description: > + Lista ou outro iterável cujos elementos sejam todos textos a serem + comparados com um padrão de expressão regular. + + - name: expressao_regular + type: str + description: > + Texto com padrão de + [expressão regular](https://docs.python.org/3/library/re.html) + nativo do Python, que será comparado com os elementos do iterável de + entrada e filtrar os que devem aparecer na lista de saída. From ae6655837e86de2e3b564caa6dcd827ddd463556 Mon Sep 17 00:00:00 2001 From: bcbernardo Date: Wed, 14 Sep 2022 17:41:21 -0300 Subject: [PATCH 2/3] refactor: :recycle: Altera macros para admitir diferentes nomes de colunas com categorias MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Permite que qualquer coluna com códigos das categorias `sexo`, `raca_cor` e `estabelecimento` e um sufixo `_id_*` seja automaticamente substituída pelo nome legível da categoria. --- macros/utilidades/nomear_estabelecimentos.sql | 22 +++-- macros/utilidades/nomear_racas_cores.sql | 20 +++-- macros/utilidades/nomear_sexos.sql | 17 ++-- macros/utilidades/preparar_uso_externo.sql | 88 ++++++++++++------- 4 files changed, 98 insertions(+), 49 deletions(-) diff --git a/macros/utilidades/nomear_estabelecimentos.sql b/macros/utilidades/nomear_estabelecimentos.sql index 1293c3a..4903bfc 100644 --- a/macros/utilidades/nomear_estabelecimentos.sql +++ b/macros/utilidades/nomear_estabelecimentos.sql @@ -13,6 +13,15 @@ SPDX-License-Identifier: MIT todos_estabelecimentos_valor="Todos", cte_resultado="com_nomes_estabelecimentos" ) %} +{%- set re = modules.re -%} +{%- set lista_de_codigos_colunas = adapter.get_columns_in_relation( + source("codigos", "estabelecimentos") +) -%} +{%- set lista_de_codigos_coluna_id = "estabelecimento" + re.match( + ".*estabelecimento.*(_id.*)", + coluna_estabelecimento_id + ).groups(1)[0] + -%} {{ cte_resultado }} AS ( SELECT t.*, @@ -20,7 +29,8 @@ SELECT ( CASE WHEN - {{ coluna_estabelecimento_id }} = '{{ todos_estabelecimentos_id }}' + t.{{ coluna_estabelecimento_id }} + = '{{ todos_estabelecimentos_id }}' THEN '{{ todos_estabelecimentos_valor }}' ELSE {%- endif %} coalesce( @@ -29,18 +39,18 @@ SELECT ) {%- if todos_sexos_id is not none -%} END - ){%- endif %} AS {{ coluna_estabelecimento_nome}} + ){%- endif %} AS {{ coluna_estabelecimento_nome }} FROM {{ relacao }} t LEFT JOIN ( SELECT - {%- for coluna in adapter.get_columns_in_relation( - source("codigos", "estabelecimentos") - ) %} + {%- for coluna in lista_de_codigos_colunas %} {{coluna.quoted}} AS "estabelecimento_{{coluna.name}}" {{- "," if not loop.last }} {%- endfor %} FROM {{ source("codigos", "estabelecimentos") }} ) estabelecimento -USING ({{ coluna_estabelecimento_id }}) +ON + t.{{ coluna_estabelecimento_id }} + = estabelecimento.{{ lista_de_codigos_coluna_id }} ) {%- endmacro -%} diff --git a/macros/utilidades/nomear_racas_cores.sql b/macros/utilidades/nomear_racas_cores.sql index 428d1ba..8c3d6c6 100644 --- a/macros/utilidades/nomear_racas_cores.sql +++ b/macros/utilidades/nomear_racas_cores.sql @@ -13,6 +13,14 @@ SPDX-License-Identifier: MIT todos_raca_cor_valor="Todos", cte_resultado="com_nomes_racas_cores" ) %} +{%- set re = modules.re -%} +{%- set lista_de_codigos_colunas = adapter.get_columns_in_relation( + source("codigos", "racas_cores") +) -%} +{%- set lista_de_codigos_coluna_id = ( + "raca_cor" + + re.match(".*raca_cor.*(_id.*)", coluna_raca_cor_id).groups(1)[0] +) -%} {{ cte_resultado }} AS ( SELECT t.*, @@ -20,24 +28,22 @@ SELECT ( CASE WHEN - {{ coluna_raca_cor_id }} = '{{ todos_racas_cores_id }}' - THEN '{{ todos_racas_cores_valor }}' + t.{{ coluna_raca_cor_id }} = '{{ todas_racas_cores_id }}' + THEN '{{ todas_racas_cores_valor }}' ELSE {%- endif %} raca_cor.raca_cor_nome {%- if todos_racas_cores_id is not none -%} END - ){%- endif %} AS {{ coluna_raca_cor_nome}} + ){%- endif %} AS {{ coluna_raca_cor_nome }} FROM {{ relacao }} t LEFT JOIN ( SELECT - {%- for coluna in adapter.get_columns_in_relation( - source("codigos", "racas_cores") - ) %} + {%- for coluna in lista_de_codigos_colunas %} {{coluna.quoted}} AS "raca_cor_{{coluna.name}}" {{- "," if not loop.last }} {%- endfor %} FROM {{ source("codigos", "racas_cores") }} ) raca_cor -USING ({{ coluna_raca_cor_id }}) +ON t.{{ coluna_raca_cor_id }} = raca_cor.{{ lista_de_codigos_coluna_id }} ) {%- endmacro -%} diff --git a/macros/utilidades/nomear_sexos.sql b/macros/utilidades/nomear_sexos.sql index 35bc14c..449be24 100644 --- a/macros/utilidades/nomear_sexos.sql +++ b/macros/utilidades/nomear_sexos.sql @@ -13,6 +13,13 @@ SPDX-License-Identifier: MIT todos_sexos_valor="Todos", cte_resultado="com_nomes_sexos" ) %} +{%- set re = modules.re -%} +{%- set lista_de_codigos_colunas = adapter.get_columns_in_relation( + source("codigos", "sexos") +) -%} +{%- set lista_de_codigos_coluna_id = ( + "sexo" + re.match(".*sexo.*(_id.*)", coluna_sexo_id).groups(1)[0] +) -%} {{ cte_resultado }} AS ( SELECT t.*, @@ -20,24 +27,22 @@ SELECT ( CASE WHEN - {{ coluna_sexo_id }} = '{{ todos_sexos_id }}' + t.{{ coluna_sexo_id }} = '{{ todos_sexos_id }}' THEN '{{ todos_sexos_valor }}' ELSE {%- endif %} sexo.sexo_nome {%- if todos_sexos_id is not none -%} END - ){%- endif %} AS {{ coluna_sexo_nome}} + ){%- endif %} AS {{ coluna_sexo_nome }} FROM {{ relacao }} t LEFT JOIN ( SELECT - {%- for coluna in adapter.get_columns_in_relation( - source("codigos", "sexos") - ) %} + {%- for coluna in lista_de_codigos_colunas %} {{coluna.quoted}} AS "sexo_{{coluna.name}}" {{- "," if not loop.last }} {%- endfor %} FROM {{ source("codigos", "sexos") }} ) sexo -USING ({{ coluna_sexo_id }}) +ON t.{{ coluna_sexo_id }} = sexo.{{ lista_de_codigos_coluna_id }} ) {%- endmacro -%} diff --git a/macros/utilidades/preparar_uso_externo.sql b/macros/utilidades/preparar_uso_externo.sql index c0d16ac..1fa89c0 100644 --- a/macros/utilidades/preparar_uso_externo.sql +++ b/macros/utilidades/preparar_uso_externo.sql @@ -21,64 +21,92 @@ SPDX-License-Identifier: MIT ], cte_resultado="final" ) %} -{% set re = modules.re %} +{%- set re = modules.re -%} {%- set colunas = [] -%} {%- for coluna in adapter.get_columns_in_relation(ref(relacao)) -%} {%- set _ = colunas.append(coluna.name) -%} {%- endfor -%} -{%- set ultima_cte = ref(relacao) -%} -{%- if "sexo_id_sigtap" in colunas %} +{%- set ctes = [ref(relacao)] -%} +{#- Trocar códigos de categorias de sexo por nomes legíveis -#} +{%- set colunas_sexo_ids = filtrar_regex(colunas, ".*sexo.*_id.*") -%} +{%- for coluna_sexo_id in colunas_sexo_ids %} +{%- set coluna_sexo_nome=( + re.match("(.*sexo.*)_id.*", coluna_sexo_id).groups(1)[0] +) -%} +{%- set cte = "com_nomes_sexos_" + loop.index|string -%} {{ nomear_sexos( - relacao=ultima_cte, - coluna_sexo_nome="sexo", + relacao=ctes|last, + coluna_sexo_nome=coluna_sexo_nome, + coluna_sexo_id=coluna_sexo_id, todos_sexos_id=none, - cte_resultado="com_nomes_sexos" + cte_resultado=cte ) }}, -{%- set ultima_cte = "com_nomes_sexos" -%} -{%- endif %} -{%- if "raca_cor_id_sigtap" in colunas %} +{%- set _ = colunas.append(coluna_sexo_nome) -%} +{%- set _ = ctes.append(cte) -%} +{%- endfor %} +{#- Trocar códigos de categorias de raça/cor por nomes legíveis -#} +{%- set colunas_raca_cor_ids = filtrar_regex(colunas, ".*raca_cor.*_id.*") -%} +{%- for coluna_raca_cor_id in colunas_raca_cor_ids %} +{%- set coluna_raca_cor_nome=( + re.match("(.*raca_cor.*)_id.*", coluna_raca_cor_id).groups(1)[0] +) -%} +{%- set cte = "com_nomes_racas_cores_" + loop.index|string -%} {{ nomear_racas_cores( - relacao=ultima_cte, - coluna_raca_cor_nome="raca_cor", - todos_racas_cores_id=none, - cte_resultado="com_nomes_racas_cores" + relacao=ctes|last, + coluna_raca_cor_nome=coluna_raca_cor_nome, + coluna_raca_cor_id=coluna_raca_cor_id, + todas_racas_cores_id=none, + cte_resultado=cte ) }}, -{%- set ultima_cte = "com_nomes_racas_cores" -%} -{%- endif %} -{%- if "estabelecimento_id_scnes" in colunas %} +{%- set _ = colunas.append(coluna_raca_cor_nome) -%} +{%- set _ = ctes.append(cte) -%} +{%- endfor %} +{#- Trocar códigos de estabelecimentos por nomes legíveis -#} +{%- set colunas_estabelecimento_ids = filtrar_regex( + colunas, + ".*estabelecimento.*_id.*", +) -%} +{%- for coluna_estabelecimento_id in colunas_estabelecimento_ids -%} +{%- set coluna_estabelecimento_nome=( + re.match("(.*estabelecimento.*)_id.*", coluna_estabelecimento_id) + .groups(1)[0] +) -%} +{%- set cte = "com_linhas_estabelecimentos_" + loop.index|string -%} {{ classificar_caps_linha( - relacao=ultima_cte, + relacao=ctes|last, + coluna_estabelecimento_id=coluna_estabelecimento_id, coluna_linha_perfil="estabelecimento_linha_perfil", coluna_linha_idade="estabelecimento_linha_idade", - cte_resultado="com_linhas_cuidado" + cte_resultado=cte ) }}, +{%- set _ = ctes.append(cte) -%} {%- set _ = colunas.append("estabelecimento_linha_perfil") -%} {%- set _ = colunas.append("estabelecimento_linha_idade") -%} -{%- set ultima_cte = "com_linhas_cuidado" -%} -{%- endif %} -{%- if "estabelecimento_id_scnes" in colunas %} +{%- set cte = "com_nomes_estabelecimentos_" + loop.index|string -%} {{ nomear_estabelecimentos( - relacao=ultima_cte, - coluna_estabelecimento_nome="estabelecimento", - cte_resultado="com_nomes_estabelecimentos" + relacao=ctes|last, + coluna_estabelecimento_id=coluna_estabelecimento_id, + coluna_estabelecimento_nome=coluna_estabelecimento_nome, + cte_resultado=cte ) }}, {%- set _ = colunas.append("estabelecimento") -%} -{%- set ultima_cte = "com_nomes_estabelecimentos" -%} -{%- endif %} +{%- set _ = ctes.append(cte) -%} +{%- endfor %} {%- if ( "periodo_data_inicio" in colunas ) and ( "unidade_geografica_id" in colunas ) %} +{%- set cte = "com_datas_legiveis" -%} {{ adicionar_datas_legiveis( - relacao=ultima_cte, - cte_resultado="com_datas_legiveis" + relacao=ctes|last, + cte_resultado=cte ) }}, {%- set _ = colunas.append("periodo") -%} {%- set _ = colunas.append("nome_mes") -%} {%- set _ = colunas.append("periodo_ordem") -%} -{%- set ultima_cte = "com_datas_legiveis" -%} +{%- set _ = ctes.append(cte) -%} {%- endif %} {{ cte_resultado }} AS ( SELECT @@ -99,6 +127,6 @@ SPDX-License-Identifier: MIT {%- endif %} {%- endif %} {%- endfor %} - FROM {{ ultima_cte }} + FROM {{ ctes|last }} ) {%- endmacro -%} From 051686a0029d1324844d5a766e3b13fed596ec26 Mon Sep 17 00:00:00 2001 From: bcbernardo Date: Wed, 14 Sep 2022 17:42:51 -0300 Subject: [PATCH 3/3] fix(caps): :bug: Ajusta nomes de coluna e CTE --- .../_caps_usuarios_ativos_por_estabelecimento_resumo.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/caps/usuarios_ativos/_caps_usuarios_ativos_por_estabelecimento_resumo.sql b/models/caps/usuarios_ativos/_caps_usuarios_ativos_por_estabelecimento_resumo.sql index 1d2bafc..9ff021a 100644 --- a/models/caps/usuarios_ativos/_caps_usuarios_ativos_por_estabelecimento_resumo.sql +++ b/models/caps/usuarios_ativos/_caps_usuarios_ativos_por_estabelecimento_resumo.sql @@ -125,7 +125,7 @@ resumo AS ( ( tornandose_inativos - tornandose_inativos_anterior ) AS dif_tornandose_inativos_anterior, - sexo_predominante.sexo_predominante_id_sigtap AS sexo_id_sigtap, + sexo_predominante.sexo_predominante_id_sigtap, sexo_predominante.sexo_predominante_quantidade, idade_media.usuarios_idade_media, now() AS atualizacao_data @@ -148,7 +148,7 @@ resumo AS ( ) ), {{ ultimas_competencias( - relacao="final", + relacao="resumo", fontes=[ "raas_psicossocial_disseminacao", "bpa_i_disseminacao"