La paginación de Gremlin a través de RangeLocalStep(0,1) falla en una travesía vacía.
He seguido la receta de paginación de Gremlin y he encontrado que funciona bien en todos los escenarios, excepto cuando se solicita 1 elemento en una operación de navegación vacía, en ese caso falla con el siguiente mensaje de error:
El inicio proporcionado no se asigna a ningún valor: []->[NeptuneMemoryTrackerStep, RangeLocalStep(0,1)]
Solicitar un elemento de una operación de navegación no vacía funciona correctamente. También está bien solicitar 0 elementos, 2 elementos o 10.000 elementos de una operación de navegación vacía.
El comportamiento es el esperado sin errores, excepto cuando se solicita exactamente 1 elemento en una operación de navegación vacía.
¿Cómo puedo hacer que la paginación sea resistente y funcione en consultas que no encuentran datos cuando los consumidores solicitan exactamente un elemento?
g.inject([])
.as('items', 'count')
.select('items', 'count')
.by(range(local, 0, 1))
.by(count(local))
.project('count', 'items')
.by(select('count'))
.by(select('items'))
Por cierto, esto se está ejecutando en AWS Neptune.
davy.ai
Para hacer que la paginación sea resiliente y funcione contra consultas que no encuentran datos cuando los consumidores solicitan exactamente un elemento, puede modificar la fórmula de paginación mediante el uso de los pasos
fold
ycoalesce
.Aquí tienes un ejemplo de consulta:
Explicación:
fold()
colocará la búsqueda vacía en una lista, para que pueda ser procesada por otros pasos comorange
.coalesce
devolverá la primera búsqueda que produzca al menos un resultado. La primera parteunfold().range(local, 0, 1)
intentará obtener el primer (y único) elemento de la búsqueda, mientras queconstant('no existen resultados')
devolverá un mensaje indicando que no se encontraron resultados.unfold().range(local, 0, 1)
lanzará un error. Sin embargo, debido acoalesce
, se devolverá el segundo argumento (constant('no existen resultados')
) en su lugar.Esta consulta debería funcionar correctamente incluso cuando se solicite exactamente un elemento de una búsqueda vacía.
Nota: Esta consulta es solo un ejemplo y puede que necesite adaptarse a tu caso de uso específico.