Ir para o conteúdo

Operadores personalizados

O Fracttal ETL estende os operadores padrão do JSON Logic com operadores próprios disponíveis no bloco transform de qualquer configuração ETL.


Renomeação e cast

rename

Mapeia campos de origem para destino, renomeando-os e opcionalmente fazendo cast do tipo.

Assinatura: ["rename", [logic, "novo_nome", "tipo?"], ...]

Cada elemento do array é uma tupla de 2 ou 3 elementos: a lógica para obter o valor, o nome do campo de saída e o tipo de cast opcional.

{
  "rename": [
    [{"var": "firstName"}, "nombre", "string"],
    [{"var": "age"}, "edad", "integer"],
    [{"var": "price"}, "precio", "number"],
    [{"var": "active"}, "activo", "boolean"],
    [{"var": "tags"}, "etiquetas", "array"]
  ]
}

Consulte Tipos de dados para a referência completa dos tipos de cast.


Texto

trim

Remove caracteres das extremidades de uma string.

Assinatura: ["trim", logic, "caracteres", "mode"]

Parâmetro Tipo Padrão Descrição
logic JSON Logic Expressão para obter a string
caracteres string Caracteres a remover
mode string "all" "all", "left" ou "right"
{"trim": [{"var": "name"}, " ", "all"]}
{"trim": [{"var": "code"}, "0", "left"]}

split

Divide uma string por um separador e retorna o elemento no índice indicado.

Assinatura: ["split", logic, "separador", indice]

{"split": [{"var": "full_name"}, " ", 0]}
{"split": [{"var": "email"}, "@", 1]}

join

Une os elementos de um array em uma string usando um separador.

Assinatura: ["join", logic, "separador"]

{"join": [{"var": "tags"}, ", "]}

substring

Extrai uma parte de uma string por índice de início e fim.

Assinatura: ["substring", logic, inicio, fim]

Índices com base 0. Se fim for 0, extrai até o final.

{"substring": [{"var": "code"}, 0, 4]}
{"substring": [{"var": "description"}, 10, 0]}

case

Converte uma string para maiúsculas ou minúsculas.

Assinatura: ["case", logic, "upper"|"lower"]

{"case": [{"var": "country"}, "upper"]}

replace

Substitui todas as ocorrências de uma substring na string.

Assinatura: ["replace", logic, "original", "substituto"]

{"replace": [{"var": "phone"}, "-", ""]}
{"replace": [{"var": "text"}, " ", "_"]}

switch

Mapeia um valor para outro usando pares valor,resultado separados por vírgula. O último elemento sem par é o valor padrão.

Assinatura: ["switch", logic, "v1,r1,v2,r2,...,default"]

{"switch": [{"var": "status"}, "A,Activo,I,Inactivo,P,Pendiente,Desconocido"]}

Com um único par e sem padrão:

{"switch": [{"var": "type"}, "premium,true,"]}


replace_if_condition

Substitui o valor somente se ele coincidir com um valor de comparação; caso contrário, retorna o valor original.

Assinatura: ["replace_if_condition", logic, "valor_comparar", "valor_substituto"]

{"replace_if_condition": [{"var": "status"}, "None", "Pendiente"]}
{"replace_if_condition": [{"var": "category"}, "null", "Sin categoría"]}

string_to_array

Divide uma string em um array usando o separador indicado.

Assinatura: ["string_to_array", logic, "separador"]

{"string_to_array": [{"var": "tags"}, ","]}

startsWith

Retorna true se a string começa com o prefixo fornecido.

Assinatura: ["startsWith", logic, "prefixo"]

{"startsWith": [{"var": "code"}, "FTL-"]}

endsWith

Retorna true se a string termina com o sufixo fornecido.

Assinatura: ["endsWith", logic, "sufixo"]

{"endsWith": [{"var": "filename"}, ".pdf"]}

Números

round

Arredonda um número para o número de casas decimais indicado. Sem decimais, arredonda para o inteiro mais próximo.

Assinatura: ["round", logic, decimais?]

{"round": [{"var": "price"}, 2]}
{"round": [{"var": "total"}, 0]}

format_number

Formata um número usando templates de formato Python ({:,}, {:.2f}, etc.).

Assinatura: ["format_number", logic, "formato_inteiro", "formato_decimal?"]

{"format_number": [{"var": "amount"}, "{:,}"]}

Com decimais:

