Em blogs anteriores, abordamos a execução do N1QL (SQL++) a partir do JavaScript funções, processamento de documentos por meio de iteradores, manipulação de dados, tratamento de erros, declarações preparadas e outros tópicos avançados. O último tópico a ser abordado é um recurso recém-adicionado à versão 7.1 que permite opções de armazenamento de bibliotecas JavaScript.
Armazenamento hierárquico de bibliotecas JavaScript
Outra grande mudança na versão 7.1 é o fato de o armazenamento da biblioteca JavaScript ter mudado de plano para hierárquico.
Isso significa que, além das bibliotecas globais, agora você pode ter bibliotecas criadas em um bucket e um escopo.
As bibliotecas globais estão disponíveis para uso como UDFs globais e de escopo, enquanto as bibliotecas de escopo só estão disponíveis para uso em UDFs de escopo criados no mesmo escopo da biblioteca.
Isso significa que, ao usar bibliotecas globais, você pode continuar a tratar as bibliotecas como uma extensão do seu aplicativo e, ao publicar uma nova biblioteca, você altera automaticamente todas as suas instâncias em diferentes compartimentos e escopos, se você só tiver recebido o manage_external_scope_functions e quiser criar bibliotecas para seu próprio uso, você pode.
Ou talvez, como desenvolvedor de aplicativos, você queira criar implementações específicas de escopo de determinadas bibliotecas globais, por exemplo, uma instância local com o novo código que você está implementando para a próxima versão do seu aplicativo.
Manipulação de bibliotecas
O jsevaluator O endpoint REST usado para manipular as bibliotecas mostradas no início deste blog foi ampliado para aceitar buckets e escopo.
Isso é feito da seguinte forma:
Biblioteca global
|
1 |
enrolar -v -X POST http://localhost:8093/avaliador/v1/bibliotecas/matemática -u Administrador:senha -d 'function add(a, b) { let data = a + b; return data; }' |
Biblioteca de escopo
|
1 |
enrolar -v -X POST 'http://localhost:8093/evaluator/v1/libraries/math?bucket=b1&scope=s1' -u Administrador:senha -d 'function add(a, b) { let data = a + b; return data; }' |
É evidente que o usuário autenticado precisa ter os privilégios adequados para criar bibliotecas em cada nível: manage_external_functions para bibliotecas globais e manage_external_scope_functions para bibliotecas de escopo.
Além disso, o bucket e o escopo referenciados já devem existir.
Para não me repetir, o comando curl deve conter toda a biblioteca, e não apenas qualquer nova função que você queira definir: lembre-se de que qualquer alteração que você fizer será refletida em todos os UDFs que usam a biblioteca, e qualquer função que você descartar por engano poderá afetar vários escopos e UDFs, portanto, tenha cuidado.
Para evitar dúvidas, isso também se aplica à interface do usuário.
Referência a bibliotecas em UDFs
Todos os exemplos de CRIAR FUNÇÃO vistos até agora usam um identificador de string simples para a biblioteca, o que significa que eles usam uma biblioteca global.
CRIAR FUNÇÃO ... LINGUAGEM JAVASCRIPT suporta os três formatos a seguir para nomes de bibliotecas:
-
- Um identificador, por exemplo, “biblioteca“: isso aponta para uma biblioteca global
- O ./ notação, por exemplo, “./biblioteca“: isso significa que uma biblioteca sob o atual contexto_de_consulta, uma biblioteca global para uma função global e a biblioteca de escopo correspondente para uma função de escopo
- Um caminho de escopo completo, por exemplo, “bucket/scope/biblioteca“Funções de escopo podem apontar para bibliotecas de escopo, mas lembre-se de que a polinização entre escopos não é permitida - as funções de escopo só podem apontar para bibliotecas em seu próprio escopo.
Qualquer outro formato de nome de biblioteca não é permitido.
Dicas e truques para cachos
Alteração de bibliotecas
Ao alterar as bibliotecas usando a API REST, por exemplo, para adicionar uma nova função, lembre-se de que é necessário enviar toda a biblioteca novamente: se você passar apenas o texto da nova função, todas as funções anteriores serão apagadas!
Opções e switches de linha de comando úteis
A ondulação -data-binary A opção de linha de comando instrui o curl a não descartar novas linhas e retornos de carro.
Isso é útil porque, se sua função retornar um erro, a mensagem de erro conterá as informações de linha corretas para o erro, em vez de usar -d ou -dados fará com que os erros sejam sempre relatados como tendo ocorrido na linha 1!
Por exemplo:
|
1 2 3 4 |
enrolar -v -X POST http://localhost:8093/avaliador/v1/bibliotecas/matemática -u Administrador:senha -dados-binário 'função adicionar(a, b) { deixar dados = a + b; retorno dados; }' |
Outro recurso útil é salvar o conteúdo de uma biblioteca em um arquivo e, em seguida, fazer referência ao arquivo na função -data-binary (ou -d), prefixando com um argumento "@", por exemplo:
|
1 |
enrolar -v -X POST http://localhost:8093/avaliador/v1/bibliotecas/matemática -u Administrador:senha -dados-binário '@caminho/para/arquivo' |
Onde sua biblioteca seria salva em path/to/file.
Conclusão
Esta breve postagem mostra como essas novas opções de armazenamento oferecem flexibilidade na maneira de gerenciar hierarquicamente o código que você cria e implanta.
Uma última atualização para você: embora existam referências baseadas em código para o termo N1QL Nesta série, nos referimos à linguagem de consulta como SQL++ - uma extensão do padrão SQL. As consultas no Couchbase geralmente são baseadas em SQL++, permitindo que você aproveite seu conhecimento de consulta SQL padrão, mas aplique-o a documentos JSON e muito mais. Daqui para frente, você provavelmente poderá trocar o termo N1QL para SQL++ e você estará atualizado.
Obrigado por acompanhar esta série de tópicos sobre N1QL e JavaScript. Uma lista resumida dos tópicos está incluída abaixo para sua referência.
Recursos
-
- SQL++ - A linguagem de consulta de última geração para gerenciar dados JSON
- Série SQL++/N1QL para JavaScript e vice-versa:
- SQL++ funções
- Processamento de documentos por meio de iteradores
- Manipulação de dados
- Tratamento de erros
- Declarações preparadas
- e outros tópicos avançados
- Este post, armazenamento hierárquico de biblioteca JavaScript