En blogs anteriores, cubrimos la ejecución de N1QL (SQL++) desde JavaScript funcionesTramitación de documentos a través de iteradoresmanipular datos, gestión de errores, declaraciones preparadas y otros temas avanzados. El último tema a tratar es una nueva característica añadida a 7.1 que permite opciones de almacenamiento de bibliotecas JavaScript.

Almacenamiento jerárquico de bibliotecas JavaScript

Otro cambio importante en 7.1 es que el almacenamiento de la biblioteca JavaScript ha pasado de ser plano a jerárquico.

Esto significa que, junto a las bibliotecas globales, ahora puedes tener bibliotecas creadas bajo un bucket y un scope.

Las bibliotecas globales están disponibles para su uso como UDF globales y de ámbito, mientras que las bibliotecas de ámbito sólo están disponibles para su uso para UDF de ámbito creadas bajo el mismo ámbito que la biblioteca.

Esto significa que mientras que, al utilizar bibliotecas globales, puede seguir tratando las bibliotecas como una extensión de su aplicación, y al publicar una nueva biblioteca modifica automáticamente todas sus instancias en distintos buckets y ámbitos, si sólo se le ha concedido la licencia gestionar_funciones_de_alcance_externo y quieres crear bibliotecas para tu propio uso, puedes hacerlo.

O puede que, como desarrollador de aplicaciones, quieras crear implementaciones específicas de ciertas bibliotecas globales, por ejemplo, una instancia local con código nuevo que estás implementando para la próxima versión de tu aplicación.

Manipulación de bibliotecas

En jsevaluator El punto final REST utilizado para manipular las bibliotecas mostradas al principio de este blog se ha ampliado para aceptar buckets y scope.

Esto se hace así:

Biblioteca mundial

Biblioteca

Es evidente que el usuario autenticado debe tener los privilegios adecuados para crear bibliotecas en cada nivel: gestionar_funciones_externas para bibliotecas mundiales y gestionar_funciones_de_alcance_externo para las bibliotecas de ámbito.

Además, el cubo y el ámbito referenciados ya deben existir.

A costa de repetirme, el comando curl debe contener toda la biblioteca, no sólo cualquier nueva función que desee definir: recuerde que cualquier cambio que realice se reflejará en todas las UDFs que utilicen la biblioteca, y cualquier función que pueda soltar por error afectará potencialmente a múltiples ámbitos y UDFs, así que tenga cuidado.

Para evitar dudas, esto también se aplica a la interfaz de usuario. 

Referencias a bibliotecas en UDFs

Todos los ejemplos de CREAR FUNCIÓN vistos hasta ahora utilizan un simple identificador de cadena para la biblioteca, lo que significa que utilizan una biblioteca global.

CREAR FUNCIÓN ... LENGUAJE JAVASCRIPT admite los tres formatos siguientes para los nombres de las bibliotecas:

    • Un identificador, por ejemplo bibliotecaesto apunta a una biblioteca global
    • En ./ notación, por ejemplo, ./biblioteca: esto significa que una biblioteca bajo la actual contexto_de_consultauna biblioteca global para una función global y la biblioteca de ámbito correspondiente para una función de ámbito
    • Una ruta de alcance total, por ejemplo bucket/scope/bibliotecaFunciones de ámbito: las funciones de ámbito pueden apuntar a bibliotecas de ámbito, pero tenga en cuenta que la polinización entre ámbitos no está permitida - las funciones de ámbito sólo pueden apuntar a bibliotecas de su propio ámbito.

Cualquier otro formato de nombre de biblioteca no está permitido.

Consejos y trucos para rizos

Modificación de bibliotecas

Cuando modifique bibliotecas utilizando la API REST, por ejemplo para añadir una nueva función, tenga en cuenta que tiene que enviar de nuevo toda la biblioteca: si sólo pasa el texto de la nueva función, ¡todas las funciones anteriores quedarán borradas!

Opciones y conmutadores de línea de comandos útiles

El rizo -datos-binario indica a curl que no descarte las nuevas líneas ni los retornos de carro.

Esto es útil ya que, si su función devuelve un error, el mensaje de error contendrá la información de línea correcta para el error, frente al uso de -d o -datos hará que los errores se notifiquen siempre en la línea 1.

A modo de ejemplo:

Otra función útil es guardar el contenido de una biblioteca en un archivo y, a continuación, hacer referencia al archivo en la función -datos-binario (o -d), anteponiendo el prefijo "@", por ejemplo:

Donde su biblioteca se guardaría en path/to/file.

Conclusión

Este breve post muestra cómo estas nuevas opciones de almacenamiento te dan flexibilidad en la forma de gestionar jerárquicamente el código que construyes y despliegas.

Una actualización final para usted, mientras que hay referencias basadas en código para el término N1QL en esta serie, nos referiremos al lenguaje de consulta como SQL - una extensión del estándar SQL. Las consultas en Couchbase están generalmente basadas en SQL++, permitiéndote construir sobre tu conocimiento estándar de consultas SQL pero aplicándolo a documentos JSON y más. En el futuro, es probable que puedas cambiar el término N1QL para SQL y estarás al día.

Gracias por seguir a lo largo de esta serie de temas N1QL y JavaScript, una lista resumida de los temas se incluye a continuación para su referencia.

Recursos

Autor

Publicado por Marco Greco, Arquitecto de software, Couchbase

En su vida anterior, Marco fue director de tecnología, radiofísico, arquitecto de software, administrador de sistemas, administrador de bases de datos, formador y manitas en general en la mayor clínica de radioterapia de Italia. Tras cambiar de carrera y de país, pasó más de dos décadas en varios puestos de soporte y desarrollo en Informix primero e IBM después, antes de finalmente dar el paso y unirse a Couchbase, para ayudarles a convertir N1QL en oro. Es titular de varias patentes y autor de sus propios proyectos de código abierto.

Dejar una respuesta