Entre las muchas grandes características introducidas en Couchbase Server 7.0Uno de ellos tiene el potencial de tener un mayor impacto en versiones posteriores: N1QL Funciones Definidas por el Usuario.

Una rápida mirada al pasado

N1QL es un lenguaje declarativo, lo que significa que las peticiones se limitan a indicar qué que necesita el usuario, sin necesidad de especificar nunca cómo la solicitud debe llevarse a cabo.

Esto ha funcionado muy bien para los lenguajes de consulta, aunque con la limitación de la falta de lógica empresarial a medida.

Las funciones definidas por el usuario cubren ese vacío.

La vista completa de UDFs en Couchbase Server 7.0 está disponible en este blog...pero para evitar saltos de un lado a otro, recordaré rápidamente algunas cosas importantes:

    • Las UDF están disponibles en varios lenguajes. En este blog nos interesa especialmente JavaScript.
    • Las FDU son de dos tipos: de clúster amplio (o global UDFs), útil cuando aún no se han adoptado las colecciones, y scope bound (o alcance UDFs), que permiten tener varias copias de la misma UDF (una por ámbito), pero cada una con una lógica potencialmente diferente.
    • N1QL no ofrece sobrecarga UDF (tener múltiples UDFs con el mismo nombre y diferente firma, cada una soportando lógica específica para su entrada), pero la misma funcionalidad puede ser alcanzada con UDFs variádicas.
    • Las UDFs de N1QL pueden generar datos dinámicos que pueden ser utilizados como fuente para las consultas N1QL.

UDF de JavaScript

    • JavaScript es un externo lo que significa que la gestión y ejecución de las librerías JavaScript se delega en una entidad distinta del servicio N1QL. Esta entidad se denomina jsevaluator.
    • La creación de funciones JavaScript es un proceso de dos pasos: en primer lugar se crea el código javascript propiamente dicho mediante la función jsevaluator y, a continuación, se crea la UDF N1QL que hace referencia a ella.
    • Una de las ventajas secundarias de que el código se mantenga externamente es que varias UDF pueden compartir la misma biblioteca y, por tanto, el mismo código, y todas se actualizan al mismo tiempo cuando cambia el código: las bibliotecas compartidas pueden ir a la par que su aplicación, a diferencia del esquema de alcance.
    • En la versión 7.0 jsevaluator sólo admite JavaScript plano.

Los bits que faltan

El jsevaluator no soporta estados globales - ya que, como hemos visto, la misma librería puede ser utilizada por múltiples peticiones concurrentemente a través del servicio de consulta: guardar y recuperar valores en variables globales llevaría a resultados inesperados.

El efecto secundario de esto es que las funciones de flecha globales no son compatibles, ya que la referencia de la función se guarda en una variable global.

Las funciones de flecha locales (las declaradas dentro de cuerpos de funciones globales) funcionan como se espera.

Un ejemplo real

Primero cree la biblioteca y la función JavaScript:

A continuación, cree la UDF N1QL:

Tenga en cuenta que es perfectamente legítimo crear primero la UDF y después la biblioteca, pero, hasta que no cree la biblioteca, ¡no podrá ejecutar la UDF!

Novedad en 7.1

Interfaz de usuario

Ya no tienes que preocuparte de extraños endpoints REST y comandos curl para manipular librerías javascript: la aplicación Consulta tiene una nueva pestaña, UDF:

New UDF page in Couchbase UI

Al pulsarlo se muestran listas de librerías JavaScript y definiciones UDF de N1QL:

Manage UDFs and JavaScript functions in UI

Hay botones para añadir y editar tanto bibliotecas JavaScript como Funciones Definidas por el Usuario N1QL.

Lo importante es tener en cuenta que se están editando o añadiendo bibliotecas, no funciones individuales: para añadir una nueva función a una biblioteca JavaScript, debe editarse toda la biblioteca y volver a enviarse con todas las funciones existentes y la nueva función (si sólo se envía la nueva función, se borrarán las funciones existentes, así que tenga cuidado).

Tenga en cuenta que, aunque existen planes para llevar la interfaz de usuario de las bibliotecas UDF JavaScript al mismo lugar donde se encuentra la interfaz de usuario de Eventing (por ejemplo, con un depurador), aún no hemos llegado a ese punto, y es probable que la interfaz de usuario cambie en consecuencia, tanto en aspecto como en ubicación.

Add JavaScript library using UI

N1QL en JavaScript

El motor JavaScript suministrado con la versión 7.0.x sólo es capaz de ejecutar JavaScript vainilla, y carece de la capacidad de ejecutar peticiones N1QL.

En 7.1.x el motor JavaScript ahora puede ejecutar múltiples sentencias N1QL y soporta tanto iteradores como transacciones.

Almacenamiento jerárquico de bibliotecas JavaScript

En 7.0 el almacén de librerías JavaScript es un repositorio plano, lo que significa que todas las librerías se encuentran al mismo nivel, y son visibles tanto para las UDFs N1QL globales como para las de ámbito.

Estas bibliotecas son compartidas.

En 7.1 se ha ampliado el almacenamiento para que sea jerárquico.

Las bibliotecas de nivel raíz siguen siendo accesibles a las UDFs N1QL tanto globales como de ámbito y compartidas como antes, y además ahora es posible tener bibliotecas definidas bajo un bucket y ámbito específicos, ya sea como implementaciones separadas de bibliotecas de nivel raíz específicas para un ámbito en particular, o como un almacenamiento privado de bibliotecas para usuarios con acceso sólo a un ámbito en particular.

 

Conclusión

Este blog te da una muestra de las funciones definidas por el usuario de JavaScript en Couchbase Server 7.1.

Exploraremos cada uno de ellos en detalle en blogs posteriores.

 

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