Looplex Knowledge Base
Cache
O tube cache serve para armazenar dados visando o seu acesso mais rápido na plataforma.
Formato:
cache(<cacheConfig>, <dataReceiver>, <dataOrigin>)<dataReceiver>.cache(<cacheConfig>, <dataOrigin>)Parâmetros:
- cacheConfig: É a estrutura que armazena as configurações do tube cache. É sempre uma estrutura que deve contem fields: [key] : String,[scope] : List,[secondsToExpire] : Integer,[cacheVoid] : Boolean. Veja abaixo:
struct[CacheConfig] {    name = "CacheConfig"    fields {        +[key] : String {             name = "key"            default = "key1"        },        +[scope] : List("operand", "template", "document") {            name = "scope"            default = "operand"            atomic = true        },        +[secondsToExpire] : Integer {             name = "seconds"            default = 300        },        +[cacheVoid] : Boolean {             name = "cacheVoid"            default = false        }    }}Onde:
[key]: é o identificador que será usado pelo tube cache para o conjunto de dados que foi salvo. Assim, a informação e suas versões (alterações) recebem um identificador diferente e isso impede que hajam informações duplicadas no cache;
[scope]: determina o escopo de acesso às informações armazenadas no cache. São três possibilidades: operand para determinar que o escopo é o operando (ou mesmo variável) e permitir o acesso global às informações salvas. Note que o operand faz com que as informações possam ser acessadas mesmo de outros templates, ou seja, é salvar dados que serão globais; template determinar que o escopo é o template, permitindo o acesso às informações por todos documentos gerados pelo template em que o tube é usado e document para determinar que o escopo é apenas no documento gerado;
[secondsToExpire]: configura o tempo que as informações serão armazenadas no cache. Como o nome sugere, só é possível usar segundos e o valor máximo aceiro é de ().
[cacheVoid]: configura se permissão ou não do tube cache armazenar o valor void, ou seja, vazio/nada.
Observação: O default é usado para definir o valor com o qual o field será iniciado.
- dataReceiver: define onde essas informações serão salvas; 
- dataOrigin: define a origem dos dados que serão armazenados e é sempre uma operação, como um tube ou mesmo uma atribuição. 
Retorno:
Retorna os dados armazenados no dataReceiver, identificados pela key selecionada.
Exemplo:
1. tube cache com APIGet: nesse exemplo usamos o cache para armazenar as informações recebidas pelo APIGet. No tube APIGet usamos um web service de CEP para obtermos os dados do endereço correspondente ao CEP informado.
Na estrutura <strEndereco> acrescentamos o field [cepSemTracos] para atruibuir o CEP informado pelo usuário, para isso usamos o tube isNotEmpty para verificar se o usuário já preenchou o field [cep] e não termos a execução de um tube sem valores preenchidos e o tube replace para substituir o traço por uma string vazia. Além disso, usamos o field [cepSemTracos] no endpoint do APIGet e como key no <cacheConfig>.
Para ter a lógica completa e operacional desse exemplo recomendamos que veja o template dessa lógica aqui.
declarations {    -<cacheConfig> : Struct {        name = "CacheConfig"        fields {            +[key] : String {                 name = "key"                default = "key1"            },            +[scope] : List("operand", "document", "template") {                name = "scope"                default = "operand"                atomic = true            },            +[secondsToExpire] : Integer {                 name = "seconds"                default = 300            },            +[cacheVoid] : Boolean{                 name = "cacheVoid"                default = false            }        }    },    +<strEndereco> : Struct {        name = "Endereço"        fields {            +[cep] : String where ("\d\d\d\d\d-\d\d\d") {                name = "CEP"            },            +[logradouro] : String {                name = "Logradouro"            },             &[complemento] : String {                name = "Complemento"            },            &[bairro] : String {                name = "Bairro"            },            +[cidade] : String {                name = "Cidade"            },            -[uf] : String {                name = "UF"            },            -[cepSemTracos] : String        }        loaders {            if ([cep].isNotEmpty()) {                [cepSemTracos] = [cep],                [cepSemTracos] = [cepSemTracos].replace("-", "")            }        }    }}operations {    <cacheConfig.key> = <strEndereco.cepSemTracos>,        cache(        <cacheConfig>, // cacheConfig        <strEndereco>, // dataReceiver        APIGet(<strEndereco>, null, "https://viacep.com.br/ws/" & <strEndereco.cepSemTracos> & "/json/", "localidade:cidade, complemento:null") // dataOrigin    )           }