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
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
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
)