Los fragmentos en GraphQL

Escrito por picodotdev el .
java planeta-codigo programacion
Comentarios

GraphQL

Los fragmentos en el contexto de GraphQL pueden ser de dos tipos, definidos previamente o definidos en linea. Los primeros permiten simplificar las consultas definiendo en un bloque una colección de datos a recuperar si tener que indicarlos explícitamente individualmente, lo que resulta útil para no repetir el mimo grupo de datos si se utiliza en varias consultas diferentes. Los fragmentos en línea permiten recuperar unos datos u otros en función del tipo de la instancia de la cual se quieren recuperar.

Teniendo dos consultas que recuperan los datos de una colección de libros sin los fragmentos habría que definir los mismos datos a recuperar dos veces en ambas consultas. En estas consultas de ejemplo se recupera una lista de libros y un libro determinado. Si en ambas se recuperan los datos id, title y date hay que indicar los campos a recuperar dos veces.

Con un fragmento se definen esos campos comunes a recuperar en las consultas una sola vez. Si posteriormente cambian los datos a recuperar solo es necesario cambiarlo en un único punto. Los fragmentos definidos son una forma de simplificar las consultas y evitar tener que cambiar varias consultas si el grupo de datos cambia en todas ellas. Los datos obtenidos son los mismos que en el caso sin utilizar el fragmento.

Consultas sin y con un fragmento

Los fragmentos en línea o inline permiten por otra parte una funcionalidad adicional y es recuperar diferentes datos según el tipo de la entidad. En el ejemplo he añadido una nueva entidad Magazine además de la ya existente Book, en el código Java ambas heredan de Publication. Las entidades Book y Magazine no comparten las mismas propiedades dado que son entidades diferentes por lo que en la consulta es necesario tener un mecanismo con el cual poder recuperar los datos en función del tipo.

Estas son las definiciones de las entidades resumidas y la consulta publications que devuelve las publicaciones que incluye libros y revistas. Con la definición de una union se establece que una Publication puede ser un Book o Magazine.

Para las publicaciones del tipo Book en este ejemplo se recuperan los campos id, title y date. Para las publicaciones de tipo Magazine se recuperan los campos id, name y pages. Las publicaciones Muy interesante y PC Actual son dos Magazine y el resto de publicaciones son del tipo Book.

Consulta con fragmentos en linea

Si es necesario hay que añadir la clases Java que representan a los tipos de GraphQL a la lista de clases del diccionario en la definición del esquema.

Para cada entidad hay una clase Java que la representa y un repositorio que contiene la consulta para obtener las publicaciones que no hace más que añadir en una lista el conjunto de libros y revistas en la librería.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew run. Requiere Java 9+ o Docker.