Entre os muitos recursos excelentes introduzidos no Couchbase Server 7.0A versão mais recente do N1QL, uma delas tem potencial para causar um impacto maior em versões posteriores: Funções definidas pelo usuário N1QL.
Uma rápida olhada no passado
N1QL é uma linguagem declarativa, o que significa que as solicitações apenas indicam o que que o usuário precisa, sem nunca precisar especificar como a solicitação deve ser executada.
Isso tem funcionado muito bem para linguagens de consulta, embora com a limitação da falta de lógica comercial personalizada.
As Funções Definidas pelo Usuário preenchem essa lacuna.
A visão completa dos UDFs no Couchbase Server 7.0 está disponível em este blogMas, para evitar ficar pulando de um lado para o outro, gostaria de lembrá-lo rapidamente de algumas coisas importantes:
-
- Os UDFs estão disponíveis em várias linguagens. Neste blog, estamos particularmente interessados em JavaScript.
- Os UDFs são oferecidos em dois tipos: em todo o cluster (ou global UDFs), útil quando você ainda não adotou as coleções, e o escopo vinculado (ou escopo UDFs), que permitem que você tenha várias cópias do mesmo UDF (uma por escopo), mas cada uma com uma lógica potencialmente diferente.
- O N1QL não oferece sobrecarga de UDF (ter várias UDFs com o mesmo nome e assinatura diferente, cada uma suportando a lógica específica de sua entrada), mas a mesma funcionalidade pode ser obtida com UDFs variadas.
- Os UDFs N1QL podem gerar dados dinâmicos que podem ser usados como fonte para consultas N1QL.
UDFs de JavaScript
-
- JavaScript é um externo o que significa que o gerenciamento e a execução das bibliotecas JavaScript são delegados a uma entidade diferente do serviço N1QL. Essa entidade é chamada de jsevaluator.
- A criação de funções JavaScript é um processo de duas etapas: primeiro, você cria o código javascript real usando a função jsevaluator e, em seguida, você cria o UDF N1QL fazendo referência a ele.
- Um dos benefícios colaterais de o código ser mantido externamente é que vários UDFs podem compartilhar a mesma biblioteca e, portanto, o mesmo código, e todos eles são atualizados ao mesmo tempo quando o código é alterado: as bibliotecas compartilhadas podem acompanhar o seu aplicativo, em vez do esquema de escopo.
- Na versão 7.0, o jsevaluator suporta apenas JavaScript simples.
As partes que faltam
O jsevaluator não oferece suporte a estados globais, pois, como vimos, a mesma biblioteca pode ser usada por várias solicitações simultaneamente no serviço de consulta: salvar e recuperar valores em variáveis globais levaria a resultados inesperados.
O efeito colateral disso é que as funções de seta globais não são compatíveis, pois a referência da função é salva em uma variável global.
As funções de seta locais (aquelas declaradas dentro de corpos de funções globais) funcionam como esperado.
Um exemplo real
Primeiro, crie a biblioteca e a função JavaScript:
1 2 3 |
enrolar -v -X POST http://localhost:8093/evaluator/v1/libraries/math \ -u Administrador:senha \ -d 'function add(a, b) { let data = a + b; return data; }' |
Em seguida, crie o UDF N1QL:
1 |
cbq> CRIAR FUNÇÃO javascriptAdd(a, b) LÍNGUA javascript AS "adicionar" AT "matemática"; |
Observe que é perfeitamente legítimo criar o UDF primeiro e a biblioteca depois, mas, até que você crie a biblioteca, não será possível executar o UDF!
Novidades na versão 7.1!
Interface do usuário
Você não precisa mais se preocupar com endpoints REST estranhos e comandos curl para manipular bibliotecas javascript: o Consulta tem uma nova guia, UDF:
Ao clicar nela, são exibidas listas de bibliotecas JavaScript e definições de UDF do N1QL:
Há botões para adicionar e editar as bibliotecas JavaScript e as Funções definidas pelo usuário N1QL.
O importante é observar que as bibliotecas estão sendo editadas ou adicionadas, não as funções individuais: para adicionar uma nova função a uma biblioteca JavaScript, a biblioteca inteira deve ser editada e reenviada com todas as funções existentes e a nova função (o envio da nova função por si só apagará as funções existentes, portanto, tenha cuidado!)
Observe que, embora haja planos de levar a interface do usuário das bibliotecas JavaScript do UDF para o mesmo local onde está a interface do usuário de eventos (por exemplo, com um depurador), ainda não chegamos lá, e a interface do usuário provavelmente mudará como resultado, tanto no aspecto quanto no local.
N1QL em JavaScript
O mecanismo JavaScript fornecido com a versão 7.0.x só é capaz de executar o JavaScript básico e não tem a capacidade de executar solicitações N1QL.
Na versão 7.1.x, o mecanismo JavaScript agora pode executar várias instruções N1QL e oferece suporte a iteradores e transações.
Armazenamento hierárquico de bibliotecas JavaScript
Na versão 7.0, o repositório de bibliotecas JavaScript é um repositório plano, o que significa que todas as bibliotecas estão no mesmo nível e são visíveis para os UDFs N1QL globais e de escopo.
Essas bibliotecas são compartilhadas.
Na versão 7.1, o armazenamento foi ampliado para ser hierárquico.
As bibliotecas de nível raiz ainda podem ser acessadas por UDFs N1QL globais e de escopo e compartilhadas como antes e, além disso, agora é possível ter bibliotecas definidas em um bucket e escopo específicos, como implementações separadas de bibliotecas de nível raiz específicas para um escopo específico ou como um armazenamento de biblioteca privada para usuários com acesso a apenas um escopo específico.
Conclusão
Este blog oferece uma amostra dos recursos das funções definidas pelo usuário JavaScript no Couchbase Server 7.1.
Exploraremos cada um deles em detalhes nos próximos blogs.
-
- Por enquanto, leia mais sobre UDFs N1QL no Couchbase