Skip to main content

Regras de Rejeição

A rejeição de dados ocorre após o processamento de um pipeline em SQL, e está relacionada à estratégia de qualificação dos dados, evitando que sigam nas próximas etapas do fluxo de dados (data models e subscriptions) aqueles registros que não correspondam aos critérios de qualidade definidos.

Antes de começar

Defina os critérios de aceitação do dado processado em notações lógicas:

  • Formatos inválidos.
  • Valores numéricos diferentes do esperado.
  • Presença ou ausência de valor
  • Ausência de referência em outras tabelas
  • Conjunto de valores possíveis

Usos comuns

info

Para um registro ser considerado rejeitado, o pipeline deverá definir mdmDeleted = True.

Não rejeitar registros

WITH

processedData AS (
...
)

SELECT * ,

False AS mdmDeleted

FROM processedData AS dm

Rejeitar com validação do valor

WITH

processedData AS (
...
)

SELECT * ,

(
(id IS NULL)
OR
( (pago = True) AND (valor < 0) )
OR
(desconto > (valor * 0.1))

) AS mdmDeleted

FROM processedData AS dm

Rejeitar com validação de lookup

WITH

processedData AS (
...
)

SELECT * ,

(
(id IS NULL)
OR
(estado.uf IS NULL)

) AS mdmDeleted

FROM processedData AS dm
LEFT JOIN estados AS estado
ON estado.uf = dm.uf

Utilizando razões de rejeição

info

Esta seção descreve guidelines para construção de pipelines SQL que utilizem a funcionalidade de motivos de rejeição aplicados exclusivamente a cada registro processado.

Estrutura das Rejeições

Como são suportadas múltiplas validações de rejeição para um único registro, elas são representadas como um array de estruturas contendo as seguintes propriedades:

  • mdmStage: tipo de rejeição, podendo ser REJECTION_RULE ou RELATIONSHIP_CONSTRAINT.
  • mdmErrorMsg: motivo de rejeição descrito de maneira literal. Ex: O valor para data de nascimento não deve ser vazio.
  • mdmActive: valor boleano originado da validação lógica que define se aquela rejeição deve ser aplicada ao registro.

Modelo com função no pipeline

CREATE TEMP FUNCTION rejection_rules(arr ANY TYPE) AS (
(SELECT [

STRUCT("REJECTION_RULE" as mdmStage,
"O ID é nulo" as mdmErrorMsg,
(record.id IS NULL)
as mdmActive)
,
STRUCT("REJECTION_RULE" as mdmStage,
"O valor é inválido" as mdmErrorMsg,
( (record.pago = True) AND (record.valor < 0) )
as mdmActive)
,
STRUCT("RELATIONSHIP_CONSTRAINT" as mdmStage,
"A UF é inválida" as mdmErrorMsg,
(record.ref_uf IS NULL)
as mdmActive)

] FROM UNNEST(arr) AS record)
);

WITH

processedData AS (
...
)

SELECT * ,
(EXISTS(SELECT 1 FROM UNNEST(mdmErrors) WHERE mdmActive = true)) AS mdmDeleted
FROM (

SELECT dm.*,

(rejection_rules(ARRAY((SELECT AS STRUCT
dm.id,
dm.pago,
dm.valor,
estado.uf as ref_uf
)))) AS mdmErrors

FROM processedData AS dm
LEFT JOIN estados AS estado
ON estado.uf = dm.uf

)

Modelo com função externa

WITH

processedData AS (
...
)

SELECT * ,
(EXISTS(SELECT 1 FROM UNNEST(mdmErrors) WHERE mdmActive = true)) AS mdmDeleted
FROM (

SELECT dm.*,

(`project_id`.`datasetname`.`function_name`(ARRAY((SELECT AS STRUCT
dm.id,
dm.pago,
dm.valor,
estado.uf as ref_uf
)))) AS mdmErrors

FROM processedData AS dm
LEFT JOIN estados AS estado
ON estado.uf = dm.uf

)