{"format_number": [{"var": "amount"}, "{:,}", "{:.2f}"]}


Datas

format_date

Converte datas entre formatos, aplica fusos horários ou gera a data/hora atual.

Assinatura: ["format_date", logic_ou_"now", "formato_entrada", "formato_saida", "timezone?"]

Formato de saída especial Descrição
"timestamp" Unix timestamp como string
"microsoft_json_date" Formato /Date(milissegundos)/

Conversão de formato:

{"format_date": [{"var": "created_at"}, "%Y-%m-%d", "%d/%m/%Y"]}

Com fuso horário:

{"format_date": [{"var": "date"}, "%Y-%m-%dT%H:%M:%S", "%d/%m/%Y %H:%M", "America/Santiago"]}

Data e hora atual:

{"format_date": ["now", "", "%Y-%m-%dT%H:%M:%S", "Europe/Madrid"]}

Para timestamp:

{"format_date": [{"var": "date"}, "%Y-%m-%d", "timestamp"]}


add_timedelta

Soma um intervalo de tempo a uma data no formato ISO 8601 (%Y-%m-%dT%H:%M:%S.%f%z).

Assinatura: ["add_timedelta", "data_iso", numero, "tipo"]

tipo Descrição
"hour" (padrão) Horas
"day" Dias (equivale a 24 horas)
"second" Segundos
{"add_timedelta": ["2024-01-15T00:00:00.000+0000", 24, "hour"]}
{"add_timedelta": ["2024-01-15T00:00:00.000+0000", 7, "day"]}

substract_timedelta

Subtrai um intervalo de tempo de uma data no formato ISO 8601.

Assinatura: ["substract_timedelta", "data_iso", numero, "tipo"]

{"substract_timedelta": ["2024-01-15T00:00:00.000+0000", 1, "day"]}

substract_datetime

Calcula a diferença entre duas datas e a retorna em segundos.

Assinatura: ["substract_datetime", logic, "data_referencia_ou_now", "formato"]

Usando "now" como referência (data atual em UTC):

{"substract_datetime": [{"var": "start_date"}, "now", "%Y-%m-%dT%H:%M:%S%z"]}

Entre duas datas concretas:

{"substract_datetime": [{"var": "end_date"}, "2024-01-01T00:00:00+0000", "%Y-%m-%dT%H:%M:%S%z"]}


Booleanos

set_boolean

Converte um valor para true/false/null comparando-o com valores de referência.

Assinatura: ["set_boolean", logic, "valor_true", "valor_false?"]

Caso Comportamento
Sem valor_false true se coincidir com valor_true, false em qualquer outro caso
Com valor_false true, false ou null se não coincidir com nenhum
{"set_boolean": [{"var": "status"}, "active"]}

Com valor false explícito:

{"set_boolean": [{"var": "flag"}, "SI", "NO"]}


Arrays

in

Retorna true se um valor está contido no resultado da lógica.

Assinatura: ["in", "valor", logic]

{"in": ["admin", {"var": "roles"}]}

flatmap

Achata um array de objetos adicionando campos do contexto pai a cada elemento.

Assinatura: ["flatmap", logic_array, context_fields?]

context_fields é uma lista de especificações de campos do objeto pai a injetar em cada item:

{
  "flatmap": [
    {"var": "items"},
    [
      {"field": {"var": "order_id"}, "as": "order_id"},
      {"field": {"var": "customer_name"}, "as": "customer"}
    ]
  ]
}

Sem campos de contexto (apenas achata o array):

{"flatmap": [{"var": "lines"}]}


Exemplo completo

Transformação de um pedido: renomeação, formato de data, cálculo de diferença e cast de tipo.

{
  "merge": [
    {
      "rename": [
        [{"var": "orderId"}, "id_pedido", "string"],
        [{"var": "totalAmount"}, "total", "number"],
        [{"var": "customerName"}, "cliente", "string"]
      ]
    },
    {
      "fecha_creacion": {
        "format_date": [{"var": "createdAt"}, "%Y-%m-%dT%H:%M:%S", "%d/%m/%Y", "America/Bogota"]
      }
    },
    {
      "estado": {
        "switch": [{"var": "status"}, "pending,Pendiente,confirmed,Confirmado,cancelled,Cancelado,Desconocido"]
      }
    },
    {
      "nombre_cliente": {
        "trim": [{"var": "customerName"}, " ", "all"]
      }
    }
  ]
}

Referências